mysql 备份方式和原理

1、mysqldump:

           优点:逻辑备份,生成数据为sql文件格式,单库、单表数据迁移,备份恢复方便,sql备份文件通用,不同数据库之前移植,对INNODB表在线备份

           缺点:单线程,数据量大时备份时间长,sql形式备份恢复时间长,可能在备份过程中非事务表长期锁表影响业务。备份查询所有数据,会刷掉内存中的热点数据。

mysqldump备份过程:

       例:mysqldump -uUser -pPassword [database name],... [table].  > [dump file]

       --无参数:create database --drop table--create table--lock table--disable index--insert data --enable index --unlock table

       --opt:dump文件中包含drop table if exists tablename,insert之前包含锁表语句lock tables tablename write,insert之后包含unlock tables,默认开启,使用--skip-opt禁用

       --compress, -C:主机间数据传输使用数据压缩 (导入的库必须存在)     

           例如: mysqldump --host=host1 --opt sourceDB | mysql --host=host2 -C targetDB

       --no-data:只备份表结构     

       --databases:备份多个数据库,空格分隔       

       --all-databases,-A:备份所有数据库

       --all-tablespaces, -Y:备份所有表空间     

       --tables:备份多个表,空格分隔 

       --where='id=?'[" id='a' "]:条件导出     

       -F:生成新的binlog文件   

       --compatible:导出的数据和其他数据库兼容(ansi,mysql1323,mysql140...)

       --dunp-slave=【1, 2】:获取主库的binlog位置和文件名追加到导出数据文件中,获取的是备机执行到主binlog的位置(relay_master_log_file, exec_master_log_pos) 即stop slave; show slave status; start slave;选项打开--lock-all-tables,除非--single-transaction 被指定;1和2的区别是在导出文件中change master 是否增加注释

       --master-data=【1, 2】:记录当前服务器的binlog,相当于show master status;和--dump-slave方法相似

       --single-transaction:导出一致性状态,导出之前提交begin sql语句,不阻塞业务且保证导出数据库的一致性状态(mvcc适用,不显式加锁通过判断版本对比数据,InnoDB适用,和--lock-tables互斥 (会使挂起的事务隐含提交,导出结合--quick使用))

       --quick, -q:不缓冲查询,直接导出到标准输出,默认打开,--skip-quick取消

       --lock-tables,-l:导出前,锁定所有表。read local锁定表允许MyISAM表并行插入,事务的表(InnoDB),使用 --single-transaction更好,不需要锁定表

       --routines,-R:导出存储过程和自定义函数     

       --events,-E :导出事件

       --flush-logs:导出前刷新日志   

       --flush-privileges:导出mysql数据库之后,发flush privileges语句

       --hex-blob:使用十六进制导出二进制字符串字段,必须使用(binary,varbinary,blob)

       --ignore-table:不导出指定表,多个表需重复多次,一次一个表 --ignore-table=database.table ....

       mysqldump备份过程,为减少数据库中加锁时间,使用--single-transaction开启一个一致性快照事务,为了备份期间能够获得一个与数据一致的binlog pos点,使用--master-data选项

       flush tables/flush tables with read lock:

        1、flush tables 强制关闭所有正在使用的表,并刷新查询缓存,删除查询缓存中所有缓存结果(类似set query cache)

             注意:使用lock tables、执行ddl语句、正在执行DML大事务(无lock in share mode和for update显示加锁),都会阻塞

        2、flush tables with read lock:关闭所有打开的表,并使用全局读锁锁定整个实例下的所有表,(支持快照备份,备份完成后unlock tables释放锁),获取的是一个全局读锁,不是表锁。

             注意:flush table with read lock 不会阻塞日志表的写入(查询日志,慢查询),与XA协议不兼容。

       a. 如果一个会话中使用lock tables语句,执行DDL语句,执行DML大事务(无lock in share mode 和for update显式加锁) 

       b. 另外会话执行flush tables with read lock会阻塞,数据库lock_wait_timeout太短,会导致mysqldump执行flush tables with  read lock语句获取全局读锁超时而导致备份失败

       c. 有lock tables ...read加锁,不允许使用flush tables(会阻塞),如果已使用,需要对其他表执行  刷新,在会话中使用flush tables  tablename with read lock ;   

       刷新表并获取指定表的读锁,首先获取表的独占MDL锁,所以需要等待该表的所有事务提交提交完成,然后刷新表的缓存,重新打开表,获取表读锁。并将MDL锁从独占级别降为共享。该语句获取表读锁,降级MDL锁后,其他会话可以读取表,但不能修改表数据和表结构,执行语句需要reload和lock tables权限,适用于基表(持久表),不适用临时表,对视图使用报错。

        与lock tables 类似,使用该语句对表加锁后,在同一个会话中开启一个事务时,会被自动解锁。

set session transaction isolation level repeatable read:

         后续使用start transaction with consistent snapshot(InnoDB)开启一致性事务快照只支持RR隔离级别。其他隔离级别执行会告警,with consistent snapshot(=start transaction+select,获取一个事务号,在read view中占着,不会请求任何锁)

