Linux下 MySQL 主从复制
复制原理:
- Mysql 中有一种日志叫做 bin 日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL
语句(insert,update,delete,create/alter/drop table, grant 等等)。- 主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
- 主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
复制流程图:
- 注意:主从服务器的防火墙都要给mysql端口添加例外。也就是说两台服务器的mysql数据库可以互连。
主库
powershell
# 修改配置
vi /etc/my.cnf
# 或
vim /etc/my.cnf
配置文件 my.cnf 内容 修改完最好重启一下数据库
powershell
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-external-locking
skip_name_resolve
max_connect_errors=10
slow_query_log=on
long_query_time=3
key_buffer_size=128M
read_buffer_size=1M
read_rnd_buffer_size=2M
table_open_cache=64
sort_buffer_size=512K
net_buffer_length=8K
default_storage_engine=InnoDB
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=2
innodb_redo_log_capacity=256M
innodb_log_buffer_size=8M
innodb_redo_log_capacity=8388608
innodb_lock_wait_timeout=50
#-----上面是数据库基本配置可以---下面这个是主要的
#修改名称log-bin=mysql.bin
# Server Id.(可是设置自己ip 这里是 1)
server-id=1
log-bin=mysql-bin
# 需要同步的数据库(替换自己的数据库 这里用的 demo)
binlog-do-db=demo
# 使binlog在每N次binlog写入后与硬盘同步
sync-binlog=1
# 1天时间自动清理二进制日志
binlog_expire_logs_seconds=86400
# 不需要同步的数据库
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = sys
binlog-ignore-db = test
# Error Logging.
从库
powershell
# 修改配置
vi /etc/my.cnf
# 或
vim /etc/my.cnf
配置文件 my.cnf 内容 修改完最好重启一下数据库
powershell
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-external-locking
skip_name_resolve
max_connect_errors=10
slow_query_log=on
long_query_time=3
key_buffer_size=128M
read_buffer_size=1M
read_rnd_buffer_size=2M
table_open_cache=64
sort_buffer_size=512K
net_buffer_length=8K
default_storage_engine=InnoDB
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=2
innodb_redo_log_capacity=256M
innodb_log_buffer_size=8M
innodb_redo_log_capacity=8388608
innodb_lock_wait_timeout=50
#-----上面是数据库基本配置可以---下面这个是主要的
# 主库和从库的Server Id不能相同
# Server Id.
server-id=2
# bind-address=192.168.1.2
relay_log = relay-bin
read_only = 1
# 二进制日志自动删除的天数
binlog_expire_logs_seconds=86400
主库创建授权用户
powershell
# 登录 数据库
mysql -u root -p
# 创建用户--指定 IP 连接(从库IP 192.168.1.2)
CREATE USER '用户'@'IP' IDENTIFIED BY '密码';
# 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO '用户'@'IP';
# 授予最高权限(不推荐)
GRANT ALL PRIVILEGES ON *.* TO '用户'@'IP' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
# 获取状态信息(主从连接会用到)
SHOW MASTER STATUS \G;

从库与主库建立联系
slave 与 master 建立连接,进行数据同步 master_host 主机ip; master_user 账号;master_password 密码;master_log_file、master_log_pos 都是在主机获取的
powershell
CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=876;
获取状态信息
powershell
# 获取状态信息
SHOW SLAVE STATUS \G;
配置成功

相关命令
数据库的
powershell
# 启动数据库
systemctl start mysqld
# 查看数据库状态
systemctl status mysqld
# 停止数据库
systemctl stop mysqld
# 重启数据库
systemctl restart mysqld
复制进程
powershell
# 停止复制进程
STOP SLAVE;
# 启动复制
START SLAVE;
# 重置复制状态,保留配置
RESET SLAVE;
# 完全清除复制配置
RESET SLAVE ALL;
防火墙
powershell
# 启动防火墙
systemctl start firewalld
# 查看防火墙状态
systemctl status firewalld
# 停止防火墙
systemctl stop firewalld
MySQL同步故障:" Slave_SQL_Running:No" 自己的解决方法
方法一:
powershell
# 查看错误信息
SHOW SLAVE STATUS \G;
# 停止复制进程
STOP SLAVE;
# 跳过事件
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
# 启动复制
START SLAVE;
# 查看信息
SHOW SLAVE STATUS \G;
方法二:
MASTER_LOG_FILE 与 MASTER_LOG_POS 需要重新去主库 获取 配置自己的
powershell
# 查看错误信息
SHOW SLAVE STATUS \G;
# 停止复制进程
STOP SLAVE;
# 重新在配置一下 从库与主库建立联系
CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='用户',MASTER_PASSWORD='密码',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=876;
# 启动复制
START SLAVE;
# 查看信息
SHOW SLAVE STATUS \G;