mariadb主从配置步骤
- 配置开始前注意关闭主从服务器的防火墙或者确保主从服务器之间数据库通信正常;
主服务器(主IP)配置
a. 编辑主服务器的MariaDB配置文件:
sudo vim /etc/my.cnf.d/mariadb-server.cnf
b. 在 [mysqld] 部分添加或修改以下内容:
[mysqld]
server-id = 1
log-bin = /var/log/mariadb/mysql-bin
binlog-format = ROW
bind-address = 主IP
c. 保存并关闭文件。
d. 重启MariaDB服务:
sudo systemctl stop mariadb
sudo systemctl start mariadb
e. 登录到MariaDB:
mysql -u root -p
f. 创建复制用户并授权:
sql
CREATE USER 'root1'@'从IP' IDENTIFIED BY 'root1';
GRANT REPLICATION SLAVE ON *.* TO 'root1'@'从IP';
FLUSH PRIVILEGES;
g. 获取主服务器状态信息:
sql
SHOW MASTER STATUS;
记下 File 和 Position 的值,稍后在从服务器配置中会用到。
h. 退出MariaDB:
sql
EXIT;
从服务器(从IP)配置:
a. 编辑从服务器的MariaDB配置文件:
sudo nano /etc/my.cnf.d/mariadb-server.cnf
b. 在 [mysqld] 部分添加或修改以下内容:
[mysqld]
server-id = 2
relay-log = /var/log/mariadb/mysql-relay-bin
log_slave_updates = 1
read_only = 1
bind-address = 从ip
c. 保存并关闭文件。
d. 重启MariaDB服务:
sudo systemctl stop mariadb
sudo systemctl start mariadb
e. 登录到MariaDB:
mysql -u root -p
f. 设置主服务器信息(使用之前记下的 File 和 Position 值):
sql
CHANGE MASTER TO
MASTER_HOST='主IP',
MASTER_USER='root1',
MASTER_PASSWORD='root1',
MASTER_LOG_FILE='mysql-bin.000001', -- 使用实际的 File 值
MASTER_LOG_POS=123; -- 使用实际的 Position 值
g. 启动从服务器复制进程:
sql
START SLAVE;
h. 检查从服务器状态:
sql
SHOW SLAVE STATUS\G
确保 Slave_IO_Running 和 Slave_SQL_Running 都显示为 Yes。
i. 退出MariaDB:
sql
EXIT;
验证复制
a. 在主服务器上创建一个测试数据库和表:
sql
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE testtable (id INT, name VARCHAR(50));
INSERT INTO testtable VALUES (1, 'Test Data');
b. 在从服务器上检查是否复制成功:
sql
SHOW DATABASES;
USE testdb;
SHOW TABLES;
SELECT * FROM testtable;
问题处理:
问题示例:
ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
问题处理:
- 更改主服务器时的错误:
错误消息 "Could not initialize master info structure"(无法初始化主服务器信息结构)通常发生在复制配置或权限出现问题:
a) 首先,让我们查看 MariaDB 错误日志以获取更详细的信息:
sudo tail -n 50 /var/log/mysql/error.log
或
sudo tail -n 50 /var/log/mariadb/mariadb.log
具体路径可能因系统配置而异。
b) 确保复制用户在主服务器上拥有必要的权限。在主服务器上,创建了一个具有复制权限的用户:
sql
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'slave_ip' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
c) 检查主日志文件和位置是否正确。使用的值('mysql-bin.000001' 和 798)可能不是最新的。在主服务器上使用以下命令检查当前值:
sql
SHOW MASTER STATUS;
- 从服务器状态:
从SHOW SLAVE STATUS\G
输出中,我们可以看到:
- 从服务器当前没有运行(IO 和 SQL 线程都是 "No")
- 主日志文件与设置的不同('mysql-bin.000006' 对比 'mysql-bin.000001')
- 故障排除步骤:
a) 停止从服务器:
sql
STOP SLAVE;
b) 重置从服务器:
sql
RESET SLAVE;
c) 使用正确的信息重新配置主服务器。确保使用主服务器上的当前主日志文件和位置:
sql
CHANGE MASTER TO
MASTER_HOST='从IP',
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=385;
注意:出于安全原因,不建议使用 'root' 作为复制用户。最好为复制创建一个专用用户。
d) 启动从服务器:
sql
START SLAVE;
e) 再次检查从服务器状态:
sql
SHOW SLAVE STATUS\G
查看 Slave_IO_Running: Yes
和 Slave_SQL_Running: Yes
。如果它们都是 "Yes",则复制应该正在工作。
5.
其他注意事项:
- 确保 MariaDB 服务有权限写入
/var/log/mariadb/
目录。 - 检查两台服务器的防火墙设置,确保允许 MariaDB 端口(默认 3306)的通信。
- 定期监控复制状态和日志文件的增长情况。
- 考虑设置日志轮转策略,以防止日志文件占用过多磁盘空间。
- 实施适当的备份策略,不要仅依赖于复制作为唯一的数据保护措施。