主库已有数据配置MySQL8主从同步,我的从库是使用了docker搭建的,已有数据需要先锁表停止写入,再把主库数据导入从库,最后再开启同步
话不多说,开搞
主库配置
通常位置/etc/mysql/mysql.conf.d/mysqld.cnf
,先简单介绍一下几个配置项:
[mysqld]
server-id = 1 # 服务ID,注意主库从库一定要不同的ID
log_bin = /var/log/mysql/mysql-bin.log # binlog存储位置
binlog_format = mixed # 模式
#expire_logs_days = 10 #日志过期时间
max_binlog_size = 100M #日志最大容量,默认100M
# binlog_do_db = dbname # 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可,这里我们选择注释掉,也就是全部数据库
# binlog_ignore_db = dbname # 指定忽略(不记录)二进制日志的数据库,如果某个或某几个不需要同步,可以在这里指定,这里我们全量同步,也注释掉这个了
再提供一个无注释版方便你复制:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = mixed
max_binlog_size = 100M
配置后记得重启MySQL
service mysql restart
从库配置
与主库基本一致,重复项不过多介绍了
[mysqld]
server-id = 2
log-bin = /var/log/mysql/mysql-bin
binlog_format = mixed
max_binlog_size = 100M
#指定relay_log日志的存放路径和文件前缀 ,不指定的话默认以主机名作为前缀
relay_log = /var/log/mysql/relay-bin
read_only = on
skip_slave_start = on
#下面两个参数是把主从复制信息存储到innodb表中,默认情况下主从复制信息是存储到文件系统中的,如果从服务器宕机,很容易出现文件记录和实际同步信息不同的情况,存储到表中则可以通过innodb的崩溃恢复机制来保证数据记录的一致性
master_info_repository = TABLE
relay_log_info_repository = TABLE
同样提供一个纯享版方便复制:
[mysqld]
server-id = 2
log-bin = /var/log/mysql/mysql-bin
binlog_format = mixed
max_binlog_size = 100M
relay_log = /var/log/mysql/relay-bin
read_only = on
skip_slave_start = on
master_info_repository = TABLE
relay_log_info_repository = TABLE
配置后记得重启MySQL
service mysql restart
以下语句在主库的MySQL命令行下执行,其中username
和password
为从库连接主库的用户名和密码,需要自行替换,ipaddress
为从库的ip地址,毕竟出于安全性考虑,不宜让太多ip拥有访问权限,所以这里指定ip而非用*
。
CREATE USER 'username'@'ipaddress' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'username'@'ipaddress';
FLUSH PRIVILEGES;
配置后,在从库主机中尝试用刚刚创建的用户和密码去连接主库,测试是否可以连接成功,如果连接失败,需要找找原因,下面讲几个注意的点,或许有助于你找到问题。
📢 需要注意的几个点:
bind-address = 127.0.0.1
注释掉,并重启MySQL使其生效此步骤主要针对运行一段时间的主库,需要将历史数据导入到从库,保证主从强一致性。
主库锁表停止写操作
在主库MySQL命令行中执行
flush tables with read lock;
主库数据导出
将主库所在主机命令行下使用mysqldump命令导出所有数据
mysqldump -uroot -p --all-databases > all_db.sql
数据导入到从库
将导出的文件传输到从库所在主机,并且执行导入。注意文件路径不要搞错
mysqldump -uroot -p --all-databases < all_db.sql
先查看主库日志状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000046 | 36660 | | | |
+------------------+----------+--------------+------------------+-------------------+
mysql-bin.000046
和 36660
就是我们下面配置从库要用的,当然,这两个值你要以你自己的为准。
在从库MySQL命令行下执行:
CHANGE MASTER TO MASTER_HOST='主库ip地址', MASTER_USER='之前创建的账号', MASTER_PASSWORD='之前创建的账号的密码', MASTER_LOG_FILE='上面刚刚的第一个值', MASTER_LOG_POS=上面的第二个值;
例如(以前文为例,假设主库ip为172.25.1.1):
CHANGE MASTER TO MASTER_HOST='172.25.1.1', MASTER_USER='username', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000046', MASTER_LOG_POS=36660;
启动从库同步,在从库MySQL命令行下执行:
start salve;
恢复主库写入,在主库MySQL命令行下执行:
unlock tables;
在从库MySQL命令行下执行:
show slave status\G;
幸运的话你会看到下面的结果。重点关注Slave_IO_Running
和Slave_SQL_Running
这两个,正常为Yes
,如果Slave_IO_Running
为connecting
说明未能连接成功,你需要重新审视一下上面的第二步,看一下第二步的注意事项。并且你会注意到Slave_SQL_Running_State
也会展示一些状态信息,如果有执行未成功,可以通过查看这个参数进一步了解问题出在哪里。
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 172.25.1.1
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000046
Read_Master_Log_Pos: 36190
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 15072
Relay_Master_Log_File: mysql-bin.000046
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: 36190
Relay_Log_Space: 15275
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: 1
Master_UUID: a11b83a5-3477-11ec-a8d0-00163e2606f8
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica 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:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
至此,恭喜你已经完成了主从同步
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/313