准备两台服务器:
主:192.168.8.10
备:192.168.8.11
MySQL的版本最好保持一致。
创建一个专门的同步账号:
GRANT REPLICATION SLAVE ON . to 'repl'@'192.168.8.11' identified by 'passwd';
用于后面设置从库同步的起始点:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000028 | 26642 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
server-id默认都是1,如果要设置主从必须要保存两台的server-id不同,因此只需改从服务器就行。保存重启:
vim /etc/my.cnf
server-id=2
service mysql restart
在从服务器上设置同步(MASTER_LOG_FILE和MASTER_LOG_POS是步骤二查询的结果):
CHANGE MASTER TO MASTER_HOST='172.18.135.185',MASTER_PORT=3306,MASTER_USER='repl',
MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000028',MASTER_LOG_POS=5408;
在从服务器上执行:
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
在从服务器上执行:
mysql> show slave status\G
Query OK, 0 rows affected, 1 warning (0.00 sec)
如果下面两项值为YES,则表示配置正确:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在主库上执行一个update或insert操作,看从库是否同步过来了。
上面的操作过程中忽略了一个很重要的问题:刚开始同步时,历史数据如何同步到从库,有两种方案:
方法一: 让从库从第一个binlog文件开始重放: 只需将上述步骤四中的命令改为:
CHANGE MASTER TO MASTER_HOST='172.18.135.185',MASTER_PORT=3306,MASTER_USER='repl',
MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=0;
这种方法的好处是不用对主库进行停用或重启操作,不影响主库,弊端是如果主库的数据量相当庞大,那么从库需要同步完所需的时间会特别长,多则长达几个小时,甚至几天,比较影响从库能提供对外服务的时间。
方法二: 把主库的数据全量mysqldump出来,然后load file进从库。这种方法有个致命的弊端是得先把主库的更新操作先停止,会直接影响线上服务。
具体操作步骤如下:
主库操作:
1. 停止主库的数据更新操作:
mysql> flush tables with read lock;
2.新开窗口,选择需备份库:
mysqldump -h 127.0.0.1 -uroot -proot --skip-comments --databases --compact -C -q -f db1 db2 db3 >> back.sql
3. 记录日志和偏移量
mysql> show master status
4. 主库解锁
mysql> unlock tables;
从库操作:
1. 导入数据
$ mysql -uroot -proot 2.设置刚记录的主库日志和偏移量信息:
CHANGE MASTER TO MASTER_HOST='172.18.135.185',MASTER_PORT=3306,MASTER_USER='repl',
MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000028',MASTER_LOG_POS=4032;
3.开启同步
mysql> start slave;
mysql> stop slave;
mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE = (db1.mytable);
mysql> start slave;
查看主从延时多大
通过show slave status可以看到: Seconds_Behind_Master 主从同步的延时时长,用从库的当前时间戳减去binlog的时间戳。
延时同步
设置延时同步,单位秒(延迟10s)
CHANGE MASTER TO MASTER_DELAY = 10;
参考: