一、介绍及准备工作
1.介绍
MySQL主从配置又叫Replication或者AB复制,简单讲就是A和B两台机器做主从后,在A上写数据,另一台B也会跟着写数据,两台数据实时同步。
MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致有3个步骤
主将更改操作记录到Binlog里
从将主的Binlog事件(sql语句)同步到从本机上并记录在relaylog里
从根据relaylog里面的sql语句按顺序执行
主上有一个logdump线程,用来和从的i/o线程传递binlog
从上有两个线程,其中i/o线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句执行一遍。
适用场景:
(1)做数据库数据备份,仅仅是备份,当主机宕机时,马上从机可以代替主机。
(2)还是做数据备份,但是和主机一样,会向web服务器提供服务。但是不能往从机上写数据。
主从延迟:「步骤2」开始,到「步骤7」执行结束。
步骤 2:存储引擎处理,时间极短
步骤 3:文件更新通知,磁盘读取延迟
步骤 4:Bin Log 文件更新的传输延迟,单线程
步骤 5:磁盘写入延迟
步骤 6:文件更新通知,磁盘读取延迟
步骤 7:SQL 执行时长
Master
上 1 个IO线程
,负责向Slave传输 binary log
(binlog
)
Slave
上 2 个线程:IO 线程
和执行SQL的线程
,其中:
IO线程
:将获取的日志信息,追加到relay log上;
执行SQL的线程
:检测到relay log中内容有更新,则在Slave上执行sql;
2.准备工作
准备两台机器,上面都要安装MySQL。
MySQL的安装这里就不说了,前面日志会有。
这里经常会出现一个权限问题。因为/data/mysql下的文件所有者和所属组都变成了root。用chmod改成MySQL即可。
二、配置MySQL的主机
1.安装MySQL
2.修改/etc/my.cnf文件,添加以下2段
server-id=100
log_bin=litongyao1 (生成binlog,litongyao1是他的文件开头)
重新启动mysql
[root@zhuji ~]# /etc/init.d/mysqld restart
接下来我们查看/data/mysql下,
[root@zhuji ~]# ll /data/mysql/
总用量 110700
-rw-rw----. 1 mysql mysql 56 11月 30 14:48 auto.cnf
-rwxr-xr-x. 1 mysql mysql 12582912 12月 29 13:59 ibdata1
-rwxr-xr-x. 1 mysql mysql 50331648 12月 29 13:59 ib_logfile0
-rwxr-xr-x. 1 mysql mysql 50331648 11月 30 14:15 ib_logfile1
drwx------. 2 mysql mysql 62 12月 28 21:01 java_test
-rw-rw----. 1 mysql mysql 120 12月 29 13:59 litongyao1.000001
-rw-rw----. 1 mysql mysql 143 12月 29 13:59 litongyao1.000002
-rw-rw----. 1 mysql mysql 120 12月 29 13:59 litongyao1.000003
-rw-rw----. 1 mysql mysql 60 12月 29 13:59 litongyao1.index
drwxr-xr-x. 2 mysql mysql 4096 12月 19 17:05 mysql
drwxr-xr-x. 2 mysql mysql 4096 11月 30 14:15 performance_schema
drwx------. 2 mysql mysql 50 12月 19 17:50 rxr
drwxr-xr-x. 2 mysql mysql 6 11月 30 14:14 test
-rw-rw----. 1 mysql mysql 73149 12月 29 13:59 zhuji.err
-rw-rw----. 1 mysql mysql 5 12月 29 13:59 zhuji.pid
drwx------. 2 mysql mysql 4096 12月 28 20:17 zrlog
3.把mysql库备份并恢复成litongyao库,作为测试数据
[root@zhuji ~]# mysqldump -uroot -paminglinux rxr > /tmp/rxr.sql
[root@zhuji ~]# ll /tmp/rxr.sql
-rw-r--r--. 1 root root 1780 12月 29 14:27 /tmp/rxr.sql
[root@zhuji ~]# mysql -uroot -paminglinux -e "create database litongyao"
[root@zhuji ~]# mysql -uroot -paminglinux litongyao < /tmp/rxr.sql
4.创建MySQL用户用作同步数据
mysql> grant replication slave on *.* to 'repl'@'192.168.52.100' identified by 'rxr123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; (这里要记住binlog的名字file,还有它的位置Position)
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| litongyao1.000003 | 1029 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
[root@zhuji ~]# mysqldump -uroot -paminglinux zrlog > /tmp/zrlog.sql
Warning: Using a password on the command line interface can be insecure.
三、配置从机
安装MySQL
查看my.cnf,配置server-id,要求和主不一样。
server-id=101
3.重新启动MySQL服务
[root@congji ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
4.把主上的litongyao库同步到从上
(1)把备份的库文件用scp到从机上
[root@congji ~]# scp 192.168.52.101:/tmp/*.sql /tmp/
root@192.168.52.101's password:
rxr.sql 100% 1780 1.7KB/s 00:00
zrlog.sql 100% 9886 9.7KB/s 00:00
(2)创建相应的数据库
mysql> create database rxr;
Query OK, 1 row affected (0.00 sec)
mysql> create database zrlog;
Query OK, 1 row affected (0.00 sec)
(3)把备份的库恢复到从机上,保证主从2边数据库一致
[root@congji bin]# mysql -uroot zrlog < /tmp/zrlog.sql
[root@congji bin]# mysql -uroot rxr < /tmp/rxr.sql
(4)停止主从同步
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
(5)接下来就是最重要的一步操作,在从机上配置主机的ip,用户名,密码,binlog的name以及pos。
mysql> change master to master_host='192.168.52.101', master_user='repl', master_password='rxr123456', master_log_file='litongyao1.000003', master_log_pos=1029;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
(6)开启主从同步
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
(7)查看主从有没有配置成功 (查看是否有两个yes)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.52.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: litongyao1.000003
Read_Master_Log_Pos: 1029
Relay_Log_File: congji-relay-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: litongyao1.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(8)解锁主机上的表,让它恢复写的操作
(主机:192.168.52.101)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
四、测试主从同步
几个配置参数:在/etc/my.cnf里
主服务器上:
binlog-do-db= //仅同步指定的库
binlog-ignore-db= //忽略指定库
从服务器上:
(推荐应用等级:中)
replicate_do_db= //仅同步指定的库
replicate_ignore_db= //忽略指定库
(推荐应用等级:低)万一不通的库里有同名的表
replicate_do_table= //仅同步指定的表
replicate_ignore_table= //忽略指定表
(推荐应用等级:高)
replicate_wild_do_table= //如aming.%, 支持通配符% //仅同步指定库里的指定表
replicate_wild_ignore_table= //不同步指定库里的指定表
测试主从:
主机:
mysql> use rxr;
Database changed
mysql> show tables;
Empty set (0.00 sec)
从机:
mysql> use rxr;
Database changed
mysql> show tables;
Empty set (0.00 sec)
增加一个表:
主机:
mysql> create table lty(`id`int(4),`name`char(40));
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
+---------------+
| Tables_in_rxr |
+---------------+
| lty |
+---------------+
1 row in set (0.00 sec)
从机:
cremysql> show tables;
+---------------+
| Tables_in_rxr |
+---------------+
| lty |
+---------------+
1 row in set (0.00 sec)
增加表实现主从同步。
删除表:
主机:
mysql> drop table lty;
Query OK, 0 rows affected (0.26 sec)
mysql> show tables;
Empty set (0.00 sec)
从机:
mysql> show tables;
Empty set (0.00 sec)
删除表也实现了主从同步。
三、如果误操作,导致主从同步异常,怎么办?
最重要的一步就是马上关闭主从同步:
stop slave;
接着马上做一步操作:
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
接着打开主从同步:
start slave;
然后查看是否恢复正常。