MySQL已有数据改为主从结构

来自Linux78|wiki
Bob讨论 | 贡献2020年3月6日 (五) 11:19的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

问题:公司业务数据一直使用单台MySQL服务器,现在需要扩展为主从结构,对于已经存在的数据需要不受影响,应该如何实现?

答案:如果之前的服务器有记录二进制日志,那么直接按正常操作配置主从即可,如果没有记录二进制日志,则需要先把Master服务器数据导出到Slave服务器上,然后进行主从复制

配置步骤如下:

1、首先要导出主库的数据,分为两种情况,如果是innodb引擎的可以不锁表,反之要上锁。下面语句适用于innodb引擎,不用锁表。

mysqldump -u root  --master-data=2 --single-transaction -A -R -E --triggers  >/mysqldata.sql 

# master-data=2 是为了记录binlog日志的位置,查看备份文件可以找到需要的postion

# single-transaction  innodb引擎加该选项不用锁表

如果非innodb引擎,先进行锁表再执行导出操作,防止导出数据中途插入了新内容(该终端不要退出,否则锁表会中止)

flush tables with read lock;    #该语句只在当前会话生效,这个时候需要另启终端进行导出

2、主服务器启用二进制日志,然后重启服务

vim /etc/my.cnf
log_bin = master-bin
binlog_format = row
server_id = 1

3、在Slave服务器上导入Master的备份数据

mysql  -u root < /mysqldata.sql

4、验证数据是否导入成功

show databases;

5、在Master服务器上做授权操作

grant replication slave on *.* to 'repuser'@'192.168.1.110' identified by '123456'
flush privileges

6、在Slave上执行同步语句,由于通常备份时会指定--master-data=2,所以master_log_file和master_log_pos可以在备份文件中看到:

也可以在Master服务器上执行show master status\G来查看

change master to
master_host='192.168.1.100'.
master_user='repuser',
master_password='123456',
master_log_file='mysql-bin.000004',
master_log_pos=1484;

7、从服务器上执行SQL语句,如果Slave_IO_Running和Slave_SQL_Running两项的工作状态为yes就代表成功了

mysql > start slave
mysql > show slave status\G

8、Master服务器解锁 unlock tables;

9、插入一些数据测试同步情况