savepoint设置回滚点:

         savepoint:为了回滚在设置这个点发生变更的数据,savepoint 'identifier' 为事务设置一个命名的事务保存点,字符串标识符

         rollback to savepoint:将事务回滚到指定保存点位置,而不终止事务。且比这个保存点时间上设置更晚的保存点将被删除,同时释放保存点之后事务持有的MDL锁。

       当前事务在回滚点之后修改的行数据被撤销(InnoDB不会释放这些发生修改且被撤销行的行锁,这些修改的数据行行锁存储在内存中;当前事务在回滚点之后插入的行数据也会撤销(InnoDB会释放这些插入的行的行锁,锁信息存储在行数据中的事务ID上,不会单独存储在内存中,新插入的行数据被回滚之后,对应的行锁将被释放)

过程图:

    

               

<think>我们正在讨论MySQL主从复制的工作方式实现原理。根据引用内容,我们可以总结如下: 1. **主从复制的基本概念**(引用[3]):主从复制是建立一个与主数据库完全一致的数据库环境(从数据库)。MySQL支持单向、异步复制,其中一台服务器作为主服务器,另一台或多台作为从服务器。主服务器将更新信息写入二进制日志文件(Binary Log)。 2. **工作原理**(引用[1][2]): - **二进制日志 (Binary Log)**:主服务器上的所有数据更改操作(如INSERT、UPDATE、DELETE)会被记录到二进制日志中。 - **中继日志 (Relay Log)**:从服务器的I/O线程会读取主服务器的二进制日志,并将其写入到从服务器的中继日志中。 - **SQL线程**:从服务器的SQL线程读取中继日志中的事件,并在从服务器上重放这些事件,从而保持与主服务器的数据一致。 3. **复制过程步骤**(引用[2]): a. 主服务器将数据更改记录到二进制日志。 b. 从服务器的I/O线程连接主服务器,请求读取二进制日志。 c. 主服务器上的Binlog Dump线程将二进制日志内容发送给从服务器。 d. 从服务器的I/O线程将接收到的日志内容写入中继日志。 e. 从服务器的SQL线程读取中继日志,并重放其中的事件,更新从服务器数据。 4. **复制方式**(引用[4]): - **基于日志点的复制(传统方式)**:通过指定二进制日志文件名位置来同步。 - **基于GTID的复制(全局事务标识符)**:每个事务分配一个全局唯一标识,简化了复制管理故障恢复。 5. **异步复制**(引用[3]):默认情况下,MySQL主从复制是异步的,即主服务器不等待从服务器确认就提交事务,因此从服务器数据可能略有延迟。 现在,我们根据上述信息详细解释MySQL主从复制的工作方式实现原理。</think>### MySQL主从复制的工作方式与实现原理详解 MySQL主从复制是一种**异步数据同步机制**,通过将主数据库的变更复制到从数据库,实现数据冗余、负载均衡故障转移。以下是其核心工作流程: #### 一、工作方式(两种主流模式) 1. **基于二进制日志位置(传统方式)** - 主库记录变更到二进制日志(binlog) - 从库通过指定文件名位置点同步数据 - 配置示例: ```sql CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; ``` 2. **基于GTID(全局事务标识)** - 每个事务分配唯一ID(格式:`server_uuid:事务序号`) - 从库通过GTID自动定位同步位置 - 配置优势:故障切换时无需手动定位日志位置[^4] #### 二、核心实现原理(三线程协作) 1. **主库线程** - `Binlog Dump线程`: 监控binlog变化,将新增日志事件发送给从库的I/O线程 2. **从库线程** - `I/O线程`: 连接主库请求binlog,写入本地的**中继日志(relay log)** - `SQL线程`: 读取relay log中的事件,在从库上重放SQL语句 #### 三、数据同步流程 ```mermaid graph LR A[主库] -->|1. 数据变更| B[Binlog] B -->|2. 推送事件| C[从库I/O线程] C -->|3. 写入| D[Relay Log] D -->|4. 重放SQL| E[从库SQL线程] E -->|5. 应用数据| F[从库数据文件] ``` #### 四、关键技术特性 1. **异步机制** - 主库提交事务后立即响应客户端,不等待从库同步[^3] - 数据一致性级别:最终一致 2. **二进制日志格式** - `STATEMENT`:记录SQL语句(有函数依赖风险) - `ROW`:记录行数据变化(推荐,安全但日志量大) - `MIXED`:混合模式 3. **过滤规则** - 通过配置`replicate-do-db`等参数实现库/表级过滤 #### 五、典型应用场景 1. **读写分离** - 主库处理写操作,从库承载读查询 2. **数据热备份** - 从库作为实时备份节点(需配合延迟复制防误删) 3. **高可用架构** - 配合MHA/Keepalived实现故障自动切换 > **注意**:主从延迟是常见问题,可通过: > - 优化大事务 > - 启用并行复制(`slave_parallel_workers`) > - 使用半同步复制(`semisync`插件) > 等方式缓解[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值