zoukankan      html  css  js  c++  java
  • mysql5.7的主从切换

    mysql5.7的主从切换
    
    主库: master 10.11.0.211
    从库: slave  10.11.0.210
    
    目标:主从切换,将slave切换为master,master切换为slave
    
    
    一、使用innobackup进行主从同步设置
    
    # 应用的连接数据库的账号配置
    grant select,insert,update,delete on task.* to task_user@"%" identified by "cmslU6WFkX2pBylwINy2T";
    
    # 修改root密码
    update mysql.user set authentication_string = password('root'), password_expired = 'N', password_last_changed = now() where user = 'root';
    
    # 设置主从同步:
    # 备份主库
    innobackupex --defaults-file="/etc/my.cnf" --user=root -p'root' --socket=/tmp/mysql.sock --apply-log --use-memory=1G /opt/2019-12-06_15-51-53
    # 应用事务
    innobackupex --defaults-file="/etc/my.cnf" --user=root --socket=/tmp/mysql.sock --copy-back /data/2019-12-06_15-51-53/
    
    # 配置主从账号
    grant replication slave,reload,super on *.* to rep@'%' identified by 'wsdb123';
    
    # 记录主库的同步位置
    [root@node1 data]# cat 2019-12-06_15-51-53/xtrabackup_binlog_info 
    mysql_bin.000003    154
    
    # 设置主从同步
    change master to master_host='10.11.0.211',master_user='rep',master_password='wsdb123',master_log_file='mysql_bin.000003',master_log_pos=154;
    
    二、进行主从切换操作:
    
    1.锁定主数据写操作:
    
    master: 
    mysql> flush tables with read lock;
    
    2然后修改从数据库为主要数据库:
    
    1> 保证所有从数据库都已经执行了relay log中的全部更新,在从服务器中执行stop slave io_thread,用show processlist检查,查看状态是否是Has read all relay log,表示更新完成.
    slave:
    mysql>stop slave;
    mysql>stop slave io_thread;
    
    mysql>show processlistG
    *************************** 2. row ***************************
    Id: 2
    User: system user
    Host:
    db: NULL
    Command: Connect
    Time: 4757
    State: Has read all relay log; waiting for the slave I/O thread to update it
    Info: NULL
    
    2> 在从服务器上执行stop slave,reset master命令,重置成主数据库
    
    mysql>stop slave;
    
    mysql>reset master;
    
    mysql>reset slave all;   -- 清除同步信息
    
    3> 删除新的主服务器数据库目录中的master.info和relay-log.info文件,否则下次重启时还会按照从服务器来启动,
    关闭新主库的my.cnf配置 read_only
    
    4> 在新的主库中查看binlog日志
    mysql> show master statusG;   
    
    mysql> show master statusG
    *************************** 1. row ***************************
                 File: mysql_bin.000001
             Position: 154
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    
    重新设置主从同步,
    附切换从数据库命令:
    
    change master to master_host='10.11.0.210',master_user='rep', master_password='wsdb123', master_log_file='mysql_bin.000001', master_log_pos=154;
    start slave;
    
    
    5>从服务器上检测是否复制正常(Slave_IO_Running: Yes    &&  Slave_SQL_Running: Yes)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.11.0.210
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql_bin.000001
              Read_Master_Log_Pos: 154
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql_bin.000001
    
    
    
    解锁定原主数据写操作:
    
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)
    
    #修改原主库的my.cnf 打开read_only参数
    
    进行相应的应用检查
    
    数据库的测试:
    主库创建表,并插入数据:
    MySQL [wanxing]> use wanxing;
    
    Database changed
    MySQL [wanxing]> show tables;
    +-------------------+
    | Tables_in_wanxing |
    +-------------------+
    | users             |
    +-------------------+
    1 row in set (0.00 sec)
    
    MySQL [wanxing]> create table itpart(id int,name varchar(30)) ;
    Query OK, 0 rows affected (0.01 sec)
    
    MySQL [wanxing]> insert into itpart(1,'it engineer');
    
    
    从库查询数据是否同步:
    mysql> select * from itpart;
    +------+-------------+
    | id   | name        |
    +------+-------------+
    |    1 | it engineer |
    +------+-------------+
    1 row in set (0.01 sec)

    生产环境切换记录:

    主库和新主库都开启screen 窗口进行操作,避免网络中断引起操作异常
    screen -S changemaster
    
    准备工作:停止数据库的写入程序
    停止监控
    
    1.锁定老的主库写操作:
    
    master: 
    flush tables with read lock;
    set global read_only=on;
    
    show variables like 'read_only';
    
    show master statusG;
    
    2.然后修改从数据库为主要数据库:
    
    1> 保证所有从数据库都已经执行了relay log中的全部更新,在从服务器中执行stop slave io_thread,用show processlist检查,查看状态是否是Has read all relay log,表示更新完成
    
    slave:
    mysql>stop slave;
    mysql>stop slave io_thread;
    
    mysql>show processlistG
    *************************** 2. row ***************************
    Id: 2
    User: system user
    Host:
    db: NULL
    Command: Connect
    Time: 4757
    State: Has read all relay log; waiting for the slave I/O thread to update it
    Info: NULL
    
    在从服务器上执行stop slave,reset master命令,重置成主数据库
    
    mysql>stop slave;
    
    mysql>reset master;
    
    mysql>reset slave all;
    
    # 打开可写操作
    set global read_only=off;
    
    3> 删除新的主服务器数据库目录中的master.info和relay-log.info文件,否则下次重启时还会按照从服务器来启动,
    关闭新主库的my.cnf配置
    read_only  注释掉
    
    #### 修改/etc/hosts配置,进行
    
    # db
    172.16.0.239 inf.nei.prod.mysql.eus
    
    
    4> 在新的主库中查看binlog日志
    
    mysql> show master statusG
    *************************** 1. row ***************************
                 File: mysql_bin.000001
             Position: 154
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    
    
    
    重新设置主从同步,
    附切换从数据库命令:
    
    # 日志标记
    change master to master_host='10.11.0.210',master_user='rep', master_password='wsdb123', master_log_file='mysql_bin.000001', master_log_pos=154;
    start slave;
    
    # 从库中执行
    mysql> change master to master_host='172.16.0.239' ,master_user='rep',master_password='wsdb123',master_auto_position=1;
    Query OK, 0 rows affected, 2 warnings (0.30 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.02 sec)
    
    
    5>从服务器上检测是否复制正常(Slave_IO_Running: Yes    &&  Slave_SQL_Running: Yes)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.11.0.210
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql_bin.000001
              Read_Master_Log_Pos: 154
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql_bin.000001
    
    
    
    解锁定原主数据写操作:
    
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)
    
    注意:
    1.修改原主库的my.cnf 打开read_only参数,和relay-log相关参数
    relay-log                                                   = mysql-relay-bin
    relay-log-index                                             = relay.index
    
    2.注意新主库的read_only参数是动态修改的,一定要修改my.cnf为off,或者直接删掉,避免重启后为on,应用不可写
    
    进行相应的应用检查
    
    
    后续工作:
    1.数据库备份并且做主从同步
    2.从库上做冷备份
    
    添加监控
    
    
    主库:8核32G配置参考
    
    [:~]# cat /etc/my.cnf
    
    # Example MySQL config file for medium systems.
    # 8核 16G
    # This is for a system with little memory (16G) where MySQL plays
    [client]
    #password       = your_password
    port                                                        = 3306
    socket                                                      = /tmp/mysql.sock

    # The MySQL server
    [mysqld]
    user                                                        = mysql
    port                                                        = 3306
    bind-address                                                = 0.0.0.0
    socket                                                      = /tmp/mysql.sock
    datadir                                                     = /data/mysql_data
    pid-file                                                    = /data/mysql_data/mysql.pid
    basedir                                                     = /usr/local/mysql
    tmpdir                                                      = /tmp

    #此开关默认为NULL,即不允许导入导出。
    #secure-file-priv                                           = /opt/upload

    #-------------------------------gobal variables------------------------#
    #默认关闭,涉及到timestamp类型的列自动更新的问题
    explicit_defaults_for_timestamp                 = 1
    ###transaction_write_set_extraction              = XXHASH64  #以便在server收集写集合的同时将其记录到二进制日志。并且是行更改后的唯一标识此标识将用于检测冲突。
    ###loose-group_replication_group_name            = 'ce9be252-2b71-11e6-b8f4-00212889f856' #组的名字可以随便起,但不能用主机的GTID
    ###loose-group_replication_start_on_boot         = off  #为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
    ###loose-group_replication_bootstrap_group       = off #同上
    ###loose-group_replication_local_address         = '192.168.1.88:33071' #写自己主机所在IP
    ###loose-group_replication_group_seeds           ='192.168.1.88:33071,192.168.1.89:33071,192.168.1.90:33071'
    ###loose-group_replication_single_primary_mode   = off  #关闭单主模式的参数
    ###loose-group_replication_enforce_update_everywhere_checks = on #开启多主模式的参数

    skip-external-locking
    skip-name-resolve
    skip-ssl

    #memory is 16G
    key_buffer_size                                             = 16M
    table_open_cache                                            = 2048
    table_definition_cache                                      = 1024
    sort_buffer_size                                            = 4M
    net_buffer_length                                           = 32K
    read_buffer_size                                            = 4M
    read_rnd_buffer_size                                        = 16M

    open_files_limit                                            = 10000
    thread_cache_size                                           = 400
    query_cache_type                                            = 0
    query_cache_size                                            = 32M
    max_write_lock_count                                        = 300
    wait_timeout                                                = 28800
    interactive_timeout                                         = 28800
    net_read_timeout                                            = 1200
    net_write_timeout                                           = 1200

    max_connections                                             = 800
    max_user_connections                                        = 750
    max_connect_errors                                          = 10000
    max_allowed_packet                                          = 256M
    back_log                                                    = 2048
    log_timestamps                                              = system
    performance_schema                                          = OFF
    character_set_server                                        = utf8mb4

    ##当链接数耗尽后,通过设置别用端口,让root可以登录
    extra_max_connections                                       = 2
    extra_port                                                  = 13306

    ###让mysql不区分大小写敏感
    lower_case_table_names                                      = 1

    #explicit_defaults_for_timestamp                            = 1

    #----------------Myisam--------------------------------#
    myisam_recover_options                                      = DEFAULT
    bulk_insert_buffer_size                                     = 32M
    myisam_sort_buffer_size                                     = 64M
    myisam_max_sort_file_size                                   = 256M
    myisam_repair_threads                                       = 1

    #if the query is exec time great than 2 seconds, the query will log to slow log if slowlog is enabled.
    long_query_time                                             = 3
    slow_query_log                                              = On
    slow-query-log-file                                         = /data/mysql_data/slow.log
    show_compatibility_56                                       = on

    # Don't listen on a TCP/IP port at all. This can be a security enhancement,
    # if all processes that need to connect to mysqld run on the same host.
    # All interaction with mysqld must be made via Unix sockets or named pipes.
    # Note that using this option without enabling named pipes on Windows
    # (via the "enable-named-pipe" option) will render mysqld useless!
    #
    #skip-networking

    #----------------------------MySQL Log----------------#
    # Replication Master Server (default)
    # binary logging is required for replication
    log-bin                                                     = mysql-bin
    expire_logs_days                                            = 10
    log_error                                                   = error.log
    log_error_verbosity                                         = 1
    log_warnings                                                = 1

    # binary logging format - mixed recommended
    binlog_format                                               = row
    relay-log                                                   = mysql-relay-bin
    relay-log-index                                             = relay.index
    # required unique id between 1 and 2^32 - 1
    server-id                                                   = 239
    #sql-mode                                                    = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    #sql-mode                                                    = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    sync_binlog                                                 = 1
    log_slave_updates                                           = 1
    #binlog_checksum                                            = NONE
    #slave_skip_errors = 1062,1032

    #------------------------------replicate--------------#
    #排除不需要同步的库表
    #replicate-ignore-db                                        = mysql
    #replicate-ignore-db                                        = sys
    replicate-ignore-db                                         = information_schema
    replicate-ignore-db                                         = performance_schema
    replicate-ignore-db                                         = undolog
    replicate-ignore-db                                         = for_nagios
    replicate-ignore-db                                         = undolog

    #replicate_wild_ignore_table                                = mysql.%
    #replicate_wild_ignore_table                                = sys.%
    replicate_wild_ignore_table                                 = information_schema.%
    replicate_wild_ignore_table                                 = performance_schema.%
    replicate_wild_ignore_table                                 = undolog.%
    replicate_wild_ignore_table                                 = for_nagios.%
    replicate_wild_ignore_table                                 = undolog.%

    #主主复制需要开启
    #auto_increment_offset= 2
    #auto_increment_increment= 2

    #GTID模式复制,需要开启如下
    gtid_mode                                                  = ON
    enforce_gtid_consistency                                   = ON

    #并发复制
    slave-parallel-type                                         = LOGICAL_CLOCK
    slave-parallel-workers                                      = 2
    master_info_repository                                      = TABLE
    relay_log_info_repository                                   = TABLE
    relay_log_recovery                                          = ON

    #跳过slave进程启动参数
    skip-slave-start

    #如果实例为从库,则需要设置为on
    #read_only                                                   = off

    #skip-grant-tables

    #--------------------------------------------------------innoDB------------#
    innodb_rollback_on_timeout
    # Uncomment the following if you are using InnoDB tables
    innodb_data_home_dir                                        = /data/mysql_data
    innodb_data_file_path                                       = ibdata1:1G;ibdata2:1G:autoextend
    innodb_log_group_home_dir                                   = /data/mysql_data
    innodb_undo_directory                                       = /data/mysql_data/undolog/
    innodb_undo_logs                                            = 128
    innodb_undo_tablespaces                                     = 3

    # You can set .._buffer_pool_size up to 50 - 80 %
    #innodb_use_sys_malloc = 0
    #innodb_page_size = 8192
    innodb_buffer_pool_size                                     = 12G
    innodb_buffer_pool_instances                                = 1
    #innodb_additional_mem_pool_size = 8M

    # Set .._log_file_size to 25 % of buffer pool size
    innodb_log_file_size                                        = 256M
    innodb_log_buffer_size                                      = 64M
    innodb_log_files_in_group                                   = 3
    #每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认
    innodb_flush_log_at_trx_commit                              = 1
    innodb_lock_wait_timeout                                    = 120
    #启用独立表空间
    innodb_file_per_table                                       = 1

    #CPU是1颗8核的,那么可以设置
    innodb_read_io_threads                                      = 8
    innodb_write_io_threads                                     = 8

    #默认是0,则表示没有并发线程数限制,所有请求都会直接请求线程执行,当并发用户线程数量小于64,建议设置innodb_thread_concurrency=0,在大多数情况下,最佳的值是小于并接近虚拟CPU的个数
    innodb_thread_concurrency                                   = 12
    innodb_max_dirty_pages_pct                                  = 75
    innodb_flush_method                                         = O_DIRECT

    innodb_purge_threads                                        = 10
    innodb_large_prefix                                         = 1

    #参数待测试
    #innodb_io_capacity                                         = 20000
    #innodb_io_capacity_max                                     = 40000

    #根据CPU核心数来设定
    thread_pool_size                                            = 8
    #thread_handling = pool-of-threads
    thread_pool_oversubscribe                                   = 24

    #thread_handling                             = pool-of-threads
    thread_pool_stall_limit                                     = 100
    thread_pool_max_threads                                     = 30

    #解释: 在启动时把热数据加载到内存。
    innodb_buffer_pool_load_at_startup                          = 1
    #解释: 在关闭时把热数据dump到本地磁盘
    innodb_buffer_pool_dump_at_shutdown                         = 1

    ##默认是8M, 如果一次insert数据量比较多的话, 可以适当增加
    innodb_autoextend_increment                                 = 32

    [mysqldump]
    quick
    max_allowed_packet                                          = 512M

    [mysql]
    no-auto-rehash
    # Remove the next comment character if you are not familiar with SQL
    #safe-updates

    [myisamchk]
    #key_buffer_size = 20M
    #sort_buffer_size = 20M
    key_buffer_size                                             = 200M
    sort_buffer_size                                            = 200M
    read_buffer                                                 = 2M
    write_buffer                                                = 2M

    [mysqld_safe]
    #控制文件打开数的show global status like 'open%file%';比较合适的设置:Open_files / open_files_limit * 100% <= 75%
    open-files-limit                                            = 65535
    log-error                                                   = /data/mysql_data/error.log

    [mysqlhotcopy]
    interactive-timeout

    #启用存储过程、触发器的权限,但是会不适合于主从复制机制,会导致数据的不一致
    log_bin_trust_function_creators                    = 1

  • 相关阅读:
    Linq to OBJECT延时标准查询操作符
    LINQ to XML
    动态Linq(结合反射)
    HDU 1242 dFS 找目标最短路
    HDu1241 DFS搜索
    hdu 1224 最长路
    BOJ 2773 第K个与m互质的数
    ZOJ 2562 反素数
    2016 ccpc 杭州赛区的总结
    bfs UESTC 381 Knight and Rook
  • 原文地址:https://www.cnblogs.com/reblue520/p/11996334.html
Copyright © 2011-2022 走看看