赞
踩
创建 master slave文件夹
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
mysql:5.7
– 不写版本号5.7会拉取最新版Mysql,最新版的授权有变化,需修改授权方式[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# 新添加的在下面
#启用二进制,必须
log-bin=mysql-bin
#填写整数,每个数据库不同
server-id=1
更多配置参考
server-id=1 #任意自然数n,只要保证两台MySQL主机不重复就可以了。
log-bin=mysql-bin #开启二进制日志
auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
binlog-ignore=mysql #忽略mysql库【我一般都不写】
binlog-ignore=information_schema #忽略information_schema库【我一般都不写】
replicate-do-db=aa #要同步的数据库,不填默认所有库
在master文件夹下
docker build -t mysql-master .
不要忘记最后一个“.”
在slave文件夹下
docker build -t mysql-slave .
输入docker images
查看是否成功
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql-master
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql-slave
docker ps -a 查看是否启动成功
docker logs [容器id] 可查看容器启动日志
语法:docker inspect [容器id/容器名]
显示出来的ipaddress就是我们需要用到的ip
记录主容器的ip,后边需要
docker exec -it mysql-master bash
进入容器mysql -uroot -p
登录mysql 回车之后输入密码 (输入密码是看不到的,输入完毕回车就可以)GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';
授权一个账户给slave连接使用show master status;
查看主数据库信息+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 137 | | | |
+------------------+----------+--------------+------------------+-------------------+
重要的是上面的File 以及 position
这里建议,主容器窗口不要关闭,在新开一个窗口进行操作
docker exec -it mysql-slave bash
进入容器
mysql -uroot -p
登录mysql 回车之后输入密码 (输入密码是看不到的,输入完毕回车就可以)
change master to
master_host='172.17.0.4',
master_user='root',
master_log_file='mysql-bin.000003',
master_log_pos=437,
master_port=3306,
master_password='123456';
start slave;
开启从容器复制功能
show slave status\G
查看是否启动成功
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.14 Master_User: user Master_Port: 32768 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 1338 Relay_Log_File: 8d1e3b87d499-relay-bin.000002 Relay_Log_Pos: 1221 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: ... 1 row in set (0.00 sec)
看到 Slave_IO_Running: Yes && Slave_SQL_Running: Yes 即为成功
在主容器窗口 创建一个数据库并新建表添加一条数据
完成之后
在从容器 show databases;
查看是否有了新建的数据库 use [新建数据库的名称]
select * from 表名
能看到数据 即为成功
#查看状态
show global variables like "%read_only%";
# 对所有用户生效,包括super用户(不建议使用)此条 和下边这条 随机一个 按需选择
flush tables with read lock;
# 只对普通用户生效,如slave用户
set global read_only=1;
#查看状态
show global variables like "%read_only%";
# 关闭只读
unlock tables;
set global read_only=0;
演示效果
mysql> show global variables like "%read_only%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ 5 rows in set (0.01 sec) mysql> flush tables with read lock; Query OK, 0 rows affected (0.00 sec) mysql> set global read_only=1; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like "%read_only%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | OFF | | transaction_read_only | OFF | | tx_read_only | OFF | +-----------------------+-------+ 5 rows in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | mytest | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> drop database mytest; ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock mysql>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。