MySQL主从复制之GTID复制
原文: https://www.cnblogs.com/hmwh/p/9198705.html
GTID复制又叫全局事物ID(global transaction ID),是一个已提交事物的编号,并且是一个全局唯一的编号,MYSQL5.6版本之后在主从复制类型上新增了GTID复制。
GTID是由server_uuid和事物id组成的,即GTID=servier_uuid:transacton_id。Server_uuid是在数据库启动过程中自动生成的,每台机器的server-uuid不一样。UUID存放在数据目录的auto.cnf文件下。而trasaciton_id就是事物提交时由系统顺序分配的一个不会重复的序列号。
3.1GTID存在的价值
1、GTID使用master_auto_position=1 代替了基于binlog和position号的主从复制搭建的方式,更便于主从复制的搭建。
2、GTID可以知道事务在最开始是在哪个实例上提交的。
3、GTID方便实现主从之间的failover,再也不用不断的去找position和binlog。
3.2GTID搭建模式
GTID不需要传统的binlog和position号了,而是在从库”change master to”时使用”master_auto_position=1”的方式搭建,这就让操作变得更加方便和可靠了。
3.3配置前期准备
在安装好主从数据库之后:
主库需要以下配置:
gtid_mode=on
enforce_gtid_consistency=on
log_bin=on
从库需要以下配置:
servier-id 主从库不能一样。
gtid_mode=on
enforce_gtid_consistency=on
log_slave_updates=1
主库操作:
创建主从复制账号
create user 'rep'@'192.16.20.%' identified by 'mysql';
grant replication slave on *.* to 'rep'@'172.16.20.%';
show grants for 'rep'@'172.16.20.%';
如果不同网段建议主从各建各的。
初始化:
/usr/local/mysql5.7/bin/mysqldump -S /tmp/mysql3307.sock --single-transaction -uroot -pmysql --master-data=2 -A > slave.sql(我全库导入的有问题,换成绝对路径就行,只用的test库)
注意:必须加参数 –master-data=2,让备份出来的文件中记录备份这一刻binlog文件与position号,为搭建主从环境做准备。查看备份文件中记录的当前binlog文件和position号。
scp salve.sql 172.16.20.21:/binlogbak
test库操作:
mysqldump -S /tmp/mysql3307.sock --single-transaction -uroot -pmysql --master-data=2 --database test > slave_test.sql
注意,如果主从GTI不一样,数据一致可以:
set global gtid_purged='*******';
如果数据不一样,GTID也不一样,建议按照下面先reset从库:reset master;
mysql -S /tmp/mysql3307.sock -uroot -pmysql < slave_test.sql
注意:多次恢复会报错,因为里面已经有gtid的信息了。
如果你还想继续强制恢复,可以在从库上 reset master ;reset后,gtid_executed,gtid_purged为空。
show global variables like '%gtid%';
3.4主从配置
1、如果是在已经跑的服务器,你需要重启一下mysql server。
2、启动之前,一定要先关闭master的写入,保证所有slave端都已经和master端数据保持同步。
3、所有slave需要加上skip_slave_start=1的配置参数,避免启动后还是使用老的复制协议。
在数据库命令行执行配置主从命令。
change master to master_host='172.16.20.32',master_port=3307,master_user='rep',master_password='mysql',master_auto_position=1;
提示:master_log_file='mysql-binlog.000010',MASTER_LOG_POS=797 这两个参数替换成了 master_auto_position=1
show slave status\G;
start slave;
stop slave;
reset slave all; 清空从库的所有配置信息。
start slave;
一般复制建议半同步+GTID 复制:
附带主从参数:
主:
[root@mysql5 ~]# cat /etc/my3307.cnf
[client]
port = 3307
socket = /tmp/mysql5.7.sock
[mysql]
prompt="\u@db \R:\m:\s [\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3307
basedir = /usr/local/mysql5.7
datadir = /mydata/mysql/mysql3307/data
socket = /tmp/mysql3307.sock
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
event_scheduler=1
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
secure_file_priv=/tmp
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 500
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /mydata/mysql/mysql3307/logs/slow.log
log-error = /mydata/mysql/mysql3307/logs/error.log
long_query_time = 0.5
server-id = 3307101
log-bin = /mydata/mysql/mysql3307/logs/mysql-binlog
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 500M
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 500M
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
innodb_status_file = 1
innodb_status_output = 0
innodb_status_output_locks = 0
#performance_schema
performance_schema = 1
performance_schema_instrument = '%=on'
#innodb monitor
innodb_monitor_enable="module_innodb"
innodb_monitor_enable="module_server"
innodb_monitor_enable="module_dml"
innodb_monitor_enable="module_ddl"
innodb_monitor_enable="module_trx"
innodb_monitor_enable="module_os"
innodb_monitor_enable="module_purge"
innodb_monitor_enable="module_log"
innodb_monitor_enable="module_lock"
innodb_monitor_enable="module_buffer"
innodb_monitor_enable="module_index"
innodb_monitor_enable="module_ibuf_system"
innodb_monitor_enable="module_buffer_page"
innodb_monitor_enable="module_adaptive_hash"
[mysqldump]
quick
max_allowed_packet = 32M
从:
[root@rac1 ~]# cat /etc/my3307.cnf
[client]
port = 3307
socket = /tmp/mysql5.7.sock
[mysql]
prompt="\u@db \R:\m:\s [\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3307
basedir = /usr/local/mysql5.7
datadir = /mydata/mysql/mysql3307/data
socket = /tmp/mysql3307.sock
character-set-server = utf8mb4
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
rpl_semi_sync_slave_enabled=1
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 500
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /mydata/mysql/mysql3307/logs/slow.log
log-error = /mydata/mysql/mysql3307/logs/error.log
long_query_time = 0.1
server-id = 3307102
log-bin = /mydata/mysql/mysql3307/logs/mysql-binlog
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 500m
max_binlog_size = 200m
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 1g
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 1G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
innodb_status_file = 1
innodb_status_output = 0
innodb_status_output_locks = 0
performance_schema = 1
performance_schema_instrument = '%=on'
#innodb monitor
innodb_monitor_enable="module_innodb"
innodb_monitor_enable="module_server"
innodb_monitor_enable="module_dml"
innodb_monitor_enable="module_ddl"
innodb_monitor_enable="module_trx"
innodb_monitor_enable="module_os"
innodb_monitor_enable="module_purge"
innodb_monitor_enable="module_log"
innodb_monitor_enable="module_lock"
innodb_monitor_enable="module_buffer"
innodb_monitor_enable="module_index"
innodb_monitor_enable="module_ibuf_system"
innodb_monitor_enable="module_buffer_page"
innodb_monitor_enable="module_adaptive_hash"
[mysqldump]
quick
max_allowed_packet = 32M
4、GTID复制与传统复制的切换
主:172.16.20.32
从:172.16.10.21
a) GTID切换成传统复制
从库信息:
show slave status\G;
主库:
从库切换操作:
stop slave;
change master to master_auto_position=0,master_host='172.16.20.32', master_port=3307,master_user='rep',master_password='mysql',Master_Log_File='mysql-binlog.000007',Master_Log_Pos=194;
start slave;
主从 数据库服务器上 同时,依次 执行以下操作:
set global gtid_mode='on_permissive';
set global gtid_mode='off_permissive';
主从 关闭GTID功能:
set global enforce_gtid_consistency=off;
set global gtid_mode=off;
把gtid_mode=off和enforce_gtid_consistency=off写入配置文件my3307.cnf中。重启后可以继续生效,并进行测试。
b) 传统复制切换成GTID过程
主从数据库服务器同时修改以下参数:
set global enforce_gtid_consistency=warn; error log 不会出现警告信息,如果有,需要先修复,才能继续后面操作。
set global enforce_gtid_consistency=on;
set global gtid_mode=off_permissive;
set global gtid_mode=on_permissive;
确认从库没等待的事务:
show global status like '%ongoing%';
0代表没有等待的事务。
主从库上同时设置gtid_mode=on;
set global gtid_mode=on;
show variables like '%gtid%';
把传统复制模式改为(GTID)复制。
stop slave;
change master to master_auto_position=1;
查看并进行测试:
主:
从:
例如主库:
从库:
5、GTID使用限制条件
GTID复制是针对事物,一个gtid对于一个事务。
1、 不能使用create table table_name select * from table_name。
2、 在一个事务中即包含事务表的操作,又包含非事物表。
3、 不支持create temporary table or drop temporary table语句操作。
4、 使用GTID复制从库调过错误,不支持执行slave_skip_errors。
About Me
........................................................................................................................ ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr )上有同步更新 ● 本文itpub地址: http://blog.itpub.net/26736162 ● 本文博客园地址: http://www.cnblogs.com/lhrbest ● 本文CSDN地址: https://blog.csdn.net/lihuarongaini ● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ........................................................................................................................ ● QQ群号: 230161599 (满) 、618766405 ● 微 信群:可加我微 信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友 ( 646634621 ) ,注明添加缘由 ● 于 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成 ● 最新修改时间:2019-07-01 06:00 ~ 2019-07-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ........................................................................................................................ ● 小麦苗的微店 : https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书 : http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班 : http://blog.itpub.net/26736162/viewspace-2148098/ ● 小麦苗腾讯课堂主页 : https://lhr.ke.qq.com/ ........................................................................................................................ 使用 微 信客户端 扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr )及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。 ........................................................................................................................ |
![]() | ![]() |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2651411/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26736162/viewspace-2651411/