0%

数据库主从同步

环境
CentOS 8
MariaDB 10.3.17

主库操作

修改主库配置

/etc/my.cnf.d/mariadb-server.cnf

1
2
3
4
5
# 开启binlog
[mysqld]
server-id = 1
binlog_format = mixed
log-bin = mysql-bin

重启数据库

1
service mariadb restart

创建同步账户

1
2
grant all on *.* to 'user'@'%' identified by 'password';
flush privileges;

备份主库

1
mysqldump --routines --single_transaction --master-data=2 --databases xxx > backup.sql

从库操作

修改从库配置

/etc/my.cnf.d/mariadb-server.cnf

1
2
3
4
5
6
7
8
9
[mysqld]
server-id = 2
relay-log = relay-bin
read_only = on
# binlog_do_db = db1
# binlog_do_db = db2
binlog_ignore_db=mysql
binlog_ignore_db=performance_schema
binlog_ignore_db=information_schema

重启数据库

1
service mariadb restart

导入数据

1
mysql < backup.sql

确认同步位置

1
head -n50 backup.sql

找到类似 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000025', MASTER_LOG_POS=1244342;

设置同步账户密码以及同步位置

1
2
3
4
5
6
7
change master to
master_host='master_host',
master_user='user',
master_password='password',
master_port=3306,
master_log_file='mysql-bin.000025',
master_log_pos=1244342;

启动同步

1
start slave;

检查同步状态

1
show slave status;

确认 Slave_IO_Running 以及 Slave_SQL_Running 是否都为 Yes

其他问题排除

  • 出现 Slave_IO_Running: Connecting,且 Last_IO_Errno: 2003
  1. 网络是否正常
  2. 密码是否正确
  3. MASTER_LOG_POS是否正确
  4. 是否被SELinux策略阻止

1和2可以在从库服务器上直接通过手动使用同步账号连接主库,检查是否可以登陆
3需要确认 backup.sql 中的位置和设置同步时的位置是否相同
4可以通过 setenforce 0 临时关闭SELinux,永久关闭修改 /etc/selinux/config 中,SELINUX=disabled