两台服务器做如下操作
1.安装mysql
docker pull mysql:5.7
2.启动以及数据挂载
mkdir /root/mysql/data /root/mysql/log /root/mysql/conf
touch my.conf //mysql的配置文件
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/log:/var/log/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-dp 3306:3306 \
mysql:5.7
3.启动数据库,开机自启
docker start mysql
docker update mysql --always=restart
4.修改配置文件,设置mysql为utf-8编码
[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
server_id=01 //主从服务器id要不一致
binlog-ignore-db=mysql //此参数表示不记录指定的数据库的二进制日志。
log-bin=master-log-bin //开启mysql的binlog日志功能,master-log-bin文件名
binlog_cache_size=1M //binlog缓存大小
binlog_format=mixed //binlog日志格式,mysql默认采用statement,建议使用mixed
expire_logs_days=7 //二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
slave_skip_errors=1062 //忽略主键冲突报错
#MySQL主从同步中,经常遇到的三种同步错误:
#1、在master上delete一条记录,若在slave上没有这条数据,会出现报错。
#2、在master上insert一条记录,若在slave上主键值已经存在,会出现报错。
#3、在master上update一条记录,若在slave上没有这条数据,会出现报错。
#如果slave的my.cnf已经配置了slave_skip_errors参数,则可以自动跳过报错,如果没有配置该参数,则可以用以下方法解决:
#mysql> set global slave_exec_mode='idempotent';
#默认值是strict(严格模式),IDEMPOTENT 模式跳过主键冲突错误和更新删除行不存在错误。
#默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数#ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
# 一些error code代表的错误如下:
# 1007: 数据库已存在,创建数据库失败
# 1008: 数据库不存在,删除数据库失败
# 1050: 数据表已存在,创建数据表失败
# 1051: 数据表不存在,删除数据表失败
# 1054: 字段不存在,或程序文件跟数据库有冲突
# 1060: 字段重复,导致无法插入
# 1061: 重复键名
# 1068: 定义了多个主键
# 1094: 位置线程ID
# 1146: 数据表缺失,请恢复数据库
# 1053: 复制过程中主服务器宕机
# 1062: 主键冲突 Duplicate entry '%s' for key %d
5.查看是否生效
docker exec -it mysql /bin/bash
mysql -uroot -p
show variables like 'character%';
show master status; //显示主服务器状态
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| master-log-bin.000001 | 617 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
6.创建账户给从数据库使用
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
flush privileges;
7.修改salve数据库配置
[client]
default_character_set=utf8
[mysql]
default_character_set=utf8
[mysqld]
character_set_server=utf8
server_id=02
binlog-ignore-db=mysql
log-bin=slave-log-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=relay-log-bin //从主服务器上同步日志文件记录到本地
log_slave_updates=1 //表示slave将复制事件写进自己的二进制日志。当设置log_slave_updates时,你可以让slave扮演其它slave的master
read_only=1 //1是只读
8.重启从mysql,并连接主mysql
change master to master_host='192.168.162.201' , //主服务器ip
master_user='slave' , //连接使用的用户
master_password='123456' , //连接用户的密码
master_port=3306 ,//主服务器端酒
master_log_file='master-log-bin.000002' //binlog文件位置
,master_log_pos=617 //#数据的最新位置
,master_connect_retry=30 //重连时间
,master_retry_count=3; //重连次数
9.查看从服务状态,以及开启主从模式
show slave status \G;
start slave //开启主从模式
show slave status \G;
未开启是状态
开启后