之前我们做过MySQL多实例,正好主从复制这一节我们可以很好的用上。如果还没有了解到的请先看一下MySQL多实例章节。下面我会直接使用前面的3个节点分别是3307,3308,3309。
- 准备两个节点以上(多实例)
3307:master
3308:slave1
3309:slave2 - 主库开启binlog,从库开启relay-log(默认在数据目录下生成)
vim /data/3307/my.cnf log-bin=/data/3307/mysql-bin binlog_format=row
- server-id需要不同,保证实例唯一
[root@db02 data]# cat /data/3307/my.cnf |grep server-id server-id=3307 [root@db02 data]# cat /data/3308/my.cnf |grep server-id server-id=3308 [root@db02 data]# cat /data/3309/my.cnf |grep server-id server-id=3309
- 关闭数据库的自动域名解析
每个节点都加入以下配置:skip-name-resolve
3个配置文件都需要添加skip-name-resolve哦,否则mysql服务会将ip解析为主机名
- 查看3个实例配置如下
3307:
3308:[root@db01 data]# vim 3307/my.cnf [mysqld] basedir=/application/mysql datadir=/data/3307 server-id=3307 port=3307 log-bin=/data/3307/mysql-bin binlog_format=row socket=/data/3307/mysql.sock log-error=/data/3307/mysql.log skip-name-resolve
3309:[root@db01 data]# vim 3308/my.cnf [mysqld] basedir=/application/mysql datadir=/data/3308 server-id=3308 port=3308 log-bin=/data/3308/mysql-bin socket=/data/3308/mysql.sock log-error=/data/3308/mysql.log skip-name-resolve
[root@db01 data]# vim 3309/my.cnf [mysqld] basedir=/application/mysql datadir=/data/3309 server-id=3309 port=3309 log-bin=/data/3309/mysql-bin socket=/data/3309/mysql.sock log-error=/data/3309/mysql.log skip-name-resolve
-
启动多实例
[root@db01 data]# mysqld_safe --defaults-file=/data/3307/my.cnf & [root@db01 data]# mysqld_safe --defaults-file=/data/3308/my.cnf & [root@db01 data]# mysqld_safe --defaults-file=/data/3309/my.cnf &
-
连接到主库,主库创建复制账户(账户名为repl,密码123456)
[root@db01 data]# mysql -S /data/3307/mysql.sock mysql> grant replication slave on *.* to repl@'10.0.0.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec)
-
从库数据的追加
(1)不需要追加的情况:主和从同时搭建的新环境,就不需要备份主库数据,恢复到从库了,直接从第一个binlog(mysql-bin.000001)的开头位置(120)
(2)如果主库已经工作了很长时间了,我们一般需要备份主库数据,恢复到从库,然后从库从备份的时间点起自动进行复制
重点针对第二种情况进行演示:
备份主库:(还没有了解到mysqldump命令的去查看 二十三节)[root@db01 /]# mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full.sql [root@db01 /]# ll /tmp/ -rw-r--r-- 1 root root 656285 Aug 20 01:05 full.sql
查看备份文件的第22行,确定position号为325
[root@db01 /]# sed -n '22p' /tmp/full.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=325;
将主库的备份数据恢复到从库3308,3309
3308:[root@db01 /]# mysql -S /data/3308/mysql.sock mysql> set sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> source /tmp/full.sql
3309:
[root@db01 ~]# mysql -S /data/3309/mysql.sock mysql> set sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> source /tmp/full.sql;
-
从库开启主从:(通过Change master to 配置主库信息,start slave 开启IO和SQL线程)
可以通过help change master to 获取具体用法。
3308:[root@db01 /]# mysql -S /data/3308/mysql.sock mysql> CHANGE MASTER TO -> MASTER_HOST='10.0.0.20', -> MASTER_USER='repl', -> MASTER_PASSWORD='123456', -> MASTER_PORT=3307, -> MASTER_LOG_FILE='mysql-bin.000006', -> MASTER_LOG_POS=325; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
3309:
[root@db01 /]# mysql -S /data/3309/mysql.sock mysql> CHANGE MASTER TO -> MASTER_HOST='10.0.0.20', -> MASTER_USER='repl', -> MASTER_PASSWORD='123456', -> MASTER_PORT=3307, -> MASTER_LOG_FILE='mysql-bin.000006', -> MASTER_LOG_POS=325; Query OK, 0 rows affected, 2 warnings (0.07 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
-
查看主从状态:show slave status\G
3308,3309:(主要查看Slave_IO_Running,Slave_SQL_Running的运行状态)mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.20 Master_User: repl Master_Port: 3307 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 325 Relay_Log_File: db01-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes . . 省略部分 . .
-
测试3307,3308,3309的主从复制。
3307:创建数据库和表,并添加数据。mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> create database fxw; Query OK, 1 row affected (0.00 sec) mysql> use fxw; Database changed mysql> create table t1(id int,name varchar(32)); Query OK, 0 rows affected (0.03 sec) mysql> insert t1 values(1,'我就是为道日损'); Query OK, 1 row affected (0.15 sec) mysql> insert t1 values(2,'我就是菜鸟'); Query OK, 1 row affected (0.00 sec) mysql> insert t1 values(2,'菜鸟就是我'); Query OK, 1 row affected (0.07 sec)
3308:查看数据库和表数据
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | fxw | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use fxw; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from t1; +------+-----------------------+ | id | name | +------+-----------------------+ | 1 | 我就是为道日损 | | 2 | 我就是菜鸟 | | 2 | 菜鸟就是我 | +------+-----------------------+ 3 rows in set (0.01 sec)
3309:查看数据库和表数据
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | fxw | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use fxw; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from t1; +------+-----------------------+ | id | name | +------+-----------------------+ | 1 | 我就是为道日损 | | 2 | 我就是菜鸟 | | 2 | 菜鸟就是我 | +------+-----------------------+ 3 rows in set (0.00 sec)
搞定!!!!!!!!!!!!!!!
主从复制属于架构中的重点哦,记得做好笔记。

