生成的文件是CSV格式,后续可通过LOAD>八、如何避免主从延迟
无论是数据归档还是删除,对于源库,都需要执行DELETE操作。
很多人担心,如果删除的记录数太多,会造成主从延迟。
事实上,pt-archiver本身就具备了基于主从延迟来自动调节归档(删除)操作的能力。
如果从库的延迟超过1s(由 –max-lag 指定)或复制状态不正常,则会暂停归档(删除)操作,直到从库恢复。
默认情况下,pt-archiver不会检查从库的延迟情况。
如果要检查,需通过–check-slave-lag显式设置从库的地址,譬如,
pt-archiver .168.244.10pt_userpt_passemployeesdepartments .168.244.20pt_userpt_pass
这里只会检查192.168.244.20的延迟情况。
如果有多个从库需要检查,需将–check-slave-lag指定多次,每次对应一个从库。
九、常用参数
在执行完归档操作后,执行ANALYZE TABLE操作。
后面可接任意字符串,如果字符串中含有 s ,则会在源库执行 ANALYZE 操作。

如果字符串中含有 d ,则会在目标库执行ANALYZE操作。
如果同时带有 d 和 s ,则源库和目标库都会执行ANALYZE操作。如,
在执行完归档操作后,执行OPTIMIZE TABLE操作。
用法同 –analyze 类似。
指定连接(Connection)字符集。
在 MySQL 8.0之前,默认是latin1。
在 MySQL 8.0中,默认是utf8mb4 。
注意,这里的默认值与MySQL服务端字符集character_set_server无关。
若显式设置了该值,pt-archiver在建立连接后,会首先执行SET NAMES ‘charset_name’操作。
检查源库(目标库)连接(Connection)字符集和表的字符集是否一致。
如果不一致,会提示以下错误:
Character mismatch: DSN uses latin1, table uses gbk.You can disable this check by specifying .
这个时候,切记不要按照提示指定 –no-check-charset 忽略检查,否则很容易导致乱码。
针对上述报错,可将–charset指定为表的字符集。
注意,该选项并不是比较源库和目标库的字符集是否一致。
检查源表和目标表列名是否一致。
注意,只会检查列名,不会检查列的顺序、列的数据类型是否一致。
归档指定列。
在有自增列的情况下,如果源表和目标表的自增列存在交集,可不归档自增列,这个时候,就需要使用–columns显式指定归档列。
只打印待执行的SQL,不实际执行。
常用于实际操作之前,校验待执行的SQL是否符合自己的预期。
使用INSERT IGNORE归档数据。
不删除源库的数据。
使用REPLACE操作归档数据。
在归档有自增主键的表时,默认不会删除自增主键最大的那一行。
这样做,主要是为了规避MySQL 8.0之前自增主键不能持久化的问题。
在对全表进行归档时,这一点需要注意。
如果需要删除,需指定–no-safe-auto-increment。
给出源端实例的信息。
除了常用的选项,其还支持如下选项:
a:指定连接的默认数据库。
b:设置 SQL_LOG_BIN=0 。
如果是在源库指定,则DELETE操作不会写入到Binlog中。
如果是在目标库指定,则INSERT操作不会写入到Binlog中。
i:设置归档操作使用的索引,默认是主键。
显示进度信息,单位行数。
如 –progress 10000,则每归档(删除)10000行,就打印一次进度信息。
TIMEELAPSEDCOUNT:24:19:24:20:24:21
第一列是当前时间,第二列是已经消耗的时间,第三列是已归档(删除)的行数。
十、总结
前面,我们对比了归档操作中不同参数的执行时间。
其中,–bulk-delete –limit 1000 –commit-each –bulk-insert是最快的。不指定任何批量操作参数是最慢的。
但在使用–bulk-insert时要注意 ,如果导入的过程中出现问题,pt-archiver是不会提示任何错误的。
常见的错误有主键冲突,数据和目标列的数据类型不一致。
如果不使用–bulk-insert,而是通过默认的INSERT操作来归档,大部分错误是可以识别出来的。
譬如,主键冲突,会提示以下错误。
DBD::mysql::st execute failed: Duplicate entry key [for Statement with ParamValues: , ] at /usr/local/bin/pt-archiver line .
导入的数据和目标列的数据类型不一致,会提示以下错误。
DBD::mysql::st execute failed: Incorrect integer value: column at row [for Statement with ParamValues: , ] at /usr/local/bin/pt-archiver line .
当然,数据和类型不一致,能被识别出来的前提是归档实例的SQL_MODE为严格模式。
如果待归档的实例中有MySQL 5.6,我们其实很难将归档实例的SQL_MODE开启为严格模式。
因为MySQL 5.6的SQL_MODE默认为非严格模式,所以难免会产生很多无效数据,譬如时间字段中的0000-00-00 00:00:00 。
这种无效数据,如果插入到开启了严格模式的归档实例中,会直接报错。
从数据安全的角度出发,最推荐的归档方式是:
1)先归档,但不删除源库的数据。
2)比对源库和归档库的数据是否一致。
3)如果比对结果一致,再删除源库的归档数据。
其中,第一步和第三步可通过pt-archiver搞定,第二步可通过pt-table-sync搞定。
相对于边归档边删除的这种方式,虽然麻烦不少,但相对来说,更安全。
Mysql到底是怎么实现MVCC的
Mysql到底是怎么实现MVCC的Mysql到底是怎么实现MVCC的?这个问题无数人都在问,但google中并无答案,本文尝试从Mysql源码中寻找答案。 在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段:6字节的事务ID(DB_TRX_ID )7字节的回滚指针(DB_ROLL_PTR)隐藏的ID6字节的事物ID用来标识该行所述的事务,7字节的回滚指针需要了解下Innodb的事务模型。 1. Innodb的事务相关概念为了支持事务,Innbodb引入了下面几个概念:redo logredo log就是保存执行的SQL语句到一个指定的Log文件,当Mysql执行recovery时重新执行redo log记录的SQL操作即可。 当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。 redo log在磁盘上作为一个独立的文件存在,即Innodb的log文件。 undo log与redo log相反,undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。 undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd数据文件中(表空间),即使客户端设置了每表一个数据文件也是如此。 rollback segment回滚段这个概念来自oracle的事物模型,在Innodb中,undo log被划分为多个段,具体某行的undo log就保存在某个段中,称为回滚段。 可以认为undo log和回滚段是同一意思。 锁Innodb提供了基于行的锁,如果行的数量非常大,则在高并发下锁的数量也可能会比较大,据Innodb文档说,Innodb对锁进行了空间有效优化,即使并发量高也不会导致内存耗尽。 对行的锁有分两种:排他锁、共享锁。 共享锁针对对,排他锁针对写,完全等同读写锁的概念。 如果某个事务在更新某行(排他锁),则其他事物无论是读还是写本行都必须等待;如果某个事物读某行(共享锁),则其他读的事物无需等待,而写事物则需等待。 通过共享锁,保证了多读之间的无等待性,但是锁的应用又依赖Mysql的事务隔离级别。 隔离级别隔离级别用来限制事务直接的交互程度,目前有几个工业标准:- READ_UNCOMMITTED:脏读- READ_COMMITTED:读提交- REPEATABLE_READ:重复读- SERIALIZABLE:串行化Innodb对四种类型都支持,脏读和串行化应用场景不多,读提交、重复读用的比较广泛,后面会介绍其实现方式。 2. 行的更新过程下面演示下事务对某行记录的更新过程:1. 初始数据行F1~F6是某行列的名字,1~6是其对应的数据。 后面三个隐含字段分别对应该行的事务号和回滚指针,假如这条数据是刚INSERT的,可以认为ID为1,其他两个字段为空。 2.事务1更改该行的各字段的值当事务1更改该行的值时,会进行如下操作:用排他锁锁定该行
SQL中的判断语句
select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name
sql事件探查器有什么作用
初学者用不到这个,不要学了。 把select,update,delete,insert,这四条语句学好,就可以解决大部份问题了。 我也是学习SQL四年之后,才涉及事件控查器的。 补充: 事实也是如此,对于大多数人来说,SELECT是最多用到的SQL语句,按我的使用经验是占一半以上。 学好用好这一个,就可以解决很多问题。 只有要修改数据时才用到后面三个。 更详细的,你可以BAIDU找“SQL经典语句”,讲得很简单,但是很有用。 另外SQL这个东西,如果不是要考试,可以边用边学,要用到哪个学哪个。 哪个内容不会的,打开SQL的联机丛书,搜索相关的内容,不用看前面的语法和解说,那个太细了,直接到最后看例子,很好的。
发表评论