苏州开设网站公司在什么地方,可以做渐变色块拼接的网站,开网店0基础教程,微信外部链接网站最近一个统计系统的大表需要加字段#xff0c;表的引擎是myisam#xff0c;表大小在3亿#xff0c;物理文件在106G。想想都蛋疼。那么这种情况下怎么把字段撸上去呢? 1. 首先想到了《高性能MySQL》提到的直接更改表结构文件#xff08;frm#xff09;#xff0c;但是在经…最近一个统计系统的大表需要加字段表的引擎是myisam表大小在3亿物理文件在106G。想想都蛋疼。那么这种情况下怎么把字段撸上去呢? 1. 首先想到了《高性能MySQL》提到的直接更改表结构文件frm但是在经过测试以后发现提示表损坏了需要repair只好放弃了。 2. 使用pt-online-schema-change刚开始跑没有问题后面在凌晨发现影响业务了也只好放弃了。 3. 最近GitHub开源的gh-ost属于新鲜玩意还没有研究只好放弃。 4. 创建新表load数据最后rename表。前提是表只有insert表是myisam引擎 最后使用了第四种方案把字段加上了。那么下面就来详细说说第三种方案。 我们假设要把tb_yayun表加两个字段uidage。 老表业务在使用的表 mysql show create table tb_yayun\G
*************************** 1. row ***************************Table: tb_yayun
Create Table: CREATE TABLE tb_yayun (id int(11) NOT NULL AUTO_INCREMENT,name char(20) DEFAULT NULL,enter_time datetime NOT NULL,PRIMARY KEY (id),KEY enter_time (enter_time)
) ENGINEMyISAM DEFAULT CHARSETutf8
1 row in set (0.00 sec) 环境准备 1. 一台空闲的服务器没跑业务安装了mysql实例的。在该服务器上面创建新表。 mysql show create table tb_yayun_new\G
*************************** 1. row ***************************Table: tb_yayun_new
Create Table: CREATE TABLE tb_yayun_new (id int(11) NOT NULL AUTO_INCREMENT,name char(20) DEFAULT NULL,enter_time datetime NOT NULL,uid int(11) DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id),KEY enter_time (enter_time)
) ENGINEMyISAM DEFAULT CHARSETutf8
1 row in set (0.00 sec)2. 在线上服务器导出tb_yayun表的数据这里有一个技巧不需要全部导出截止到某一天就行。可以用下面下面命令 mysql -uroot -p -q -s -e use test;select *,, from tb_yayun where enter_time 2016-08-01 00:00:00 /data/tb_yayun.txt3. 把导出的文件拷贝到上面提到的空闲服务器导入时间会很长我当时导入3亿的表花了6小时 LOAD DATA INFILE /data/tb_yayun.txt INTO TABLE tb_yayun_new; 4. 和开发确定一个切换时间我们的数据都是先入队列所以是可以暂停一会儿写入的。和开发确定好一个时间以后比如要在2016-08-02 15:00:00以后切换那么此时还需要做下面工作。还需要补一次数据因为新表的数据只导入到了2016-08-01 00:00:00。所以再次从线上服务器导数据。 mysql -uroot -p -q -s -e use test;select *,, from tb_yayun where enter_time 2016-08-02 00:00:00 and enter_time 2016-08-02 15:00:00 /data/02_tb_yayun.txt 再次拷贝到空闲的服务器导入 LOAD DATA INFILE /data/02_tb_yayun.txt INTO TABLE tb_yayun_new; 5. 当导入完成以后把tb_yayun_new表的物理文件拷贝到线上服务器。MYDMYIfrm注意权限。如果线上有1主3从那么4台服务器都需要拷贝。拷贝完成以后执行flush tables然后每台服务器检查表是否正常。limit一下或者count一下都行。 6. 通知开发停止写入一般是把程序停止一会儿。具体时间不会超过10分钟。当开发说已经停了导入数据的程序以后我们要看看老表是否还有数据写入对于myisam表来说直接count看条数是否有变化就行。如果没有数据写入以后。执行下面的命令 1再次从老服务器导数据我们需要把数据补一致。(线上服务器) mysql -uroot -p -q -s -e use test;select *,, from tb_yayun where enter_time 2016-08-02 15:00:00 /data/15_tb_yayun.txt 2load数据到tb_yayun_new注意会导致从库延时具体延时多久看导入的数据大小 LOAD DATA INFILE /data/15_tb_yayun.txt INTO TABLE tb_yayun_new; 3对比新表老表数据是否一致。如果操作没有错误的话数据肯定是一致的。新表tb_yayun_new老表tb_yayun进行count确认。4老表进行rename操作 alter table tb_yayun rename to tb_yayun_old_20160802; 5新表rename操作 alter table tb_yayun_new rename to tb_yayun; 7. 通知开发那边开启数据导入程序。至此大表加字段完成。 总结 上面提到的方法有非常大的局限性比如必须是myisam表该表只有insert还有就是业务能够忍受5-10分钟没有最新数据。对于前台业务当然无法忍受不过如果是公司的统计系统或者内部人员使用。则完全没问题影响非常小沟通到位就行。 转载于:https://www.cnblogs.com/gomysql/p/5747545.html