基于二进制文件实现
MySQL 主从复制(replication)是一个异步的复制过程。从一个实例(Master)复制到另一个实例(Slave),整个过程需要由 Master 上的 IO 进程 和 Slave 上的 Sql 进程 与 IO 进程 共同完成。 首先 Master 端必须打开 binary log(bin-log),因为整个复制过程实际上就是 Slave 端从 Master 端获取相应的二进制日志,然后在本地完全顺序的执行日志中所记录的各种操作。 原理图如下:
两个 IO线程:主库会创建一个线程,用来发送 binlog 内容到从库;从库I/O线程读取主库的 binlog 输出线程发送的更新并拷贝这些更新到本地文件,其中包括 relay-log(中继日志) 文件 一个 SQL线程:SQL负责将中继日志应用到 slave 数据库中,完成 AB (主从)复制数据同步。
编辑主服务器的 MySQL 配置文件
my.cnf
,一般位于/etc/mysql/my.cnf
或/etc/my.cnf
。
my.cnf
中,找到 [mysqld] 部分,并添加以下配置:server-id = 1 # 主服务器设为1,从服务器可以设为不同的ID
log_bin = /var/log/mysql/mysql-bin.log # 启用二进制日志
binlog_do_db = your_database_name # 可选,指定需要复制的数据库
sudo systemctl restart mysql
mysql -u root -p
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
记下输出结果中的 File
和 Position
值,将在配置从服务器时用到。
编辑从服务器的 MySQL 配置文件
my.cnf
,同样位于/etc/mysql/my.cnf
或/etc/my.cnf
。
my.cnf
中,找到 [mysqld] 部分,并添加以下配置:server-id = 2 # 从服务器设为不同的ID
sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
CHANGE MASTER TO
MASTER_HOST = 'master_server_ip',
MASTER_USER = 'replication_user',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.XXXXXX', -- 使用主服务器上 SHOW MASTER STATUS 得到的值
MASTER_LOG_POS = log_position; -- 使用主服务器上 SHOW MASTER STATUS 得到的值
sudo systemctl start mysql
START SLAVE; -- 开启复制
STOP SLAVE; -- 关闭复制
-- 确保 "Slave_IO_Running" 和 "Slave_SQL_Running" 都显示为 "Yes",表示复制正在正常运行。
SHOW SLAVE STATUS;
在执行上述步骤时,请确保主服务器和从服务器之间的网络通信正常,防火墙允许数据库端口的通信,并在配置过程中使用正确的主机名、IP 地址和密码。如果遇到问题,可以查看 MySQL 日志以找出问题的根本原因。