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,同时masterslave上都需要设置MySQLserver-id变量。master上的MySQL将数据库上所做的修改全部记录到Binary Log文件中。slave上的MySQLmaster接收其Binary Log 事件,然后将必要的Binary Log在本地MySQL上回放,从而使得slave上的数据库的内容和master上的数据库的内容保持相同。

 

 

1.1.2. 部署主从复制

目标:实现MySQL 基于Binary Log的复制。

Mastermysql101.coe2coe.me

Slavemysql102.coe2coe.memysql103.coe2coe.me

 

(1)修改mastermysql配置文件。

在配置文件 /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:设置masterserver 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)修改slavemysql配置文件:

102103上修改配置文件:

 

(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

目的是为了修改slaveserver-uuid变量,因为全部slave主机上的文件是从master主机上整体复制得到的,需要将slave上的mysqlserver-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上设置复制参数。

102103上执行以下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的复制的主要内容,如果未能解决你的问题,请参考以下文章

数据库学习----MySQL 日志

mysql中如何开启binlog?开启二进制日志文件?binary log?

MySQL二进制日志(binary log)总结

MySQL学习笔记之六:MySQL日志

Mariadb学习笔记-日志及备份

MySQL中基于mysqldump和二进制日志log-bin二进制日志进行逻辑备份以及基于时间点的还原