提示:三台mysql数据库已安装完成,本教程不讲解mysql数据库安装。
主机规划
主机类型 | 主机名称 | 主机ip | 操作系统版本 | mysql版本 | 备注 |
---|---|---|---|---|---|
mysql主库 | master | 192.168.91.61 | centos 7.9 | mysql 8.0.28 | |
mysql从库 | slave01 | 192.168.91.62 | centos 7.9 | mysql 8.0.28 | |
mysql级联从库 | slave02 | 192.168.91.63 | centos 7.9 | mysql 8.0.28 |
一、master主库配置
1、主库配置mysql数据库配置文件,添加server_id和log_bin参数即可开启主从复制的主库功能
[root@master ~]# vim /etc/my.cnf [client] socket=/usr/local/mysql/data/mysql.sock [mysqld] ### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它从库的server_id重复 server_id=10 log_bin=/usr/local/mysql/logs/mysql-bin ### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒 binlog_expire_logs_seconds=604800 basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/data/mysql.sock mysqlx_socket=/usr/local/mysql/data/mysqlx.sock pid_file=/usr/local/mysql/data/mysqld.pid log_error=/usr/local/mysql/logs/error.log log-bin=/usr/local/mysql/logs/mysql.bin character-set-server=utf8mb4 max_connections=500 max_connect_errors=1000 port=3306 mysqlx_port=33060
2、重启主库mysql数据库
/etc/init.d/mysqld stop /etc/init.d/mysqld start
3、主库创建主从复制验证用户
mysql -uroot -p'123456' create user 'sync'@'%' identified with 'mysql_native_password' by '123456'; grant replication slave on *.* to 'sync'@'%'; flush privileges;
4、主库查看当前二进制日志文件名和位置
注意:查看主库二进制日志文件名和位置之前,需要把主库mysql数据库进行锁表,防止有写入操作,以免影响二进制日志文件名和位置的同步信息
mysql -uroot -p'123456' mysql> show master status\g; *************************** 1. row *************************** file: mysql.000001 position: 157 binlog_do_db: binlog_ignore_db: executed_gtid_set: 1 row in set (0.00 sec)
5、主库备份数据库并远程复制一份给salve01从库
注意:如果mysql数据库过大,可以考虑使用物理备份xtrabackup工具。
mysqldump -uroot -p'123456' -a >/mnt/mysql_bak.sql scp -rp /mnt/mysql_bak.sql root@192.168.91.62:/mnt/
二、slave01从库配置
1、slave01从库配置mysql数据库配置文件,添加log_bin、relay_log、relay_log_index、log_replica_updates参数
[root@slave01 ~]# cat /etc/my.cnf [client] socket=/usr/local/mysql/data/mysql.sock [mysqld] ### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它主库或从库的server_id重复 server_id=20 log_bin=/usr/local/mysql/logs/mysql-bin ### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒 binlog_expire_logs_seconds=604800 ### 开启从库记录中继日志功能,命名方式(主机名称-relay-bin),命名可自定义,默认开启 #relay_log=/usr/local/mysql/logs/slave01-relay-bin #relay_log_index=/usr/local/mysql/logs/slave01-relay-bin.index ### 启动副本更新,从库从主库接收到log-bin更新操作由从库sql线程执行更新写入到从库自己的log-bin日志中,默认开启 #log_replica_updates=1 #### 设置只允许普通用户写入,只针对普通用户有效(拥有insert、update、delete、drop等权限),但对于超级用户无效(管理员root或者all privileges所有权限用户),默认关闭 read_only=1 #### 设置是否禁止超级管理员写入,针对所有数据库用户,包括超级用户和普通用户,默认关闭 super_read_only=1 basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/data/mysql.sock mysqlx_socket=/usr/local/mysql/data/mysqlx.sock pid_file=/usr/local/mysql/data/mysqld.pid log_error=/usr/local/mysql/logs/error.log log-bin=/usr/local/mysql/logs/mysql.bin character-set-server=utf8mb4 max_connections=500 max_connect_errors=1000 port=3306 mysqlx_port=33060
2、slave01从库导入master主库的备份库文件并重启mysql数据库
mysql -uroot -p'123456' mysql>source /mnt/mysql_bak.sql /etc/init.d/mysqld stop /etc/init.d/mysqld start
3、开启slave01从库同步master主库
mysql -uroot -p'123456' change master to master_host='192.168.91.61', master_port=3306, master_user='sync', master_password='123456', master_log_file='mysql.000001', master_log_pos=157; mysql> start slave; mysql> show slave status\g;
4、slave01从库查看当前二进制日志文件名和位置
注意:查看slave01从库二进制日志文件名和位置之前,需要把slave01从库mysql数据库锁表,防止有写入操作,以免影响二进制日志文件名和位置的同步信息
mysql -uroot -p'123456' mysql> show master status\g; *************************** 1. row *************************** file: mysql.000002 position: 157 binlog_do_db: binlog_ignore_db: executed_gtid_set:
5、slave01从库备份数据库并远程复制一份给salve02级联从库
注意:如果mysql数据库过大,可以考虑使用物理备份xtrabackup工具。
mysqldump -uroot -p'123456' -a >/mnt/mysql_slave_bak.sql scp -rp /mnt/mysql_slave_bak.sql root@192.168.91.63:/mnt/
三、slave02级联从库配置
1、slave01从库配置mysql数据库配置文件,添加log_bin、relay_log、relay_log_index、log_replica_updates参数
[root@slave01 ~]# cat /etc/my.cnf [client] socket=/usr/local/mysql/data/mysql.sock [mysqld] ### 开启主从复制功能并指定二进制日志存放路径,指定的server_id不能与其它主库或从库的server_id重复 server_id=30 log_bin=/usr/local/mysql/logs/mysql-bin ### 设置自动清除binlog二进制日志,保留最近7天bin-log日志,默认保留最近30天,单位秒 binlog_expire_logs_seconds=604800 ### 开启从库记录中继日志功能,命名方式(主机名称-relay-bin),命名可自定义,默认开启 #relay_log=/usr/local/mysql/logs/slave01-relay-bin #relay_log_index=/usr/local/mysql/logs/slave01-relay-bin.index ### 启动副本更新,从库从主库接收到log-bin更新操作由从库sql线程执行更新写入到从库自己的log-bin日志中,默认开启 #log_replica_updates=1 #### 设置只允许普通用户写入,只针对普通用户有效(拥有insert、update、delete、drop等权限),但对于超级用户无效(管理员root或者all privileges所有权限用户),默认关闭 read_only=1 #### 设置是否禁止超级管理员写入,针对所有数据库用户,包括超级用户和普通用户,默认关闭 super_read_only=1 basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/data/mysql.sock mysqlx_socket=/usr/local/mysql/data/mysqlx.sock pid_file=/usr/local/mysql/data/mysqld.pid log_error=/usr/local/mysql/logs/error.log log-bin=/usr/local/mysql/logs/mysql.bin character-set-server=utf8mb4 max_connections=500 max_connect_errors=1000 port=3306 mysqlx_port=33060
2、slave02级联从库导入slave01从库的备份库文件并重启mysql数据库
mysql -uroot -p'123456' mysql> source /mnt/mysql_slave_bak.sql /etc/init.d/mysqld stop /etc/init.d/mysqld start
3、开启slave01从库同步master主库
mysql -uroot -p'123456' change master to master_host='192.168.91.62', master_port=3306, master_user='sync', master_password='123456', master_log_file='mysql.000002', master_log_pos=157; mysql> start slave; mysql> show slave status\g;
四、测试
1、master主库创建测试数据,查看slave01从库同步状态,查看slave02级联从库同步状态
### master主库写入测试数据 mysql -uroot -p'123456' create database student; create table student.test (id int(11),name varchar(25)); insert into student.test values(1,'xiaoming'); insert into student.test values(2,'zhangshang'); insert into student.test values(3,'lishi'); select * from student.test; ### slave01从库查看主从同步状态 mysql -uroot -p'123456' select * from student.test; show slave status\g; slave_io_running: yes slave_sql_running: yes seconds_behind_master: 0 ### slave02级联从库查看主从同步状态 mysql -uroot -p'123456' select * from student.test; show slave status\g; slave_io_running: yes slave_sql_running: yes seconds_behind_master: 0
2、master主库大批量写入测试数据,查看slave01从库同步状态,查看slave02级联从库同步状态
### master主库在操作系统使用shell批量写入测试数据 for i in {4..1000}; do mysql -uroot -p'123456' -e "insert into student.test(id,name) values('$i','aaa');";done ### slave01从库查看主从同步状态 mysql -uroot -p'123456' mysql> select * from student.test; mysql> show slave status\g; slave_io_running: yes slave_sql_running: yes seconds_behind_master: 0 ### slave02级联从库查看主从同步状态 mysql -uroot -p'123456' mysql> select * from student.test; mysql> show slave status\g; slave_io_running: yes slave_sql_running: yes seconds_behind_master: 0
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论