前言:
而今姐妹们对“mysql57复制”大约比较注重,兄弟们都需要学习一些“mysql57复制”的相关资讯。那么小编同时在网络上汇集了一些关于“mysql57复制””的相关资讯,希望看官们能喜欢,大家一起来学习一下吧!准备环境
# 使用docker pull mysql:5.7.36 拉取下来的mysql版本是:5.7.36# 准备2台机器192.168.0.121 (安装master)192.168.0.122 (安装slave)
操作目录都是在 /usr/local/docker/mysql57
先分别在两台机器的这个目录下分别创建2个文件夹。
mkdir data logs192.168.0.121 master 机器
增加my.cnf ,这里我命名为master.cnf
master.cnf
[mysqld]# 表示mysql服务器ID,该ID必须在该主从中是唯一的,默认是1,该ID可以自行自定义,但必须为数字。server-id=1log-bin=mysql-bin# 注意:如果binlog-do-db和binlog-ignore-db不加的话,那么默认是同步复制整个mysql数据库。# 表示需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。binlog-do-db=d_sun# 表示不需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。binlog-ignore-db=mysqlbinlog-ignore-db=sysbinlog-ignore-db=information_schemabinlog-ignore-db=performance_schemaskip-name-resolvelog-slave-updatesback_log=100expire_logs_days=3# 表示每个binlog文件最大大小,当此文件大小等于100M时,会自动生成一个新的日志文件。注意:一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。max_binlog_size=100Mcharacter_set_server=utf8mb4sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
增加 docker-compose.yaml
version: '3.9'services: mysql-master: container_name: mysql57 image: mysql:5.7.36 #docker 容器重启后自动重启该服务 restart: always command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root ports: - 3307:3306 volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/master.cnf:/etc/my.cnf
master机器下创建完成后,如下所示:
192.168.0.122 slave 机器
增加my.cnf ,这里我命名为slave.cnf
slave.cnf
[mysqld]# 表示mysql服务器ID,该ID必须在该主从中是唯一的,默认是1,该ID可以自行自定义,但必须为数字。server-id=2log-bin=mysql-bin# 以下内容应该可以不写,这个没做测试,就加着吧# 注意:如果binlog-do-db和binlog-ignore-db不加的话,那么默认是同步复制整个mysql数据库。# 表示需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。binlog-do-db=d_sun# 表示不需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。binlog-ignore-db=mysqlbinlog-ignore-db=sysbinlog-ignore-db=information_schemabinlog-ignore-db=performance_schemaskip-name-resolvelog-slave-updatesback_log=100expire_logs_days=3# 表示每个binlog文件最大大小,当此文件大小等于100M时,会自动生成一个新的日志文件。注意:一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。max_binlog_size=100Mcharacter_set_server=utf8mb4sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION# 设置只读read_only=1# 禁止超级管理员写操作,不要禁止,否则不能登录了,具体如何设置请看文章的最后# super_read_only=1
增加 docker-compose.yaml
version: '3.9'services: mysql-master: container_name: mysql57 image: mysql:5.7.36 #docker 容器重启后自动重启该服务 restart: always command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root ports: - 3307:3306 volumes: - ${PWD}/data:/var/lib/mysql - ${PWD}/logs:/var/log/mysql - ${PWD}/slave.cnf:/etc/my.cnf
slave 机器下创建完成后,如下所示:
启动MySQL服务
分别使用以下指令启动两台mysql服务
# 进入这个文件夹cd /usr/local/docker/mysql57# 启动mysql服务docker-compose up -d初始化配置 master 服务(创建账户)
# 登录192.168.0.121这台master服务# 进入docker 容器docker exec -it mysql57 bash# 登录mysqlmysql -u root -proot# 查看server_id是否生效show variables like '%server_id%';# 如果打印以下内容表示生效+----------------+-------+| Variable_name | Value |+----------------+-------+| server_id | 1 || server_id_bits | 32 |+----------------+-------+2 rows in set (0.00 sec)
可以使用 show master status; 查看master状态
# 创建一个专用的账户用户bin log的同步# 账号为:slave 密码为:000000CREATE USER 'slave'@'%' IDENTIFIED BY '000000'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';flush privileges;初始化配置 slave 服务(配置master指向)
# 启动mysql服务docker-compose up -d# 进入docker 容器docker exec -it mysql57 bash# 登录mysqlmysql -u root -proot# 查看server_id是否生效show variables like '%server_id%';# 如果打印以下内容表示生效+----------------+-------+| Variable_name | Value |+----------------+-------+| server_id | 2 || server_id_bits | 32 |+----------------+-------+2 rows in set (0.00 sec)# 查看MASTER状态show slave status\G;# 输出Empty set, 1 warning (0.01 sec)
从节点使用备份账户连接主节点,开启备份
# 执行指令,连接主节点,开启备份# master_host:Master的地址# master_port:Master的端口号# master_user:用于数据同步的用户# maser_password:用于同步的用户的密码# master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值,注意:这里需要登录master机器后,使用 show master status; 获得# master_log_pos:从哪个 Position 开始读, 注意:这里需要登录master机器后,使用 show master status; 获得# master_connect_retry当重新建立主从连接时,如果连接建立失败,间隔多久后重试。change master to master_host='192.168.0.121', master_port=3307,master_user='slave',master_password='000000',master_log_file='mysql-bin.000003',master_log_pos=749; # 启动同步start slave;# 如果出现异常:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository# 则可以执行重置,然后再 start slave;reset slave;
# 设置slave读库禁止超级管理员写入mysql> show global variables like "%read_only%";+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_read_only | OFF || read_only | ON || super_read_only | OFF || transaction_read_only | OFF || tx_read_only | OFF |+-----------------------+-------+5 rows in set (0.00 sec)mysql> set global super_read_only=1;mysql> show global variables like "%read_only%";+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_read_only | OFF || read_only | ON || super_read_only | ON || transaction_read_only | OFF || tx_read_only | OFF |+-----------------------+-------+5 rows in set (0.00 sec)
可以使用 show slave status\G; 查看状态。
如果下边的标红加粗部分(Slave_IO_Running、Slave_SQL_Running)都显示为Yes,表示主从复制一切正常。
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.121 Master_User: slave Master_Port: 3307 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 901 Relay_Log_File: 5c94f1ca2b2d-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 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: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 901 Relay_Log_Space: 534 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: 0Master_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: 1 Master_UUID: 5093c171-3cab-11ec-b8a2-0242c0a89002 Master_Info_File: /var/lib/mysql/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)ERROR:No query specified测试
# 登录192.168.0.121 master 机器# 查看目前所有的数据库show databases;# 创建一个新的数据库CREATE DATABASE `d_sun` CHARACTER SET 'utf8mb4';# 登录192.168.0.122 slave机器# 查看目前所有的数据库,可以看到d_sun这个数据库已经同步过来了。show databases;# 剩下的表数据同步这里就不进行测试了。
只读机器使用超级管理员账户是可以进行修改的,不要进行改动,以免影响主从复制。
标签: #mysql57复制