一个docker配置mysql主从服务器

avatar
作者
筋斗云
阅读量:1

        这也就是因为穷,不然谁用一个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;

 

        好了好了,有啥问题可以留言,没有解散,哈哈~ 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!