mysql5.7主从同步部署步骤-跳过许多坑

本文档以centos8.0为主服务器,centos7.7为从服务器。

先说一下环境,

主服务器centos8上已经安装了mysql8.0,docker版本是19.03.5,ip:xxx.xxx.xxx.242;

从服务器上安装的是mysql5.7.25, ip:xxx.xxx.xxx.240。

因为要进行容器化部署,也为了保证版本兼容,所以主服务器拉取了一个mysql镜像:

docker pull mysql:5.7

环境准备完成,开始部署了。

有些基本的mysql语句忽略了,请自行学习。

主服务器配置

1. 创建容器之前,编辑设置mysqld的配置文件my.cnf,设置log_bin和server_id,否则容器创建之后再修改配置文件,会造成容器无法启动:

[mysqld]

        datadir=/var/lib/mysql
        socket=/var/lib/mysql/mysql.sock

# server_id  服务器唯一ID,默认是1,一般取IP最后一段
        server_id = 242
        #启用二进制日志
        log_bin=/var/lib/mysql/binlog
        #需要备份的数据库名  多个库以逗号分隔
        binlog-do-db = iqms
        #binlog-do-db = file_center,oauth-center,tx-manager,tx_logger,user-center,xxl-job
        #若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
        log_bin_trust_function_creators=TRUE
        binlog_format=MIXED
        #忽略表名大小写
        lower_case_table_names=1
需要注意的是,其它参数尽量不要加,主从备份时有些参数不支持。

2. 备份主服务器的数据(如果是新建的空数据库,可以忽略)

    mysqldump -uroot -p mysql--all-databases --lock-all-tables > ~/master_db.sql

3. 新建一个目录,再建两个子目录,用于存放mysql的配置文件和数据文件,便于迁移。

    例如:/data/docker_mysql57/conf.d, /data/docker_mysql57/data

4. 创建mysql57容器:

    docker run -p 3307:3306 --name mysql57 -v /data/docker_mysql57/conf.d:/etc/mysql -v /data/docker_mysql57/logs:/var/log/mysql -v /data/docker_mysql57/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

为避免端口冲突,需要映射容器的端口。

5. 通过3307端口登入主服务器的mysql,创建用于从服务器同步数据使用的帐号,并授权:

    (创建用户slave,密码slave)

    GRANT REPLICATION SLAVE ON *.* TO'slave'@'%' identified by 'slave';

    GRANT file ON *.* TO'slave'@'%' identified by 'slave';

    FLUSH  PRIVILEGES;

6. 仔细检查binlog是否有日志,切记!如果没有,看mysql日志检查是什么错误,我在这里绕了老半天:-(

7. 获取主服务器的二进制日志信息

SHOW MASTER STATUS;

记录下二进制文件的名字以及position位置信息,下面同步的时候要用到。

主服务器就配置完了,如果以后有改动,从服务器必须重启。

 

从服务器配置

1. 把主服务器上导出的master_db.sql备份文件先同步到从服务器上,保证主从数据一致。

        mysql -uroot-pmysql < master_db.sql

2. 修改从服务器的配置文件my.cnf,加上对应的server_id

[mysqld]

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# server_id  服务器唯一ID,默认是1,一般取IP最后一段
server_id = 240
#忽略表名大小写
lower_case_table_names=1

replicate_do_db=iqms
replicate_ignore_db=mysql,sys
#replicate_do_table= 同步指定的表
#replicate_ignore_table= 忽略指定的表
read_only

symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_connections=3600 
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

validate_password_policy=0
validate_password_length=8
validate_password_mixed_case_count=0
validate_password_number_count=0
validate_password_special_char_count=0

3. 重启mysqld服务。

4. 用命令行或客户端连接到从服务器,进行同步设置:

change master to master_host='xxx.xxx.xxx.242', master_port=3307, master_user='slave', master_password='slave',master_log_file='binlog.000003', master_log_pos=3133;

注意:第一个ip地址改成自己主服务器的ip地址,二进制文件要跟主服务器的一致,pos位置也要与主服务器一致。具体的值参见主服务器配置的第7步

5. 开始同步

输入命令:start slave;

6. 查看同步状态

输入指令:show slave status;

注意图片中的后面两个参数必须是Yes,否则无法同步。如果slave_sql_running为No,请仔细检查mysql日志,解决错误后再执行以下操作:

stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1;

start slave;

此时执行show processlist; 会看到两个同步线程正在工作:

再到主服务器上执行show processlist; 会看到一个同步线程正在工作:

如果从服务器没有start,主服务器上也是看不到这个线程的。

7. 如果主服务器上锁表了,记得解锁: unlock tables;

8. 测试,在主服务器上新建一个表,或增加一条记录,可以在从服务器上看到,就大功告成了!

 

经验总结:

1. 环境必须干净!主服务器上不能有多余的配置!以前的从服务器上有很多旧库,必须干掉!

2. 每做一步都仔细检查是否正确,否则。。。。。。多次从头来吧

    这些查错语句是必须的:

    show master status;

    show slave status;

    show variables like 'server_id';

    show variables like '%log_bin%'

    show processlist;

    show binlog events in 'mysql-bin.000003';

3. 大胆假设,小心求证

 

借鉴了以下文章,但都没有我的详细:-)

https://blog.csdn.net/weixin_42369926/article/details/81036200

还有几个找不到了,关过浏览器就没了,但确实挺有帮助。

这步走通以后,其它的主主同步、一主多从就很容易了,略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值