数据库安装
见 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;