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 processlist\G *************************** 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 status\G; mysql> show master status\G *************************** 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 status\G *************************** 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 status\G; 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 processlist\G *************************** 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 status\G *************************** 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 status\G *************************** 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