美文网首页K8s容器
【3.7.2】服务器安装 Docker中安装与配置 Mysql

【3.7.2】服务器安装 Docker中安装与配置 Mysql

作者: 王滕辉 | 来源:发表于2022-02-18 18:28 被阅读0次

    https://www.cnblogs.com/gl-developer/p/6170423.html

    主从

    环境说明:
    Master:192.168.0.103
    Slave:192.168.0.105

    MySQL 的 Master 配置:
    这里列出主要的主从配置my.ini:

    [mysqld]
    
    # The TCP/IP Port the MySQL Server will listen on
    
    port=3306
    
    server-id=103
    
    log-bin=mysql-bin
    expire_logs_days = 7 // 表示日志保留7天,超过7天则设置为过期的
    
    
    # binlog记录内容的方式,记录被操作的每一行
    binlog_format = ROW
    
    # 减少记录日志的内容,只记录受影响的列
    binlog_row_image = minimal
    
    # 指定需要复制的数据库名为db_test
    # 如果备份多个数据库,重复设置这个选项即可
    binlog-do-db = data
    binlog-do-db = nacos
    binlog-do-db = zc_manager
    binlog-do-db = zc_order
    binlog-do-db = zc_security
    
    # 不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可(未测试)
    # binlog-ignore-db=mysql2
    
    
    # 这个参数要加上,否则不会给更新的记录些到二进制文件里(未测试)
    # log-slave-updates=1
    
    # 跳过错误,继续执行复制操作(可选)
    slave-skip-errors=all             #跳过所有错误
    #slave-skip-errors=1062,1053,1146  #跳过指定error no类型的错误
    #具体的错误代码表现如下:
    #1007:数据库已存在,创建数据库失败
    #1008:数据库不存在,删除数据库失败
    #1050:数据表已存在,创建数据表失败
    #1050:数据表不存在,删除数据表失败
    #1054:字段不存在,或程序文件跟数据库有冲突
    #1060:字段重复,导致无法插入
    #1061:重复键名
    #1068:定义了多个主键
    #1094:位置线程ID
    #1146:数据表缺失,请恢复数据库
    
    

    *配置好后,重启Master 的 MySQL服务!!!

    //--------------------------------------------------

    MySQL 的 Slave 配置:

    配置my.ini:

    [mysqld]
    
    # The TCP/IP Port the MySQL Server will listen on
    
    port=3306
    
    server-id = 105
    
    replicate-ignore-db=mysql
    replicate-ignore-db=sys
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    

    *配置好后,重启Slave 的 MySQL服务!!!

    //--------------------------------------------------
    登录master 给同步用户授权

     GRANT REPLICATION SLAVE,replication client on *.* to 'root'@'%' identified by 'Root@123';
    GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by'123456';
    
    show master status;
    

    登录Slave,然后执行下面命令:

    # slave 启动的需要先停止
    mysql> stop slave;
    
    mysql> change master to
    master_host='192.168.0.103',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154,master_port=3357;
    
    
    mysql> start slave;
    
    mysql> show slave status;
    

    查看这两项是否为YES,yes为正常。

    Slave_IO_Running: Yes
    
    Slave_SQL_Running: Yes
    
    

    问题1 Slave_IO_Running No

    发生原因是用docker搭建数据库,复制文件搭建了从库,导致UUIDs一样

    show slave status时发现,那个表有一个单元格有错误的log信息,我就拷贝出来看了:

    Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
    these UUIDs must be different for replication to work.

    原来是我们两台主从服务器的UUIDs是相同的,然后分别去看看两台服务器的/var/lib/mysql/auto.cnf

    果然UUIDs是相同的,随便改变一个数据库的UUIDs的数值,然后重启数据库问题解决

    2 清理日志

    数据库同步一段时间后bin文件不断变多变大,需要磁盘空间不大需要

    show binary logs; 
    show variables like '%log%'; 
    set global expire_logs_days = 7;
    
    PURGE MASTER LOGS TO 'mysql-bin.010';
    PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';
    # 确认全部日志同步完成的也可以执行重置
    reset master;
    

    问题 3 mysql 1872

    因: 启动slave时,使用repository中信息初始化relay log结构失败了,由于我使用的是冷备份文件恢复的实例,在mysql库中的slave_relay_log_info表中依然保留之前relay_log的信息,所以导致启动slave报错

    master info log:该文件保存slave连接master的状态以及配置信息,如用户名,密码,日志执行的位置等。在5.6版本之前,都是使用master.info文件,从5.6开始,通过在my.cnf 中配置 --master-info-repository=TABLE。这些信息会被写入mysql.slave_master_info 表中,代替原来的master.info文件了。

    relay log info log:该文件保存slave上relay log的执行位置。在5.6版本之前,都是使用relay-log.info文件,从5.6开始,通过在my.cnf中配置 --relay-log-info-repository=TABLE,使用mysql.slave_relay_log_info表代替原来的文件。每次当slave上执行start slave时,就会读取该表中的位置信息。

    不要试图手工的更新、插入、删除以上两个表的内容,以免出现意料不到的问题,使用reset slave

    5.6 后 relay-log 改成Table记录了

    #master status and connection information输出到表mysql.slave_master_info中
    master_info_repository = TABLE
    
    #the slave‘s position in the relay logs输出到表mysql.slave_relay_log_info中
    relay_log_info_repository = TABLE
    
    ## relay_log配置中继日志
    #relay-log=/var/lib/mysql/msql-relay-bin
    #relay-log-index=/var/lib/mysql/msql-relay-bin-index
    
    

    问题 4 mysql 1794

    问题出现的原因是因为mysql 版本 不同导致 5.6和5.7, 5.7 版本中的主从信息记录的是在表中 也就是上面说的配置到表中
    第一步查看docker配置的conf位置是否正确,我第一次配置就没配对路径导致一个是Table,一个是FILE
    第二步 查看配置的信息是不是表,确认两个数据版本是同一个,

     show variables like '%repository%';
    

    问题 5、 数据库同步失效的解决

    当数据同步进程失效后,首先手工检查slave主机当前备份的数据库日志文件在master主机上是否存在,在slave主机上运行:

    MySQL> show slave status\G
    

    一般获得如下的信息:

     *************************** 1\. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 172.18.3.3
    Master_User: tongbu
    Master_Port: 3306
    Connect_Retry: 30
    Master_Log_File: MySQL-bin.000001
    Read_Master_Log_Pos: 360
    Relay_Log_File: localhost-relay-bin.000003
    Relay_Log_Pos: 497
    Relay_Master_Log_File: MySQL-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Replicate_Do_DB: bak
    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: 360
    Relay_Log_Space: 497
    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_Log_File描述的是master主机上的日志文件。

    在master上检查当前的数据库列表:

    MySQL> show master logs;
    

    得到的日志列表如下:

    +----------------------+-----------+
    
    | Log_name | File_size |
    
    +----------------------+-----------+
    
    | localhost-bin.000001 | 495 |
    
    | localhost-bin.000002 | 3394 |
    
    +----------------------+-----------+
    

    如果slave主机上使用的的Master_Log_File对应的文件在master的日志列表中存在,在slave主机上开启从属服务器线程后可以自动同步:

    MySQL> start slave;
    

    如果master主机上的日志文件已经不存在,则需要首先从master主机上恢复全部数据,再开启同步机制。

    在slave主机上运行:

    MySQL> stop slave;
    

    在master主机上运行:

    MySQL> stop slave;
    

    在slave主机上运行:

    MySQL> load data from master;
    MySQL> reset master;
    MySQL> start slave;
    

    在master主机上运行:

    MySQL> reset master;
    MySQL>start slave;
    

    注意:LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的数据库上有效。

    问题 6 故障现象:

    进入slave服务器,运行:

    mysql> show slave status\G
    
             .......
                 Relay_Log_File: localhost-relay-bin.000535
                  Relay_Log_Pos: 21795072
          Relay_Master_Log_File: localhost-bin.000094
               <u>Slave_IO_Running: Yes</u>
              <u>Slave_SQL_Running: No</u>
                Replicate_Do_DB:
            Replicate_Ignore_DB:
           ......
    

    解决办法一、

    Slave_SQL_Running: No
    1.程序可能在slave上进行了写操作

    2.也可能是slave机器重起后,事务回滚造成的. 一般是事务回滚造成的: 解决办法: .

    mysql> slave stop;
    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    mysql> slave start;
    

    解决办法二、

    首先停掉Slave服务:slave stop 到主服务器上查看主机状态: 记录File和Position对应的值

    进入master

    mysql> show master status;
    +----------------------+----------+--------------+------------------+
    | File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +----------------------+----------+--------------+------------------+
    | localhost-bin.000094 | 33622483 |              |                  |
    +----------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    

    然后到slave服务器上执行手动同步:

      mysql> change master to
    > master_host='master_ip',
    > master_user='user',
    > master_password='pwd',
    > master_port=3306,
    > master_log_file=localhost-bin.000094',
    > master_log_pos=33622483 ;
    1 row in set (0.00 sec)
    mysql> slave start;
    1 row in set (0.00 sec)
    
    mysql> show slave status\G
    *************************** 1\. row ***************************
    ........
                Master_Log_File: localhost-bin.000094
            Read_Master_Log_Pos: 33768775
                 Relay_Log_File: localhost-relay-bin.000537
                  Relay_Log_Pos: 1094034
          Relay_Master_Log_File: localhost-bin.000094
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
                Replicate_Do_DB:
    

    手动同步需要停止master的写操作!

    问题 7 "Slave_IO_Running: No" MYSQL不同步

    "Slave_IO_Running: No"MYSQL不同步 今天发现Mysql不同步,show slave status查看同步状态如下: Slave_IO_Running: No
    Slave_SQL_Running: Yes 使用start slave也不能同步。后来,先stop slave 再reset slave再start slave就正常了。

    问题8 主从数据库同步延时问题

    https://www.cnblogs.com/qinyujie/p/8891775.html
    mysql 主从复制默认使用单线程的,下面开个多线程.

    show variables like '%slave_parallel%';
    
    STOP SLAVE SQL_THREAD;
    SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
    # 修改工作线程数
    SET GLOBAL slave_parallel_workers=16;
    START SLAVE SQL_THREAD;
    
    show variables like '%slave_parallel%';
    
    show processlist;
    
    UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_transactions%';
    
    UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'WHERE NAME = 'transaction';
    
    # 用视图查看线程的使用情况
    use `data`;
    CREATE VIEW rep_thread_count AS SELECT a.THREAD_ID AS THREAD_ID,a.COUNT_STAR AS COUNT_STAR FROM performance_schema.events_transactions_summary_by_thread_by_event_name a WHERE a.THREAD_ID in (SELECT b.THREAD_ID FROM performance_schema.replication_applier_status_by_worker b);
    
    SELECT SUM(COUNT_STAR) FROM rep_thread_count INTO @total;
    
    SELECT 100*(COUNT_STAR/@total) AS thread_usage FROM rep_thread_count;
    
    # 同步的时间修改
    SET GLOBAL binlog_group_commit_sync_delay = 1000000;
    # 高并发时 达到20 没有达到 1秒也提交
    SET GLOBAL binlog_group_commit_sync_no_delay_count = 20;
    
    

    修改mysql 考虑使用半同步,mysql默认是异步的,半同步保证至少一个从库同步事务.

    问题9 Mysql replication error 1594(从库relaylog损坏)

    show slave status\G;
    

    找到 Relay_Master_Log_FileExec_Master_Log_Pos
    使用reset slave; 清理掉之前的relaylog,
    从之前执行到的位置开始同步。

     stop slave;
     reset slave;
     change master to master_host='192.168.0.103',master_user='backup',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=1111111,master_port=3357;
     start slave;
    
    

    点波关注 系统搭建(docker)

    相关文章

      网友评论

        本文标题:【3.7.2】服务器安装 Docker中安装与配置 Mysql

        本文链接:https://www.haomeiwen.com/subject/mzddlrtx.html