mysql主从复制实战

[TOC]

准备工作

节点 ip地址 备注
节点1 192.168.0.11 主从复制的主库
节点2 192.168.0.12 主从复制的从库,或者主主复制的主2

1、主+从:保证主从MySQL版本一致

SELECT VERSION();

2、主库:为从库创建复制专用账户

该账户必须授予 REPLICATION SLAVE 权限

CREATE USER 'dba_repl'@'%' IDENTIFIED BY 'MA6RuouuZZn4x_Hd';
GRANT SELECT,RELOAD,FILE,SUPER,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'dba_repl'@'%';
FLUSH PRIVILEGES;

3、主库:启用binlog并配置serverid

[mysqld]
server-id=1001
log-bin=mysql-bin

注意:主库的server_id应介于1到2^32-1。如果没有这些选项,启用binlog后重启mysql服务。

4、从库:启用binlog及relaylog并配置serverid

[mysqld]
server-id=1002
log-bin=mysql-bin
relay-log=mysql-relay-bin

注意:从库的server_id值也应介于1到2^32-1,从库的 server-id 不能与主库相同

5、主库:备份数据库

  • 备份所有库:添加 --set-gtid-purged=off 可取消gtid属性(若配置GTID复制则不可取消gtid属性)
mysqldump -h 192.168.0.11 --single-transaction --master-data=2 --flush-logs --triggers --events --routines --skip-tz-utc --set-gtid-purged=off -uroot -p --all-databases > /data/alldb.20190822.sql
  • 备份指定库:若只对指定库配置主从同步,则不需要备份所有库
mysqldump -h 192.168.0.11 --single-transaction --master-data=2 --flush-logs --triggers --events --routines --skip-tz-utc --set-gtid-purged=off -uroot -p --databases db1 db2 > /data/2db.20190822.sql

6、主库:拷贝dump文件到从库服务器

  • 实测发现,scp比rsync快,且不丢失大小。
scp -r -P1618 -l 16000 /data/alldb.20190822.sql 192.168.0.12:/data/

主从配置过程

点位复制

1、从库:导入主库的dump文件

从库> mysql -h 192.168.0.12 -uroot -p < /data/alldb.20190822.sql
  • 遇到的问题:若主库启用了gtid,同时dump的时候没有取消gtid属性,则从库导入备份之前应该先执行 reset master; 否则会报如下错误:
报错:ERROR 1840 (HY000) at line 33: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
处理:reset master;
  • [x] 加快导入速度的几个参数
set global innodb_flush_log_at_trx_commit=0;
set global sync_binlog=500000;
show variables like 'sync_binlog';

2、从库:从备份文件中获取点位信息

cat /data/alldb.20190822.sql | grep "CHANGE MASTER"

3、从库:根据实际情况修改如下参数,并执行 start slave; 启动同步

CHANGE MASTER TO MASTER_HOST='x.x.x.x',MASTER_PORT=3406,MASTER_USER='dba_repl',MASTER_PASSWORD='MA6RuouuZZn4x_Hd',MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;
START SLAVE;
SHOW SLAVE STATUS \G;

4、从库:确认 Slave_IO_Running 及 Slave_SQL_Running 均为 yes,则表示相关进程运行无报错,待 Seconds_Behind_Master 变为 0 之后,则表示主从已完全同步

从库> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
             Slave_IO_Running: Yes    #.看这里
            Slave_SQL_Running: Yes    #.看这里
        Seconds_Behind_Master: 2403   #.看这里
  • x.优化:禁用skip-slave-start(需重启mysql服务以生效),slave进程会随着mysql启动而启动
[root@localhost ~]# cat /data/mysql_3306/my_3306.cnf | grep "skip-slave-start"
skip-slave-start=0
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2023-08-31 11:14:53

results matching ""

    No results matching ""