千万级大表如何更快速的创建索引_分享一份生产环境mysql数据库大表归档方案,值得收藏...
生活随笔
收集整理的這篇文章主要介紹了
千万级大表如何更快速的创建索引_分享一份生产环境mysql数据库大表归档方案,值得收藏...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
分享下最近做的一個mysql大表歸檔方案,僅供參考。
整體思路
一、明確哪些大表需做歸檔
1、數據庫表概要信息統計
SELECTt1.table_schema,t1.table_name,`ENGINE`,table_rows,CAST( data_length / 1024.0 / 1024.0 AS DECIMAL ( 10, 2 ) ) `data_size(M)`,CAST( index_length / 1024.0 / 1024.0 AS DECIMAL ( 10, 2 ) ) `index_size(M)`,t2.ct col_count,t3.ct idx_count,create_time,table_comment FROMinformation_schema.TABLES t1LEFT JOIN -- 字段總數( SELECT table_name, COUNT( 1 ) ct FROM information_schema.COLUMNS GROUP BY table_name ) t2 ON t1.table_name = t2.table_nameLEFT JOIN -- 索引總數( SELECT table_name, COUNT( DISTINCT index_name ) ct FROM information_schema.STATISTICS GROUP BY table_name ) t3 ON t1.table_name = t3.table_name WHEREt1.table_schema NOT IN ( 'mysql', 'information_schema', 'performance_schema' ) ORDER BYt1.data_length DESC;2、整理需備份的大表
二、備份大表
1、表定義
或者用navicat導出表結構
?show create table 表名;2、表主鍵、外鍵
--查看表主鍵信息 SELECTt.TABLE_NAME,t.CONSTRAINT_TYPE,c.COLUMN_NAME,c.ORDINAL_POSITION FROMINFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t,INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS c WHEREt.TABLE_NAME = c.TABLE_NAME AND t.CONSTRAINT_TYPE = 'PRIMARY KEY' AND t.TABLE_NAME = '' AND t.TABLE_SCHEMA = '';--外鍵定義SELECTC.TABLE_SCHEMA,C.REFERENCED_TABLE_NAME,C.REFERENCED_COLUMN_NAME,C.TABLE_NAME,C.COLUMN_NAME,C.CONSTRAINT_NAME,T.TABLE_COMMENT,R.UPDATE_RULE,R.DELETE_RULE FROMINFORMATION_SCHEMA.KEY_COLUMN_USAGE CJOIN INFORMATION_SCHEMA.TABLES T ON T.TABLE_NAME = C.TABLE_NAMEJOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R ON R.TABLE_NAME = C.TABLE_NAME AND R.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND R.REFERENCED_TABLE_NAME = C.REFERENCED_TABLE_NAME WHEREC.REFERENCED_TABLE_NAME = 'TABLE_NAME' or C.TABLE_NAME='TABLE_NAME';3、表觸發器
SELECT * FROM information_schema.triggers where event_object_table='table_name';show create trigger trigger_schema.trigger_name;4、表索引
?show index from 表名;三、歷史數據歸檔
1、建立歸檔庫及在歸檔庫中創建歸檔表
create database pas_arch default character set utf8mb4;create table pas_arch.t_att_work_hour_report_dmp1 as select * from pas_prod.t_att_work_hour_report where 1=2;2、歸檔歷史數據
將歷史數據插入到歸檔庫中的歸檔表
?insert into pas_arch.t_att_work_hour_report_dmp1 select * from pas_prod.t_att_work_hour_report where work_date3、確認數據一致
?select count(*) from pas_prod.t_att_work_hour_report where work_date四、表切換
1、在原始庫創建中間表
create table pas_prod.t_att_work_hour_report_tmp as select * from pas_prod.t_att_work_hour_report where 1=2;2、分段insert
insert into pas_prod.t_att_work_hour_report_tmp select * from pas_prod.t_att_work_hour_report where work_date>='2020-01-01 00:00:00' and work_date='2020-03-13 00:00:00' and work_date3、切換表
理論上會影響業務一秒鐘,建議在業務空閑時間段進行
alter table pas_prod.t_att_work_hour_report rename to pas_prod.t_att_work_hour_report_arch;alter table pas_prod.t_att_work_hour_report_tmp rename to pas_prod.t_att_work_hour_report;4、數據補錄
?insert into t_att_work_hour_report select * from t_att_work_hour_report_arch where work_date>='2020-07-13 00:00:00';5、依次添加主外鍵、觸發器、約束、索引及授權
6、業務測試
業務測試反饋正常。
上面的添加主外鍵、觸發器、約束、索引及授權步驟可以考慮在切換表之前,理論上影響業務一秒鐘。
后面會分享更多devops和DBA方面內容,感興趣的朋友可以關注下~
總結
以上是生活随笔為你收集整理的千万级大表如何更快速的创建索引_分享一份生产环境mysql数据库大表归档方案,值得收藏...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式_2_单例模式
- 下一篇: db2 sql执行历史_5 个免费的在线