MySQL主动复制架构

1. 安装数据库

1.1. 下载数据库

1.2. 卸载系统默认mariadb数据库

rpm -qa|grep mariadb
rpm -e mariadb-libs --nodeps  不验证软件包的依赖关系

1.3. 安装数据库(顺序)

rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.26-1.el7.x86_64.rpm

1.4. 修改数据库配置

vim /etc/my.cnf
port=3306
datadir=/mnt/mysql/data
socket=/mnt/mysql/data/mysql.sock

# 开启binlog
server_id=1
log-bin=mysql-bin
binlog-format=ROW

[client]
socket=/mnt/mysql/data/mysql.sock

1.5. 初始化数据库

mysqld --initialize --user=mysql

1.6. 关闭setenforce

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

1.7. 启动数据库

systemctl start mysqld

1.8. 获取数据库密码

grep password /var/log/mysqld.log

1.9. 登陆数据库初始化root密码

mysql -uroot -p
> alter user 'root'@'localhost' identified by 'passwd';

2. 主库

2.1. 创建数据库同步账号

mysql> create user 'repl'@'192.168.8.%' identified by 'rencrui';

mysql> grant replication slave,replication client on *.* to 'repl'@'192.168.8.%';

2.2. 查看binlog

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3. 从库

3.1. 开启binlog

vim /etc/my.cnf
server_id=2
log_bin=mysql-bin
binlog-format=ROW
relay_log=/mnt/mysql/data/mysql-realay-bin

3.2. 连接主库binlog并启动

mysql> change master to
    -> master_host='192.168.8.205',
    -> master_user='repl',
    -> master_password='rencrui',
    -> master_port=6033,
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=156;
Query OK, 0 rows affected, 8 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

3.3. 查看slave状态

> show slave status\G

3.4. 修改从库连接配置

> stop slave 
> change master to 
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=156;
> start slave

3.5. 验证主从集群

主库运行
> show processlist\G;

从库运行
> show processlist\G;

4. 主从配置详解

4.1. master.cnf

  • 主从数据库配置核心部分

[mysqld]
log-bin=mysql-bin  # 设置同步的binary log二进制日志文件名前缀,默认为binlog
server-id=1  # 服务器唯一id,默认为1,值范围为1~2^32−1,集群server-id不能重复
  • 可选配置

binlog-do-db=test  # 需要主从复制的数据库,如多个则重复配置
binlog-ignore-db=mysql  # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步),如多个则重复配置
binlog_cache_size=1M # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_format=row  # 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_expire_logs_seconds=2592000  # 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天

4.2. slave.cnf

  • 主从数据库配置核心部分

[mysqld]
log-bin=mysql-bin  # 设置同步的binary log二进制日志文件名前缀,默认是binlog
server-id=2
  • 可选配置

replicate-do-db=test # 需要主从复制的数据库 ,如多个则重复配置
binlog-ignore-db=mysql # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) ,如多个则重复配置
binlog_cache_size=1M # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 
binlog_format=row # 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) 
binlog_expire_logs_seconds=2592000 # 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天