MySQL【进阶篇】06:MySQL数据迁移【从A机房迁移到B机房】
MySQL数据迁移【从A机房迁移到B机房】
一、迁移流程介绍
1、MySQL迁移流程
二、MySQL迁移前准备
1、环境准备
将A机房的主从迁移到B机房
(1)环境信息
A机房:
192.168.201.161 主
192.168.201.162 从
B机房:
192.168.201.163 主
192.168.201.164 从
(2)环境搭建
首先在A机房搭建主从环境:
基于GTID主从复制的自动部署
(3)写入数据
在A环境写入测试数据,在161节点执行:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `online`;
USE `online`;
-- 创建产品表
CREATE TABLE IF NOT EXISTS `product` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
`stock` INT UNSIGNED DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建用户表
CREATE TABLE IF NOT EXISTS `user` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) UNIQUE NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建订单表(使用反引号包裹保留字)
CREATE TABLE IF NOT EXISTS `order` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` INT UNSIGNED NOT NULL,
`product_id` INT UNSIGNED NOT NULL,
`quantity` INT UNSIGNED NOT NULL,
`order_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
FOREIGN KEY (`product_id`) REFERENCES `product`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入产品数据
INSERT INTO `product` (`name`, `price`, `stock`) VALUES
('Laptop', 999.99, 50),
('Smartphone', 599.50, 100),
('Headphones', 89.99, 200),
('Keyboard', 45.75, 150),
('Mouse', 25.00, 300),
('Monitor', 199.99, 75),
('Tablet', 299.95, 60),
('Printer', 150.00, 40),
('Router', 79.99, 120),
('Speaker', 120.00, 90);
-- 插入用户数据
INSERT INTO `user` (`username`, `email`) VALUES
('john_doe', 'john@example.com'),
('jane_smith', 'jane@example.com'),
('mike_jones', 'mike@example.com'),
('sara_wilson', 'sara@example.com'),
('alex_brown', 'alex@example.com'),
('emily_davis', 'emily@example.com'),
('david_miller', 'david@example.com'),
('lisa_taylor', 'lisa@example.com'),
('peter_clark', 'peter@example.com'),
('anna_white', 'anna@example.com');
-- 插入订单数据
INSERT INTO `order` (`user_id`, `product_id`, `quantity`) VALUES
(1, 2, 1),
(2, 1, 2),
(3, 3, 3),
(4, 5, 1),
(5, 4, 2),
(6, 6, 1),
(7, 7, 1),
(8, 8, 1),
(9, 9, 2),
(10, 10, 1);
2、B机房安装mysql
(1)将A机房的配置文件拷贝到B机房
161节点–>163节点
162节点–>164节点
161节点执行
scp /data/mysql/conf/my.cnf 192.168.184.163:/tmp
162节点执行
scp /data/mysql/conf/my.cnf 192.168.184.164:/tmp
(2)修改配置文件的server-id
一般修改为网段的后两位
163节点执行
cd /tmp
vim my.cnf
164节点执行
cd /tmp
vim my.cnf
(3)B机房安装mysql
在163、164节点安装单机的mysql,注意,版本要一致,可参考:
使用脚本自动安装MySQL8.0.25
注意!!! 这里的配置文件使用/tmp目录下的,就是上一步传输过来的配置文件。
163节点执行
cd /tmp/
mv my.cnf /data/script/install_mysql8/
164节点执行
cd /tmp/
mv my.cnf /data/script/install_mysql8/
3、拷贝A机房数据到B机房
(1)A机房数据进行全备
在161节点使用xtraback进行全备:
mkdir -p /data/backup
cd /data/backup
xtrabackup --defaults-file=/data/mysql/conf/my.cnf -uroot -p'admin' --backup --stream=xbstream --target-dir=./ > /data/backup/xtrabackup.xbstream
xtraback安装可参考:MySQL的备份和恢复
(2)将A机房数据拷贝到B机房
在B机房163、164创建恢复目录
163节点执行
mkdir -p /data/backup/recover
164节点执行
mkdir -p /data/backup/recover
在161节点拷贝数据到163、164节点
cd /data/backup
scp xtrabackup.xbstream 192.168.184.163:/data/backup/recover
scp xtrabackup.xbstream 192.168.184.164:/data/backup/recover
4、把全备导入到B机房
(1)清空B机房的数据库
163节点执行
/etc/init.d/mysql.server stop
rm -rf /data/mysql/data/*
rm -rf /data/mysql/binlog/*
164节点执行
/etc/init.d/mysql.server stop
rm -rf /data/mysql/data/*
rm -rf /data/mysql/binlog/*
(2)全备导入到B机房
xtraback安装可参考:MySQL的备份和恢复
163节点执行
cd /data/backup/recover
xbstream -x < xtrabackup.xbstream
xtrabackup --prepare --target-dir=./
xtrabackup --defaults-file=/data/mysql/conf/my.cnf --copy-back --target-dir=./
164节点执行
cd /data/backup/recover
xbstream -x < xtrabackup.xbstream
xtrabackup --prepare --target-dir=./
xtrabackup --defaults-file=/data/mysql/conf/my.cnf --copy-back --target-dir=./
(3)重启B机房的MySQL
163节点执行
chown -R mysql.mysql /data/mysql
/etc/init.d/mysql.server start
164节点执行
chown -R mysql.mysql /data/mysql
/etc/init.d/mysql.server start
5、建立A机房到B机房的复制关系
(1)先建立B机房中164到163的复制关系
164节点执行
stop slave;
reset slave all;
change master to
master_host='192.168.184.163',
master_user='repl',
master_password='admin',
MASTER_AUTO_POSITION=1;
start slave;
查看复制关系
show slave status\G;
(2)建立A机房到B机房的复制关系
就是建立161节点到163节点的复制关系,将163节点配置成161的从库。
163节点执行
stop slave;
reset slave all;
change master to
master_host='192.168.184.161',
master_user='repl',
master_password='admin',
MASTER_AUTO_POSITION=1;
start slave;
查看复制关系
show slave status\G;
6、做好上线前准备
(1)增加监控和备份
可参考:
Promethets监控MySQL以及通过企业微信发送告警信息
设置MySQL自动备份
(2)数据一致性校验
161节点执行
CREATE USER 'dba'@'192.168.%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'admin';
GRANT all ON *.* TO 'dba'@'192.168.%';
进行数据一致性校验
pt-table-checksum --no-check-binlog-format --host=192.168.184.161 --user=dba --password='admin' --socket=/tmp/mysql.sock
pt工具安装可参考:
使用pt-table-checksum进行主从数据一致性排查
7、给B机房的客户端增加白名单
(1)添加白名单
注意,如果防火墙是关闭的,不需要执行
在163节点执行,例如:mysql的客户端是165,想把165节点加到白名单,可执行:
iptables -L
iptables -A INPUT -s 192.168.184.165 -p tcp --dport 3306 -j ACCEPT
iptables -L
(2)加到开机启动中
vim /etc/rc.local
添加如下内容:
iptables -A INPUT -s 192.168.184.165 -p tcp --dport 3306 -j ACCEPT
三、迁移过程
1、查看A机房MySQL数据库是否有连接
161主库执行
show processlist;
2、确定MySQL是否有同步延迟
B机房主库查询
mysql -uroot -padmin
show slave status\G;
3、配置反向同步
这里配置反向同步是为了回滚,万一要回滚的话,新插入B机房的数据也能进行回滚。
在A机房MySQL主库执行,我这里是161节点,将B机房主库,也就是163节点配置为A机房161节点的主节点。
stop slave;
reset slave;
change master to
master_host='192.168.184.163',
master_user='repl',
master_password='admin',
MASTER_AUTO_POSITION=1;
start slave;
show slave status\G;
4、停止正向同步
B机房主库停止复制,也就是163节点执行
mysql -uroot -padmin
stop slave;
reset slave;

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)