设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

从Oracle迁移到MySQL的各种坑及自救方案(5)

发布时间:2021-01-11 07:10 所属栏目:53 来源:网络整理
导读:All MySQL collations are of type PADSPACE. This means that all CHAR,VARCHAR,and TEXT values in MySQL are compared without regard to any trailing spaces. “Comparison” in this context does not includ

All MySQL collations are of type PADSPACE. This means that all CHAR,VARCHAR,and TEXT values in MySQL are compared without regard to any trailing spaces. “Comparison” in this context does not include the LIKE pattern-matching operator,for which trailing spaces are significant.

MySQL校对规则属于PADSPACE,MySQL对CHAR和VARCHAR值进行比较都忽略尾部空格,和服务器配置以及MySQL版本都没关系.

  • explicit_defauls_for_timestamp

MySQL中TIMESTAMP类型和其它的类型有点不一样(在没有设置explicit_defaults_for_timestamp=1的情况下),在默认情况下,如果TIMESTAMP列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动设置该列的值为current timestamp值,表中的第一个TIMESTAMP列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句,那么该列会自动被加上DEFAULT .

CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性.第一个TIMESTAMP列之后的其它的TIMESTAMP类型的列,如果没有指定null属性,也没有指定默认值,那该列会被自动加上DEFAULT ‘0000-00-00 00:00:00’属性.如果insert语句中没有为该列指定值,那么该列中插入’0000-00-00 00:00:00’,并且没有warning.

如果我们启动时在配置文件中指定了explicit_defaults_for_timestamp=1,MySQL会按照如下的方式处理TIMESTAMP列.

此时如果TIMESTAMP列没有显式的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp.并且不会自动的为表中的第一个TIMESTAMP列加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性,除非你在建表时显式的指明.

六、一些性能参数

我们可以在导入数据的时候预先的修改一些参数,来获取最大性能的处理,比如可以把自适应hash关掉,Doublewrite关掉,然后调整缓存区,log文件的大小,把能变大的都变大,把能关的都关掉来获取最大的性能,我们接下来说几个常用的:

  • innodb_flush_log_at_trx_commit

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交时,不会主动触发写入磁盘的操作.

如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.

如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)的操作并不会同时进行.该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作.

注意:由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”.

  • sync_binlog

sync_binlog 的默认值是0,像操作系统刷其它文件的机制一样,MySQL不会同步到磁盘中去,而是依赖操作系统来刷新binary log.

当sync_binlog =N (N>0),MySQL 在每写N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去.

注:如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作.

  • max_allowed_packet

在导大容量数据特别是CLOB数据时,可能会出现异常:“Packets larger than max_allowed_packet are not allowed”.这是由于MySQL数据库有一个系统参数max_allowed_packet,其默认值为1048576(1M),可以通过如下语句在数据库中查询其值:show VARIABLES like ‘%max_allowed_packet%’;

修改此参数的方法是在MySQL文件夹找到my.cnf文件,在my.cnf文件[MySQLd]中添加一行:max_allowed_packet=16777216

  • innodb_log_file_size

InnoDB日志文件太大,会影响MySQL崩溃恢复的时间,太小会增加IO负担,所以我们要调整合适的日志大小.在数据导入时先把这个值调大一点.避免无谓的buffer pool的flush操作.但也不能把 innodb_log_file_size开得太大,会明显增加 InnoDB的log写入操作,而且会造成操作系统需要更多的Disk Cache开销.

  • innodb_log_buffer_size

InnoDB用于将日志文件写入磁盘时的缓冲区大小字节数.为了实现较高写入吞吐率,可增大该参数的默认值.一个大的log buffer让一个大的事务运行,不需要在事务提交前写日志到磁盘,因此,如果你有事务比如update、insert或者delete 很多的记录,让log buffer 足够大来节约磁盘I/O.

  • innodb_buffer_pool_size

这个参数主要缓存InnoDB表的索引、数据、插入数据时的缓冲.为InnoDN加速优化首要参数.一般让它等于你所有的innodb_log_buffer_size的大小就可以,

innodb_log_file_size要越大越好.

  • innodb_buffer_pool_instances

InnoDB缓冲池拆分成的区域数量.对于数GB规模缓冲池的系统,通过减少不同线程读写缓冲页面的争用,将缓冲池拆分为不同实例有助于改善并发性.

总结

  1. 一定要选择合适你的迁移工具,没有哪一个工具是最好的.
  2. 数据的检验非常重要,有的时候我们迁过去很开心,校验时发生错误,这个时候必须要重来.
  3. 重复地迁移是很正常的,合乎每次迁移可能需要很长时间,总会是有错误的,要做好再迁的心态.

文章来自微信公众号:DBAplus社群

?

 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读