MySQL主从复制部署
前言
MySQL 8.0 的主从复制是一种常见的数据库高可用和读写分离方案 在做的时候 排了好长时间 才发现是从库的二级制格式和主的不一样 所有很小的问题 下面这些东西就是我最终的结果 如果有更好的建议 大家可以私信我的
一、准备工作
-
两台安装好 MySQL 8.0 的服务器(主库和从库)
主库:Centos7:192.168.3.151/24
从库:Ubuntu:192.168.3.141/24
-
确保两台服务器网络互通,防火墙开放 MySQL 端口(默认 3306)
-
主库和从库的 MySQL 版本保持一致
二、主库(Master)配置
-
修改配置文件
编辑 MySQL 配置文件(通常是
/etc/my.cnf
或/etc/mysql/my.cnf
):bash[mysqld] port = 3306 basedir = /usr/local/mysql datadir = /usr/local/mysql/data log-error = /usr/local/mysql/data/error.log pid-file = /usr/local/mysql/data/mysql.pid socket = /tmp/mysql.sock character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=InnoDB default-authentication-plugin=mysql_native_password sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 主库特有配置 server-id = 1 log_bin = /usr/local/mysql/data/mysql-bin binlog_format = row #PS!!!(从库的格式要和主库一模一样) expire_logs_days = 7 max_binlog_size = 100M #server-id = 1:主库唯一标识(正确,从库需设置不同值) #log_bin = /usr/local/mysql/data/mysql-bin:启用二进制日志(主从复制必需) #binlog_format = row:使用行格式(MySQL 8.0 推荐) #expire_logs_days = 7:自动清理 7 天前的 binlog(避免磁盘占满) #max_binlog_size = 100M:单个 binlog 文件最大 100M(合理设置)
-
重启主库 MySQL 服务
bashsystemctl restart mysqld
-
创建用于复制的用户
登录主库 MySQL:
sqlmysql -u root -p
-
创建用户并授权:
sqlCREATE USER 'aa'@'%' IDENTIFIED WITH mysql_native_password BY '123'; --测试环境密码'123' GRANT ON *.* TO 'repl_user'@'从库IP地址'; FLUSH PRIVILEGES;
-
查看主库状态
sqlSHOW MASTER STATUS; --记录结果中的 File 和 Position 值,后续配置从库需要用到。 --显示结果如下 +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 156 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.06 sec)
三、从库(Slave)配置
-
修改配置文件
编辑从库 MySQL 配置文件:
ini[mysqld] # 从库特有配置 server-id = 2 # 必须与主库不同(建议为2) relay_log = /usr/local/mysql/data/mysql-relay-bin # 启用中继日志 read_only = 1 # 从库只读(防止手动写入数据冲突) log_bin = /usr/local/mysql/data/mysql-bin # 可选,若从库需作为其他从库的主库则启用 binlog_format = row # 与主库保持一致 expire_logs_days = 7 max_binlog_size = 100M
-
重启从库 MySQL 服务
bashsystemctl restart mysqld
-
执行以下命令配置主从关系:
sqlCHANGE MASTER TO MASTER_HOST = '192.168.3.151', MASTER_USER = 'aa', MASTER_PASSWORD = '123, MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 156;
-
启动从库复制进程
sqlSTART SLAVE;
-
查看从库状态
sqlSHOW SLAVE STATUS\G SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 192.168.3.151 Master_User: aa Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 1105 Relay_Log_File: ws-virtual-machine-relay-bin.000004 Relay_Log_Pos: 608 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: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1105 Relay_Log_Space: 1845 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: a98f6ecb-7133-11f0-a001-000c29eaadbf 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)
-
检查以下两个参数是否为 Yes,如果是则表示配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-
PS:
- 配置必须重启生效 :修改
my.cnf
后,务必重启 MySQL 服务,否则binlog_format
不会更新。 - 主从格式严格一致 :
ROW
格式是 MySQL 8.0 主从复制的最佳实践,避免混合使用不同格式。 - 避免从库写数据 :确保从库
read_only = 1
(只读模式),防止手动写入导致的数据冲突。
- 配置必须重启生效 :修改
-
四、验证主从复制
-
在主库创建一个测试数据库和表:
sqlCREATE DATABASE test_repl; USE test_repl; CREATE TABLE test_table (id INT, name VARCHAR(20)); INSERT INTO test_table VALUES (1, 'test');
-
在从库查看是否同步成功:
sqlSHOW DATABASES; USE test_repl; SELECT * FROM test_table;
- 如果从库中能看到主库创建的数据,则说明主从复制配置成功。
五、常见错误
常见问题排查
-
若
Slave_IO_Running
为Connecting
,可能是:- 网络不通
- 主库防火墙未开放 3306 端口
- 复制用户密码错误
- 主库 IP 或端口错误
-
若
Slave_SQL_Running
为No
,可能是:- 主从数据不一致
- 从库执行中继日志
可以通过查看 MySQL 错误日志(通常在 /var/log/mysql/error.log)获取更详细的错误信息 看不懂发给AI~~~~
总结:
好了 其实写下来 就那点东西 不多不少的 为什么排的时候没看日志呢?哎~~ 所以大家要有看日志的习惯
新的一天 键盘还是那个键盘 困还是困 但各自努力吧 祝各位开心!!