MySQL主从复制GTID方式部署

本文详细介绍了在Red Hat Enterprise Linux环境下部署MySQL 8.0.16的步骤,包括安装配置、主从复制的搭建及半同步复制的实现。通过具体指令与参数设置,确保了数据库系统的稳定性和数据一致性。
																						note-taker:Ethan_Yang
																				 	recording time: 2019/06/15
																							number of docs:2

系统信息:

操作系统版本:Red Hat Enterprise Linux Server release 7.3 (Maipo)
主备方式:MYSQL (一主一从架构),串行同步
同步方式:半同步
192.168.0.100         mysql 主库
192.168.0.101         mysql 从库
MySQL版本信息:mysql  Ver 8.0.16-commercial 

一、MySQL安装

下载安装二进制安装包:https://dev.mysql.com/downloads/mysql/

1、解压数据库安装包

[root@calt-db01 mysqlsoft]#tar -xzvf mysql-8.0.16-linux-glibc2.12-x86_64.tar

2、作软链接到/usr/local/mysql

[root@calt-db01 mysqlsoft]# ln -s mysql-8.0.16-linux-glibc2.12-x86_64  /usr/local/mysql

3、创建用户

[root@calt-db01 mysqlsoft]# groupadd mysql
[root@calt-db01 mysqlsoft]# useradd -g mysql  -s  /sbin/nologin -d /usr/local/mysql/  -M mysql

4、环境变量

[root@calt-db01 mysqlsoft]# echo PATH=$PATH:/usr/local/mysql/bin >>/etc/profile
[root@calt-db01 mysqlsoft]# source /etc/profile

5、创建必须的目录

[root@calt-db01 mysqlsoft] mkdir -p /mysql/3306/{data,tmp,logs}

6、my.cnf配置文件(部署从库需要修改server_id,rpl开头参数为半同步设置,从库不需要添加)

[client]
port = 3306
socket = /mysql/3306/mysql.sock
 
[mysql]
prompt="\u@db1 \R:\m:\s [\d]> "
no-auto-rehash
 
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /mysql/3306/data/
socket = /mysql/3306/mysql.sock
pid-file = mysql113.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit    = 65535
back_log = 1024
max_connections = 1000
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
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M

slow_query_log = 1
log_timestamps = SYSTEM
slow_query_log_file = /mysql/3306/data/slow.log
Federated

log-error = /mysql/3306/data/error.log
long_query_time = 0.1
log_queries_not_using_indexes =1
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
server-id = 3306110
log-bin = /mysql/3306/logs/mybinlog
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'
binlog_format = row
binlog_checksum = 1
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
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 3000;

transaction_isolation = read-committed
#innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 10240M
innodb_buffer_pool_instances = 4
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_undo_directory = undolog
innodb_undo_tablespaces = 95
 
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_sync = 0
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

**#some var for MySQL 8.0**
innodb_checksums = 1
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
query_cache_size = 0
query_cache_type = 0
innodb_undo_logs = 128
 
innodb_status_file = 1
**#注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快**
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 = 512M

7、目录权限

[root@calt-db01 /]# chown -R mysql:mysql /mysql/3306/
[root@calt-db01]# chown -R mysql:mysql /usr/local/mysql

8、数据库初始化

[root@calt-db01r /]#/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql/  --datadir=/mysql/3306/data/

9、数据库临时生成的初始密码

[root@calt-db01]# more /mysql/3306/data/error.log

在这里插入图片描述

10、启动数据库

[root@calt-db01 support-files]# pwd
/usr/local/mysql/support-files
[root@calt-db01r support-files]#cp mysql.server /etc/init.d/mysqld
[root@calt-db01 support-files]#/etc/init.d/mysqld start
Starting MySQL.. SUCCESS!

11、改root密码

[root@calt-db01  support-files]# mysqladmin -uroot -p password 'root'
Enter password: //此处输入/mysql/3306/data/error.log中的初始密码
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety

12、登录数据库

[root@EQZ-DEV-DB ~]# mysql -uroot -pmysql
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.16-commercial MySQL Enterprise Server - Commercial

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

二、主从复制搭建

1、主库备份

[root@calt-db01 ~]# mysqldump -uroot -proot --single-transaction --master-data=2 --set-gtid-purged=OFF  -A >20190614.sql

2、主库创建复制权限用户

root@db1 22:12:  [(none)]> grant replication slave on *.* to 'repl'@'%' identified by 'repl';

3、备份文件传到从库

[root@calt-db01 ~]# scp -r 20190614.sql  root@192.168.0.101:/root

4、从库导入备份(备库上操作)

[root@calt-db02 ~]# mysql -uroot -proot <20190614.sql

5、查看备份文件pos点

在这里插入图片描述

6、从库配置主从复制

1)
root@db1 22:12:  [(none)]>
CHANGE MASTER TO MASTER_HOST='192.168.0.100',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_PORT=3306,
master_log_file='mybinlog.000002',
master_log_pos=813283428;
2) Myql> Start slave;
3) Myql> Show slave status\G

7、安装半同步配置

1)Master配置
mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> set global rpl_semi_sync_master_timeout = 3000;
2)slave配置
mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
mysql> set global rpl_semi_sync_slave_enabled = 1;

结语:

  1. 上述步骤只是部署了GTID一主一从的半同步架构,并没有配置高可用性架构,主库在发生异常不能提供数据服务时,会导致数据服务的中断。后续推文将进行高可用性的配置,使用第三方脚本keepalived或者MHA的方式。当然,MySql官方也有自己的高可用性架构欧Innodb cluster 和NDB cluster,后续将向大家持续进行实验和推文。
  2. 在正常的运维中,还应有数据库备份和恢复,此文尚未提及,这里简单提下有两种方式,一是使用mysql的企业版mysqlbackup进行物理备份,另一种就是使用mysqldump进行逻辑备份。当然也有一些第三方的备份方式,如:xtrabackup/innobackupex。
  3. Mysql官方企业版还有监控工具monitor,此为网页版,页面布局个人感觉比oracle的em更人性化;当大家手中的数据较多时,可方便进行维护管理。
<think> 首先,用户的问题是关于MySQL主从复制GTID模式下进行手动调整的方法。用户明确表示:"我想查找在MySQL部署主从GTID模式下进行手动调整的方法"。所以,我需要专注于回答如何手动调整MySQL主从复制GTID模式下的配置或问题。 从系统级指令中,我有以下要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 用户提供了三个引用: - 引用[1]:解释GTID是什么和优势。 - 引用[2]:描述GTID主从复制原理。 - 引用[3]:一个change master to命令的示例,但这是针对传统复制的,不是GTID模式。 引用[3]中的命令是传统的基于binlog位置的主从配置,不是GTID模式。在GTID模式下,通常不需要指定master_log_file和master_log_pos,因为GTID会自动定位。 用户说:"上述引用仅供参考,并不是用户真正的需求",所以我不能直接复制这些引用,但可以基于它们提供信息。用户真正的需求是手动调整GTID模式下的主从复制。 关键点: - GTID模式使用全局事务标识符(GTID)来追踪事务。 - 手动调整可能涉及:跳过事务、重新同步、更改配置等。 常见的手动调整场景: 1. **跳过事务**:当主从复制出现错误时,可能需要跳过某个导致错误的事务。 2. **重新配置主从**:如更改主服务器或重新建立复制。 3. **调整GTID设置**:如启用或禁用GTID模式。 4. **处理GTID集合**:如查看GTID状态、重置GTID等。 结构清晰的回答: - 逐步解释如何进行手动调整。 - 使用命令和代码示例。 - 引用信息时添加引用标识。 - 最后生成相关问题。 回答结构: 1. **介绍**:简要解释GTID模式和手动调整的背景。 2. **常见手动调整方法**: - 跳过事务。 - 重新配置主从- 其他调整如重置GTID。 3. **注意事项**:提醒风险。 4. **生成相关问题**。 使用中文回答。 LaTeX:可能不需要数学表达式,除非有公式。例如,GTID格式是server_uuid:transaction_id,但这不是数学公式。所以,可能不需要使用LaTeX数学格式。 生成相关问题:在回答后添加相关问题部分。 引用标识:当引用用户提供的引用时,在末尾添加[^1]、[^2]、[^3]。用户提供了三个引用,我应该自然地引用它们。 步骤: 1. 解释什么是GTID模式(基于引用[1])。 2. 描述手动调整方法: - 跳过事务:在从服务器上使用`SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1`(但在GTID模式下不推荐),更好的是使用`SET GTID_NEXT='GTID'`然后`BEGIN; COMMIT;`来模拟事务。 - 重新配置主从:使用`CHANGE MASTER TO`命令,指定`MASTER_AUTO_POSITION=1`,而不是文件位置。 - 其他:如查看GTID状态(`SHOW SLAVE STATUS\G`),重置GTID(谨慎使用,如`RESET MASTER`或`RESET SLAVE`)。 3. 提供命令示例。 4. 添加引用标识。 5. 生成相关问题。 确保回答可靠:基于MySQL官方文档或标准实践。 最终回答: - 用中文。 - 结构清晰:分点说明。 - 结尾有相关问题。 </think>以下是针对MySQL主从复制GTID模式下进行手动调整的详细解答。GTID(Global Transaction Identifier)模式通过全局唯一事务ID(格式为$<server\_uuid>:<transaction\_id>$)简化了复制管理,但在实际部署中,手动调整可能涉及跳过错误事务、重新同步主从关系或修复数据不一致等问题[^1]。这些操作需要谨慎执行,以避免数据丢失或复制中断。以下步骤基于MySQL标准实践(适用于MySQL 5.6+版本),我将逐步引导您完成常见手动调整方法。 ### 1. **跳过特定错误事务** 当从库因某个事务(如主键冲突)复制失败时,需要手动跳过该事务。在GTID模式下,**不推荐**使用传统的`SQL_SLAVE_SKIP_COUNTER`命令,因为它可能导致GTID集合不一致。替代方法是通过模拟空事务来跳过指定GTID- **步骤**: 1. 在从库上停止复制:`STOP SLAVE;` 2. 查看错误信息:执行`SHOW SLAVE STATUS\G`,记录失败的GTID(例如`server_uuid:123`)。 3. 模拟空事务: ```sql SET GTID_NEXT = 'server_uuid:123'; -- 替换为实际失败的GTID BEGIN; COMMIT; SET GTID_NEXT = 'AUTOMATIC'; ``` 4. 重启复制:`START SLAVE;` - **注意事项**:此方法仅在事务可安全跳过时使用(如数据冲突),跳过后检查数据一致性[^2]。 ### 2. **重新配置主从复制关系** 如果主库故障或需要重建复制链路,手动调整主从配置: - **步骤**: 1. 在从库上停止复制:`STOP SLAVE;` 2. 重置复制状态:`RESET SLAVE ALL;`(清除旧配置)。 3. 使用`CHANGE MASTER TO`命令配置新主库(**启用GTID自动定位**): ```sql CHANGE MASTER TO MASTER_HOST = '192.168.1.100', -- 替换为新主库IP MASTER_PORT = 3306, MASTER_USER = 'repl_user', MASTER_PASSWORD = 'password', MASTER_AUTO_POSITION = 1; -- 关键:启用GTID自动同步 ``` 4. 启动复制:`START SLAVE;` - **验证**:运行`SHOW SLAVE STATUS\G`,确保`Slave_IO_Running`和`Slave_SQL_Running`均为`Yes`,且`Retrieved_Gtid_Set`与主库一致[^1]。 ### 3. **其他常见手动调整** - **重置GTID集合**(谨慎使用): 若GTID集合混乱(如从库意外写入数据),需重置: ```sql RESET MASTER; -- 清空GTID执行历史(先执行STOP SLAVE) SET @@GLOBAL.GTID_PURGED = ''; -- 重置已处理GTID集合 ``` - **强制同步GTID**: 当主从GTID不一致时,手动设置`gtid_purged`: ```sql STOP SLAVE; SET GLOBAL GTID_PURGED = 'server_uuid:1-100'; -- 替换为主库的GTID范围 START SLAVE; ``` - **查看GTID状态**: - 主库:`SHOW MASTER STATUS\G`(输出`Executed_Gtid_Set`)。 - 从库:`SHOW SLAVE STATUS\G`(检查`Executed_Gtid_Set`和`Retrieved_Gtid_Set`)。 ### 注意事项 - **备份优先**:手动调整前,务必备份数据库(使用`mysqldump`或物理备份)。 - **一致性检查**:调整后运行`pt-table-checksum`(Percona工具)验证数据一致性。 - **性能影响**:大事务跳过或重置可能短暂阻塞复制,建议在低峰期操作[^2]。 通过以上方法,您可以安全地处理GTID模式下的常见问题。如果需要更多细节,请提供具体错误日志或场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值