这也就是因为穷,不然谁用一个docker配置主从,哈哈
既然成功了就记录下。过程挺折磨人的。
首先要保证你的电脑安装好了docker
为了保证docker当中主从能正常连网,现在docker里面创建一个网络环境
docker network create --driver bridge mysql_network
有了这个网络环境,启动主服务器
docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -v /my/custom:/etc/mysql/conf.d -d --net mysql-net mysql --server-id=1 --log-bin=mysql-bin
注意要在宿主机的/my/custom 做如下配置:
文件名称: my.cnf
文件内容:[mysqld]
server-id=1
log-bin=mysql-bin
#binlog-do-db=mytest,mytest1
启动完主,再启动从服务器
docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 -d --net mysql-net mysql --server-id=2 --relay-log=mysql-relay-bin --log-bin=mysql-bin --replicate-do-db=mytest,mytest1
注意我后来把replicate-do-db=mytest,mytest1 删了,因为无法正常同步,具体原理不清楚。
从服务器启动之后要进入到容器当中继续配置:
docker exec -it mysql-slave mysql -u root -p
进入容器之后首先要执行change命令
CHANGE MASTER TO MASTER_HOST='内网ip', MASTER_PORT=3307, MASTER_USER='root', MASTER_PASSWORD='123456'
再启动主从同步线程:
start slave;
最后执行 show slave status\G命令查看从服务器的同步信息
show slave status \G;\
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host:
Master_User: root
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 112240
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 112457
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 112240
Relay_Log_Space: 3153052
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: cd8a2dba-014e-11ef-9085-0242ac1a0002
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 10
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
这里面包含了主从同步目前的状态。
好了,其实就完事儿了,但是我可是捣鼓了好半天。遇到了好多问题。
首先就是 docker 拉取mysql8.3的镜像之后,里面没有mysqlbinlog工具,所以无法看到binlog日志。别问我为啥子要看这玩意,还不是主数据库应该同步的库没写到binlog里面来。从镜像里面安装不会,后来就捣鼓着在宿主机上安装一个mysql8.0,里面有mysqlbinlog工具,然后用docker cp将binglog日志直接拖出来到宿主机上不就能看到了么
安利这篇让我在centos上成功按照好了mysql 8.0
在CentOS 7上安装MySQL 8.0_centos7安装mysql8.0gpg密钥-CSDN博客
docker cp 容器id/名词:/var/lib/mysql/mysql-bin.000002 /root/slave
将文件从容器当中拿出来
mysqlbinlog mysql-bin.000001 >> 1.txt 查看binlog日志内容
我的binlog的格式是ROW(行类型),其中的数据就如下所示:
BINLOG '
0XYnZhMBAAAAOwAAAA1ZLgAAAGgAAAAAAAEABW15c3FsAAl0aW1lX3pvbmUAAgP+AvcBAAEBgNAd
1b4=
0XYnZh4BAAAAKQAAADZZLgAAAGgAAAAAAAEAAgAC/wD8BgAAAdAQ3O8=
'/*!*/;
# at 3037494
#240423 16:52:33 server id 1 end_log_pos 3037561 CRC32 0x06fff819 Table_map: `mysql`.`time_zone_name` mapped to number 105
# has_generated_invisible_primary_key=0
# at 3037561
#240423 16:52:33 server id 1 end_log_pos 3037611 CRC32 0xe80cee9a Write_rows: table id 105 flags: STMT_END_F
我遇到问题众多,所以学习到了一些命令,分享给大家方便查看。
在docker当中binlog大概率都在/var/lib/mysql文件夹当中
在mysql命令行执行下命令查看binlog日志地址:
show variables like 'datadir';
如果要做主从同步那么binlog的类型不能是Mix,可以通过下面的命令查看当前数据库设置了啥类型:
SHOW VARIABLES LIKE 'binlog_format';
如果要做主从同步,主库的binlog开关一定要开启
SHOW VARIABLES LIKE 'log_bin';
查看主库日志,能够看到一共有哪些binlog日志:
show master logs;
查看主库状态,能够看到当前
show master status;
在mysql数据库客户端也可以直接查看binlog大概信息。
show binlog events in 'mysql-bin.000001';
show binlog events in 'mysql-bin.000002' from 2 limit 2,10;
好了好了,有啥问题可以留言,没有解散,哈哈~