MySQL学习笔记06基于Binary Log的复制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习笔记06基于Binary Log的复制相关的知识,希望对你有一定的参考价值。
1.1.1. 相关概念
(1)Binary Log
当变量log_bin的值为ON时,mysql将启用Binary Log,这将在data目录下产生类似mysql-bin.00001, mysql-bin.00002的二进制日志文件,这些文件记录了数据库中执行的各种操作。
binlog_format变量指定了MySQL的二进制日志的格式,支持三种类型的格式:
ROW 使用数据表的行记录来记录日志。优点是避免了STATEMENT格式时SQL语句中自增字段的不良影响。缺点时一条更新大量记录的SQL语句可能产生大量日志。
STATEMENT 使用执行的SQL语句来记录日志。优点和缺点与ROW格式相反。
MIXED 使用混合格式来记录日志。
默认情况下,MySQL使用ROW格式。
(2)基于Binary Log的复制。
使用基于Binary Log的复制方式时,master主机上的MySQL需要启动Binary Log,同时master和slave上都需要设置MySQL的server-id变量。master上的MySQL将数据库上所做的修改全部记录到Binary Log文件中。slave上的MySQL从master接收其Binary Log 事件,然后将必要的Binary Log在本地MySQL上回放,从而使得slave上的数据库的内容和master上的数据库的内容保持相同。
1.1.2. 部署主从复制
目标:实现MySQL 基于Binary Log的复制。
Master:mysql101.coe2coe.me
Slave:mysql102.coe2coe.me和mysql103.coe2coe.me
(1)修改master的mysql配置文件。
在配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf中增加如下内容:
[mysqld]
log-bin=mysql-bin
server-id=101
innodb_flush_log_at_trx_commit=1
sync_binlog=1
其中以下配置为必备配置。
log-bin:启用Binary Log。
Server-id:设置master的server id。
以下配置为了提高对于InnoDB事务的复制操作的可靠性。
Innodb_flush_log_at_trx_commit: 在InnoDB事务提交时刷新日志。
Sync_binlog:同步Binary Log。
(2)在master上创建mysql复制用户。
mysql> create user ‘repl‘@‘%.coe2coe.me‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.03 sec)
mysql> grant replication slave on *.* to ‘repl‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
(3)在master上查询复制位置。
在某个mysql连接中执行以下操作。
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
在另外一个mysql连接中执行以下操作:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
其中,
File字段的值为日志文件名称,位于/opt/mysql/data目录中。
Position字段的值表示日志的位置。
(4)修改slave的mysql配置文件:
在102和103上修改配置文件:
(a) 修改/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
log-bin=mysql-bin
server-id=102
innodb_flush_log_at_trx_commit=1
sync_binlog=1
read-only=1
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
replicate-wild-ignore-table=performance_schema.%
replicate-wild-ignore-table=sys.%
其中:
Read-only:设置为1时,普通用户将无法对数据库执行写操作,超级用户和复制操作除外。
replicate-wild-ignore-table:忽略指定的数据表,这些表将不进行复制,可配置为MySQL系统相关的数据库中的数据表不进行复制。
使用replicate-wild-ignore-table可以避免跨数据库操作数据表时导致的slave上的复制产生问题。跨数据库操作数据表指实际操作的数据表不是use语句指定的数据库中的数据表,在某些数据库不需要复制时,MySQL仅根据use语句来判断当前使用的数据库。
例子如下:
mysql> use coe2coe;
Database changed
mysql> insert into test.test (name2) values (‘005‘);
Query OK, 1 row affected (0.01 sec)
(b)修改/opt/mysql/data/auto.cnf
[auto]
server-uuid=a2392929-6dfb-11e7-b294-000c29b1c102
目的是为了修改slave的server-uuid变量,因为全部slave主机上的文件是从master主机上整体复制得到的,需要将slave上的mysql的server-uuid修改为跟master不同。
mysql> show variables like ‘server%‘;
+----------------+--------------------------------------+
| Variable_name | Value |
+----------------+--------------------------------------+
| server_id | 102 |
| server_id_bits | 32 |
| server_uuid | a2392929-6dfb-11e7-b294-000c29b1c102 |
+----------------+--------------------------------------+
3 rows in set (0.00 sec)
(5)在slave上设置复制参数。
在102和103上执行以下SQL命令:
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘mysql101.coe2coe.me‘,
-> MASTER_USER=‘repl‘,
-> MASTER_PASSWORD=‘123456‘,
-> MASTER_LOG_FILE=‘mysql-bin.000003‘,
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
(6)在slave上启动复制过程。
两个方法:
(a)重新启动slave上的mysql服务。重新启动mysql后会自动启动复制过程。
(b)直接运行start slave命令。
1.1.3. 查看复制状态
(1)查看slave的复制状态。
可以查看slave的复制状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql101.coe2coe.me
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 154
Relay_Log_File: mysql102-relay-bin.000006
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,sys.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 1086
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 101
Master_UUID: a2392929-6dfb-11e7-b294-000c29b1c101
Master_Info_File: /opt/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
(2)查看master的复制状态。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 1024 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
(3)查看master上已连接的slave主机。
mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 103 | | 3306 | 101 | a2392929-6dfb-11e7-b294-000c29b1c103 |
| 102 | | 3306 | 101 | a2392929-6dfb-11e7-b294-000c29b1c102 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)
以上是关于MySQL学习笔记06基于Binary Log的复制的主要内容,如果未能解决你的问题,请参考以下文章