美高梅游戏官网娱乐_美高梅手机登录网站

美高梅游戏官网娱乐是公司推出的企业级即时在线娱乐平台,美高梅手机登录网站业界专业、信誉最好的博彩网站,美高梅游戏官网娱乐拥有最高优惠活动和返水,拥有丰富的管理经验和专业的技术队.。

来自 数据库 2019-12-22 15:02 的文章
当前位置: 美高梅游戏官网娱乐 > 数据库 > 正文

有很八种艺术能够将表的仓储引擎调换到另风度

近日,在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。下面就来简单回忆一下。

有很多种方法可以将表的存储引擎转换成另一种引擎。每种方法都有其优缺点,在这里介绍四种方法:

1、查询业务表数据量,查看到总共有200多w条

选择优先级(pt-online-schema-change > 创建与查询 > 导出和导入 > ALTER TABLE)

SQL> select count from tb_bj_banker_etl;2552381

 

2、查询表内应该去掉的重复数据量,共80多w条

  • ALTER TABLE
SQL> select count from tb_bj_banker_etl where  in (select id from tb_bj_banker_etl group by id having count and rowid not in from tb_bj_banker_etl group by id having count;830099

  将表从一个引擎修改为另一个引擎最简单的方法是使用ALTER TABLE语句。下面的语句将TB表的引擎修改为InnoDB

3、于是,在晚上下班前,执行了下面的语句脚本,为了去重

1 mysql> ALTER TABLE TB ENGINE = InnoDB;
SQL> delete from tb_bj_banker_etl where in (select id from tb_bj_banker_etl group by id having count and rowid not in from tb_bj_banker_etl group by id having count;SQL> commit;

  PS:该方法适用于任何存储引擎。但有一个问题:需要很长的执行时间

4、第二天,到达现场时,发现PL/SQL Developer工具中昨天晚上执行的语句仍在执行中

  MySQL会按行将数据库从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁

首先察觉,80多w的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题?

 

于是查询是否有锁表的用户。

  • 导出和导入(mysqldump)
SELECT A.OWNER, --OBJECT所属用户 A.OBJECT_NAME, --OBJECT名称 B.XIDUSN, B.XIDSLOT, B.XIDSQN, B.SESSION_ID, --锁表用户的session B.ORACLE_USERNAME, --锁表用户的Oracle用户名 B.OS_USER_NAME, --锁表用户的操作系统登陆用户名 B.PROCESS, B.LOCKED_MODE, C.MACHINE, --锁表用户的计算机名称 C.STATUS, --锁表状态 C.SERVER, C.SID, C.SERIAL#, C.PROGRAM --锁表用户所用的数据库管理工具 FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C WHERE A.OBJECT_ID = B.OBJECT_ID AND B.PROCESS = C.PROCESS ORDER BY 1,2 

   为了更好的控制转换的过程,可以使用mysqldump工具将数据导出到文件,然后修改文件中CREATE TABLE语句的存储引擎选项,注意同时修改表名,因为同一个数据库中不能存在相同的表名,即使他们使用的是不同的存储引擎。

在下面结果中可以看到,锁表的只是去重语句的发起会话,并没有其它用户造成锁表,这说明语句仍然在执行嘛?带着疑问,开始尝试解决。

  PS:mysqldump默认会自动在CREATE TABLE语句前加上DROP TABLE语句,不注意这一点可能会导致数据丢失

1 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB ACTIVE DEDICATED 913 3381 plsqldev.exe

  1、下面的语句将DB库中的TB表数据导出到tb.sql文件中:

2 BJHYL tb_bj_美高梅手机登录网站 ,banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 649 41791 plsqldev.exe

1 [root@desktop]# mysqldump -u root -p DB TB > tb.sql

3 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 817 27777 plsqldev.exe

  2、修改tb.sql文件(如果需要备份TB表,请更改表名):

4 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 841 1981 plsqldev.exe

CREATE TABLE `TB` (
  `name` char(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

5、采用分批次,解决去重夯住问题

  3、下面的语句将tb.sql文件导入到DB库中:

由于直接去重无法顺利进行,于是想到了分批次去重的方法,试一下。

1 [root@desktop]# mysql -u root -p DB < tb.sql
第一次: delete from tb_bj_banker_etl where in (select id from tb_bj_banker_etl group by id having count and rowid not in from tb_bj_banker_etl group by id having count and rownum<=100000; commit; 第二次: delete from tb_bj_banker_etl where in (select id from tb_bj_banker_etl group by id having count and rowid not in from tb_bj_banker_etl group by id having count and rownum<=100000; commit; 。。。。。。。 。。。。。。。 。。。。。。。 第八次: delete from tb_bj_banker_etl where in (select id from tb_bj_banker_etl group by id having count and rowid not in from tb_bj_banker_etl group by id having count; commit; 

 

结果:通过将80多万数据划分成以10w数据为单次进行去重操作,总共用时140多秒,完成了去重80万数据的目的。但为何直接处理出现夯死情况,有待后续跟踪分析。

  • 创建与查询(CREATE 和 SELECT)

以上就是临时处理去重80w数据时夯死现象的全部过程,希望可以帮到大家。

  这种方法综合第一种方法的高效和第二种方法的安全。不需要导出整个表的数据,而是首先创建一个新的存储引擎的表,然后利用INSERT...SELECT语法来导数据:

  数据量不大使用以下语句

1 mysql > CREATE TABLE TB2 like TB1;
2 mysql > ALTER TABLE TB2 ENGINE=InnoDB;
3 mysql > INSERT INTO TB2 SELECT * FROM TB1;

  数据量大使用以下语句

1 mysql > CREATE TABLE TB2 like TB1;
2 mysql > ALTER TABLE TB2 ENGINE=InnoDB;
3 mysql > START TRANSACTION;
4 mysql > INSERT INTO TB2 SELECT * FROM TB1 WHERE id BETWEEN x AND y;
5 mysql > COMMIT;

  PS:这样的操作完成后,新表是原表的一个全量复制,原表还在,如需要可以删除原表。

  如果有必要,可以在执行的过程中对原表进行加锁,以确保新表和原表的数据一致。

 

  • 使用Percona Toolkit提供的pt-online-schema-change工具:

  使用以下命令可将DB库中的TB1表转换成InnoDB

1 [root@desktop]# pt-online-schema-change -u root -h 127.0.0.1 -p 123456 --alter='ENGINE=Innodb' --execute A=utf8,D=DB,t=TB1

  执行成功后会有如下提示:

1 Successfully altered `DB`.`TB1`.

  PS:原理为创建临时表->修改修改结构->记录数据->删掉原表->重命名临时表  

 

本文由美高梅游戏官网娱乐发布于数据库,转载请注明出处:有很八种艺术能够将表的仓储引擎调换到另风度

关键词: