mysql 一条命令直接加载主库数据到备库

本文介绍了一种直接加载InnoDB表数据从主库到备库的方法,并提供了具体的命令示例。通过使用--single-transaction选项确保了事务一致性,对于非事务表则推荐使用--lock-all-tables。

如果只包含innoDB表,则可使用如下语句直接加载主库数据到备库

$mysqldump --single-transaction --all-databases --user=root --password=pass1 --port=3306 --host=server1|mysql --host=server2 --user=root --password=pass2 --port=3306

选项 --single-transaction用来保证数据为事务开始前的数据,如果是非事务性表,则可使用--lock-all-tables来保证数据的一致性

后使用change master to 执行二进制文件和位置即可。


### 提高MySQL/MariaDB(从)的写入性能 为了提升的写入性能,可以从多个方面入手: - **并行复制**:启用多线程应用 (MTS),即 `slave_parallel_workers` 参数配置为大于零的数值。这使得多个I/O操作可以在不同的数据对象上并发执行,从而显著加快了重放 binlog 的速度[^1]。 ```sql SET GLOBAL slave_parallel_workers = 8; ``` - **优化InnoDB缓冲池预加载**:通过调整 InnoDB 缓冲区大小 (`innodb_buffer_pool_size`) 和预先加载数据到缓存中 (`innodb_buffer_pool_load_at_startup`, `innodb_buffer_pool_dump_pct`) 来减少磁盘 I/O 开销,进而加速写入过程。 - **批量处理事务**:确保主服务器端启用了 `binlog_group_commit_sync_delay` 及其配套参数 `binlog_group_commit_sync_no_delay_count` ,这样可以让更多的更改被批量化提交至二进制日志文件,减少了每次单独刷盘带来的开销。 - **硬件升级**:增加 SSD 或者 NVMe 这样的高性能存储设作为临时目录 `/tmp` 所在路径;另外考虑采用 RAID 配置以增强 IO 性能。 ### 自动切换主库为只读模式 对于自动检测主从延迟并将主节点设为只读的操作,可以通过编写脚本配合 MySQL 内建函数实现这一目标。下面给出 Python 脚本示例用于监控主从延时情况,并根据条件改变 master 数据的状态: ```python import pymysql from time import sleep def check_replication_lag(cursor): cursor.execute('SHOW SLAVE STATUS') result = cursor.fetchone() if not result['Seconds_Behind_Master']: return False lag_time = int(result['Seconds_Behind_Master']) threshold = 60 * 5 # 设定最大容忍时间为五分钟 return True if lag_time >= threshold else False conn_master = pymysql.connect(host='master_host', user='root', password='password') with conn_master.cursor() as cur: while True: is_lagging = check_replication_lag(cur) if is_lagging and 'READ ONLY' != get_global_variable_value(conn_master, '@@global.read_only'): set_readonly_mode(conn_master) elif not is_lagging and 'OFF' == get_global_variable_value(conn_master, '@@global.read_only'): unset_readonly_mode(conn_master) sleep(60) def get_global_variable_value(connection, variable_name): with connection.cursor() as c: c.execute(f'SELECT @@{variable_name}') value = c.fetchone()[f'{variable_name}'] return value def set_readonly_mode(connection): with connection.cursor() as c: c.execute('SET GLOBAL read_only=ON') def unset_readonly_mode(connection): with connection.cursor() as c: c.execute('SET GLOBAL read_only=OFF') ``` 此代码片段展示了如何周期性地检查主从之间的延迟时间,并依据特定阈值决定是否应该激活全局变量 `read_only` 。需要注意的是,在实际部署之前应当充分测试该逻辑以防止意外行为发生。 ### 确保主库之间的一致性 利用 GTID (Global Transaction Identifiers)可以简化管理流程并且更好地维护一致性。GTID 是一种唯一标识符,它能够跟踪每条已应用于任何给定实例上的语句序列号。一旦开启了 GTID 支持,则不再需要手动指定基于位置的日志坐标来进行增量份或恢复工作[^3]。 要开启 GTID 功能,需编辑 my.cnf 文件中的 `[mysqld]` 段落部分如下所示: ```ini server-id = 1 gtid-mode = ON enforce-gtid-consistency= true log-bin = /var/log/mysql/bin.log master-info-repository = TABLE relay-log-info-repository=TABLE sync-master-info = 1 binlog-format = ROW ``` 重启服务使上述变更生效后,即可创建新的 Slave 并指明 Master 地址而无需关心具体的 Binlog 坐标信息。此外,建议定期验证两者的同步状态,可通过命令 `SHOW MASTER STATUS;` 查看当前正在使用的 Binary Log 名字及其 Position,对比于 Slave 上的结果确认二者保持一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值