MySQL添加从库一般就两种方法,一种是通过MySQL自带的mysqldump命令,这种属于逻辑备份,备份和恢复的时间都比较长,而且会锁表,一般应用于数据量比较少的场合。另外一种是第三方开源工具Xtrabackup,这工具属于物理备份,备份和恢复时间都比较快而且不锁表,更多介绍可以到它官网上面参考https://www.percona.com/
实验环境:
Master:192.168.1.18 CentOS release 7.5 (Final) MySQL 5.7.32
Slave :192.168.1.19 CentOS release 7.5 (Final) MySQL 5.7.32
Master:
# innobackupex --user=root --password=redhat --defaults-file=/etc/my.cnf --no-timestamp /data/backup/slave
Slave
# innobackupex --user=root --password=redhat --defaults-file=/etc/my.cnf --apply-log /data/backup/slave
# innobackupex --user=root --password=redhat --defaults-file=/etc/my.cnf --copy-log /data/backup/slave
Slave:
# service mysqld stop #先关闭数据库
# mkdir /usr/local/mysql/data_bak #创建一个备份原来数据的文件夹
# mv /usr/local/mysql/data/* /usr/local/mysql/data_bak/ #将原来的数据迁移到这个备份文件夹上面。
Master:
# rsync -avz /data/backup/slave/ root@192.168.1.19:/usr/local/mysql/data/ #将备份出来的数据同步到从库数据库的data目录
Slave:
# ll /usr/local/mysql/data
total 178228
-rw-r--r--. 1 root root 295 Feb 2 10:40 backup-my.cnf #包含备份所必须的一些初始化参数。
drwx------. 2 root root 4096 Feb 2 10:40 db01
-rw-r-----. 1 root root 79691776 Feb 2 10:43 ibdata1
-rw-r--r--. 1 root root 50331648 Feb 2 10:43 ib_logfile0
-rw-r--r--. 1 root root 50331648 Feb 2 10:43 ib_logfile1
drwx------. 2 root root 4096 Feb 2 10:40 mysql
drwxr-xr-x. 2 root root 4096 Feb 2 10:40 performance_schema
drwx------. 2 root root 4096 Feb 2 10:40 sharelinux
drwxr-xr-x. 2 root root 4096 Feb 2 10:40 test
-rw-r--r--. 1 root root 21 Feb 2 10:40 xtrabackup_binlog_info #记录备份时的二进制日志文件的位置。
-rw-r--r--. 1 root root 22 Feb 2 10:43 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root 91 Feb 2 10:43 xtrabackup_checkpoints #记录LSN以及备份的类型。
-rw-r--r--. 1 root root 638 Feb 2 10:40 xtrabackup_info #记录binlog和pos的位置。
-rw-r-----. 1 root root 2097152 Feb 2 10:43 xtrabackup_logfile #备份日志文件,里面记录备份操作过程中数据库的变更。
drwx------. 2 root root 12288 Feb 2 10:40 zabbix
Slave:
# chown -R mysql:mysql /usr/local/mysql/data #将权限更改为mysql
# service mysqld start
Master:
mysql> grant replication slave,replication client on *.* to 'repl'@'192.168.1.19' identified by 'mysql'; #在Master的数据库中建立一个备份帐户
Slave:
# mysql -h 192.168.1.18 -u repl -p mysql
mysql> show grants\G;
*************************** 1. row ***************************
Grants for sharelinux@192.168.1.19: GRANT REPLICATION SLAVE ON *.* TO 'sharelinux'@'192.168.1.19' IDENTIFIED BY PASSWORD '*84BB5DF4823DA319BBF86C99624479A198E6EEE9'
Slave:
# scp root@192.168.1.18:/etc/my.cnf /etc/my.cnf #拷贝主库的my.cnf替换从库的my.cnf,并将server_id的值更改为2。
# service mysqld restart
# cat /usr/local/mysql/data/xtrabackup_binlog_info #记录备份时的二进制日志文件的位置。
mysql-bin.000002 120
mysql> change master to master_host='192.168.1.18',master_user='repl',master_password='mysql',master_log_file='mysql-bin.000002',master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.161.128
Master_User: sharelinux
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 120
Relay_Log_File: node2-relay-bin.000004
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes #必须为Yes
Slave_SQL_Running: Yes #必须为Yes
....................................
通过Xtrabackup在线添加从库就完成。Xtrabackup可以使MySQL维护工作变得更加简单化。