缘起:
想在本地使用Docker创建Mysql主从库,后续要实现全自动化,本次先手动实现功能。
步骤:
- 下载镜像
docker pull mysql
- 启动两个mysql容器。
此处MYSQL_ROOT_PASSWORD是重点,设置密码为root否则无法启动
第一个:m1
docker run -p 3306:3306 --name m1 -e MYSQL_ROOT_PASSWORD=root -d mysql
第二个:slave1
docker run -p 3307:3306 --name slave1 -e MYSQL_ROOT_PASSWORD=root -d mysql
- 修改mysql配置文件 /etc/mysql/my.cnf
主要追加3行(可以用linux的sed命令):sed '$a第一行\n第二行' my.cnf.bak > my.cnf # $表示最后,a表示追加内容,\n表示换行,>表示输出到文本
# 主库的配置 log-bin=mysql-bin #开启日志,mysql从库通过日志来更新自己的数据。 server-id=1 binlog-do-db=dbName #这里就是指定要同步的数据库
# 从库的配置 log-bin=mysql-bin #一样的,同上 server-id=2 #id不能相同 replicate-do-db=dbName #唯一区别
分割线:到此就配置完了,下面执行mysql语句就可以完成了。
- 主库创建用户,授权。
注:-- 创建用户 create user 'sync'@'172.17.0.3' identified WITH 'mysql_native_password' BY '123'; -- 授权 grant replication slave on *.* to 'sync'@'172.17.0.3'; -- 使生效 flush privileges;
容器的ip可以通过 cat /etc/hosts 查看;
mysql_native_password可以避免访问时对密码加密的要求;
mysql8之后的版本,用户创建、授权不能同时进行,必须先创建再授权。 - 从库开启同步。
注:-- 下面的master_log_file和master_log_pos在主库show master status命令获得。 -- 这两个标识文件和偏移,决定了我们从哪开始同步 change master to master_host='172.17.0.2',master_user='sync',master_password='123',master_log_file='mysql-bin.000005',master_log_pos=865; -- 开启 start slave; -- 查看状态 show slave status;
show master status;后面可能会有\G,它是把结果旋转90度,在navicate中会报错,没法用。
show slave status;结果中有错误信息,有问题可以根据它的提示来修改。只要Slave_IO_Running和Slave_SQL_Running是Yes,那就表示正常运行了~
未完待续,下次要做成一键全自动的,问题有:
- 创建容器时,修改my.cnf文件
- 分配不同的server-id ,容器名带id
- 启动容器时,获取容器ip,授权