MySQL主从配置

数据库安装

见 Centos 7 数据库安装

主数据库配置

修改主数据库配置文件
# 备份配置文件
cp /etc/my.cnf /data/bak_my.cnf

# 修改配置文件,下面一段需要一起复制
cat <<EOF > /etc/my.cnf
[client]
port=3306
default-character-set=utf8mb4

[mysql]
port=3306
default-character-set=utf8mb4

[mysqld]
user=mysql

datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock

# 取消密码验证
# skip-grant-tables

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

########## 慢查询 ##############
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

######### Bin Log 主从相关 ###########
server-id=1
log_bin=mysql-bin
binlog_format=MIXED
sync_binlog=1
expire_logs_days=30

# 要同步的数据库
binlog-do-db=test

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

EOF
重启并进入主数据库
# 改下日志目录用户
chown mysql:mysql /var/log/mysql

# 重启数据库
systemctl restart mysql

# 进入 MySQL
mysql -uroot -proot
创建一个库和一个用于同步的账号
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建一个用于同步的账号, 从库IP确定的话 % 需要用 IP 替换
CREATE USER 'slave_sync'@'%' IDENTIFIED BY 'slave_sync_xxx';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave_sync'@'%';

-- 刷新用户权限
flush privileges;

查看 Master 状态
-- 锁库 不让数据在进行写入
flush table with read lock;

-- 确认 bin log 是否开启
show variables like 'log_bin';

-- 查看master状态 File 和 Position 在从库配置要用到
show master status;
Bash 下载数据库
mysqldump -uroot -proot test --events --set-gtid-purged=OFF | gzip > /data/sql/test.sql.gz

scp /data/sql/test.sql.gz 192.168.0.6:~/test.sql.gz
恢复数据库锁表
unlock tables;

从数据库配置

修改从数据库配置文件
# 备份配置文件
cp /etc/my.cnf /data/bak_my.cnf
# 修改配置文件,下面一段需要一起复制
cat <<EOF > /etc/my.cnf
[client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
user=mysql
port=3306
character-set-server=utf8

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

########## 慢查询 ##############
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

########## 从库配置 ############
server-id=110
#根据实际情况决定开启多少个线程用于主从复制
slave_parallel_workers=4

# 要同步的数据库
replicate_do_db=test
# 设定需要忽略的复制表
# replicate-ignore-table=test

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

EOF
重启并进入从数据库
# 改下日志目录用户
chown mysql:mysql /var/log/mysql

# 重启数据库
systemctl restart mysql

gzip -d ~/test.sql.gz

# 进入 MySQL
mysql -uroot -proot
设置从数据库,注意有些变量要根据实际修改
-- 创建一个用于同步的库
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 先停止主从复制
stop slave;

-- 载入数据库
source /root/test.sql

-- 主从配置
CHANGE MASTER TO MASTER_HOST='192.168.0.212',
MASTER_PORT=3306,
MASTER_USER='slave_sync',
MASTER_PASSWORD='slave_sync_xxx',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;

-- 开启主从复制
start slave;

-- 查看状态 
-- 只有【Slave_IO_Running】和【Slave_SQL_Running】都是Yes,则同步是正常的
show slave status \G

-- 如果是No或者Connecting都不行,可查看mysql-error.log,以排查问题
show variables like 'log_error%';

验证数据同步

USE test;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `age` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO user (id, name, age) VALUES (1, '张三', 18);

-- 从库查询验证 建表和新增

UPDATE user SET name='李四' where id=1;

-- 从库查询验证 更新

DELETE FROM user WHERE id=1;

-- 从库查询验证 删除

补充

  • 如果【主服务器】重启mysql服务,【从服务器】会等待与【主服务器】重连。当主服务器恢复正常后,从服务器会自动重新连接上主服务器,并正常同步数据。
  • 如果某段时间内,【从数据库】服务器异常导致同步中断(可能是同步点位置不匹配),可以尝试以下恢复方法:进入【主数据库】服务器(正常),在bin-log中找到【从数据库】出错前的position,然后在【从数据库】上执行change master,将master_log_file和master_log_pos重新指定后,开始同步。

新增从节点注意

主库开启新的从节点权限, 192.168.0.215 是新从库的IP
CREATE USER 'slave_sync'@'192.168.0.215' IDENTIFIED BY 'slave_sync_xxx'

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave_sync'@'192.168.0.215';

-- 刷新用户权限
flush privileges;

posted @ 2021-02-05 09:16  天明听歌  阅读(95)  评论(0编辑  收藏  举报