centos7 实现 mysql8.0.16 主从复制

参考链接

说明

先在主数据库和从数据库中分别创建好test数据库,用于主从复制的测试。

修改master配置

修改 vi /app/mysqldata/3306/my.cnf,内容如下:

 1[client]
 2port=3306
 3socket=/app/mysqldata/3306/tmp/mysql.sock
 4[mysqld]
 5user=mysql
 6server-id=3306
 7port=3306
 8mysqlx_port=33060
 9basedir=/usr/local/mysql
10datadir=/app/mysqldata/3306/data
11plugin-dir=/usr/local/mysql/lib/plugin
12tmpdir=/app/mysqldata/3306/tmp
13socket=/app/mysqldata/3306/tmp/mysql.sock
14mysqlx_socket=/app/mysqldata/3306/tmp/mysqlx.sock
15pid-file=/app/mysqldata/3306/tmp/mysql.pid
16log-error=/app/mysqldata/3306/tmp/mysql-error.log
17log-bin=/app/mysqldata/3306/logs/mysql-bin
18character-set-server=utf8mb4
19collation-server=utf8mb4_unicode_ci

其中 server-id 和 log-bin 必须配置。
修改完成后,重启主数据库,使配置生效。

1mysqld --defaults-file=/app/mysqldata/3306/my.cnf &

登录master,在主数据库中创建用于同步的用户账号、授权、刷新权限

1CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
2GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
3flush privileges;

查看master状态,记录二进制文件名和位置

1SHOW MASTER STATUS;
2+------------------+----------+--------------+------------------+-------------------+
3| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
4+------------------+----------+--------------+------------------+-------------------+
5| mysql-bin.000001 |      1010|              |                  |                   |
6+------------------+----------+--------------+------------------+-------------------+
71 row in set (0.00 sec)

修改slave配置

编辑 vi /app/mysqldata/3307/my.cnf,内容如下:

 1[client]
 2port=3307
 3socket=/app/mysqldata/3307/tmp/mysql.sock
 4[mysqld]
 5user=mysql
 6server-id=3307
 7port=3307
 8mysqlx_port=33070
 9basedir=/usr/local/mysql
10datadir=/app/mysqldata/3307/data
11plugin-dir=/usr/local/mysql/lib/plugin
12tmpdir=/app/mysqldata/3307/tmp
13socket=/app/mysqldata/3307/tmp/mysql.sock
14mysqlx_socket=/app/mysqldata/3307/tmp/mysqlx.sock
15pid-file=/app/mysqldata/3307/tmp/mysql.pid
16log-error=/app/mysqldata/3307/tmp/mysql-error.log
17log-bin=/app/mysqldata/3307/logs/mysql-bin
18relay_log=/app/mysqldata/3307/logs/mysql-relay-bin
19character-set-server=utf8mb4
20collation-server=utf8mb4_unicode_ci
21#replicate-wild-do-table=test.%
22log_slave_updates=1
23read_only=1

其中:

  • server-id 唯一且必须;
  • log-bin 可选,指定数据库的日志文件;
  • replicate-wild-do-table 可选,指定要同步的数据库;
  • log_slave_updates 可选,其值为1时表示slave将复制事件写进自己的二进制日志中;
  • relay_log 可选,slave将master的二进制日志读取过来,记录到slave的relay-log中,然后slave的线程会读取relay-log日志的内容并应用到slave,从而使slave和master的数据保持一致;
  • read_only 可选,其值为1表示只读;这样可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作,例如root用户;

注意:通常情况,slave从master接收到的更新不记入它的二进制日志。
但是,如果slave也是其他服务器的master,必须启用 logs-bin 和 log_slave_updates。

修改完成后,重启从数据库,使配置生效。

1mysqld --defaults-file=/app/mysqldata/3307/my.cnf &

登录slave,执行同步SQL语句

1CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1010;

启动slave同步进程

1start slave;

查看slave状态

1show slave status\G;

当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。

关闭slave同步进程

1stop slave;

说明和建议

在生产环境上,建议在主机和从机上都配置repl账户,并同时赋予REPLICATION SLAVE(主从复制)和REPLICATION CLIENT(监控)权限,命令如下:

1GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
2flush privileges;

这样做的好处:
一方面使用同一账户对Replication进行监视管理会很方便,不必区分slave,master;
另一方面,repl账户在slave和master上的配制是一样的,这样如果我们切换slave和master,账户不需要做任何改动。