MySQL 5.6對大表做歸檔
環境:MySQL 5.6 主從環境(Keepalived架構)
4000W行大表進行歷史資料歸檔。
方案:為儘量降低對業務影響,決定採取下列方案。
1、在主庫建立 2016、2017、2018、2019的4個歷史表結構。
2、在從庫建立test庫,並建立 2016、2017、2018、2019的4個歷史表結構,在從庫的主表上用insert into語句根據時間欄位把資料插入test庫的2016、2017、2018、2019的歷史表裡面。分拆為2016、2017、2018、2019。
3、用Navicat把 2016、2017、2018、2019匯出為SQL檔案,並生成主表的DELETE語句的TXT檔案。
4、用Python指令碼把 SQL檔案和 TXT檔案進行處理,分批匯入到 2016、2017、2018、2019的4個歷史表,並刪除主錶的歷史資料。
5、對主表進行收縮。
完成歸檔。
1、在主庫建立歷史表的表結構。
CREATE TABLE `upload_order_header_2016` (
`id` bigint(22) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`company` varchar(25) DEFAULT NULL COMMENT '貨主',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、從庫建立test庫,同樣建立 歷史表的表結構。
在從庫上用insert into語句把2016年的歷史資料插入test庫的2016年的歷史表。
insert into test.upload_order_header_2016 select * from log_db.upload_order_header
where add_time < unix_timestamp('2017-01-01 00:00:00');
insert into test.upload_order_header_2017 select * from log_db.upload_order_header
where add_time >= unix_timestamp('2017-01-01 00:00:00') and
add_time < unix_timestamp('2018-01-01 00:00:00');
3、用 Navicat把 2016匯出為SQL檔案,舉例:
匯出的是純insert的SQL指令碼。
匯出Delete語句:
4、使用Python指令碼批量執行上述指令碼。
先insert到目標主庫的歷史表裡,再delete目標主庫的歷史資料。
Python指令碼如下:
load_sql_v1.py:
# coding:utf8
"""
1、更新資料庫配置
2、變更待執行檔案檔名為SQL.sql
3、執行檔案
"""
import pymysql
import time
DB_IP = "192.168.22.10"
DB_USER = "DBA"
DB_PWD = "XXXXXX"
DB_DATABASE = "log_db"
WaitTime = 10
FilePath = [
'2016.sql',
]
for file in FilePath:
f = open(file, mode='r')
print(file)
content=f.readlines()
# 開啟資料庫連線
db = pymysql.connect(DB_IP, DB_USER, DB_PWD, DB_DATABASE, charset='utf8')
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# 使用execute方法執行SQL語句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取一條資料
data = cursor.fetchone()
print("Database version : %s " % data)
for index, sql in enumerate(content):
if index % 10000 == 0:
print('已執行 %d'%index)
if index % 20000 == 0:
time.sleep(WaitTime)
try:
# 執行sql語句
db.ping(reconnect=True)
cursor.execute(sql)
# 提交到資料庫執行
db.commit()
except Exception as e:
# Rollback in case there is any error
print(sql)
print(e)
## db.rollback()
f.close()
# 關閉資料庫連線
db.close()
5、對主表進行收縮。
用pt-osc工具做。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22996654/viewspace-2688085/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 對大表做歸檔MySql
- MySQL 5.6的表壓縮MySql
- mysql 5.6效能監控表innodb_metricsMySql
- zabbix上對mysql資料庫做分割槽表MySql資料庫
- SQLServer進行表歸檔SQLServer
- MySQL 中如何歸檔資料MySql
- mysql分割槽表佔用大量容量處理(最佳化)及歸檔分割槽表MySql
- MySQL:5.6 升級 5.7MySql
- CentOS 安裝 mysql 5.6CentOSMySql
- Windows 安裝 MySQL 5.6WindowsMySql
- Linux安裝Mysql5.6LinuxMySql
- MySQL 5.6 GTID 原理以及使用MySql
- 手工rm刪除歸檔日誌對備份歸檔日誌的影響
- MySQL資料歸檔小工具推薦--mysql_archiverMySqlHive
- MySQL 5.7使用pt-online-schema-change對大表加索引MySql索引
- MySQL大表設計MySql
- MySQL 5.6大查詢和大事務監控指令碼(Python 2)MySql指令碼Python
- Windows 安裝並配置 MySQL 5.6WindowsMySql
- Mysql5.6 自動化部署MySql
- MySQL5.6 create table原理分析MySql
- MySQL使用pt-archiver歸檔歷史資料MySqlHive
- MySQL 5.7使用pt-online-schema-change對大表加欄位MySql
- MySQL運維實戰(5.6) 字符集設定對mysqldump的影響MySql運維
- 對歸檔模式下CLEAR 未歸檔日誌後恢復資料庫的一點看法模式資料庫
- MySQL大表優化方案MySql優化
- mysql5.6 mysqldump備份報錯MySql
- MySQL5.6 PERFORMANCE_SCHEMA 說明MySqlORM
- Linux上yum安裝mysql5.6LinuxMySql
- MySQL 5.6使用pt-online-schema-change線上修改大表欄位長度MySql
- oracle歸檔Oracle
- PostgreSQL的表檔案以及TOAST表檔案對應關係SQLAST
- MySQL innodb表使用表空間物理檔案複製表MySql
- 開心檔之MySQL 複製表MySql
- 【Mysql】MySQL 5.6中如何定位DDL被阻塞的問題MySql
- iOS 複雜物件的歸檔與反歸檔iOS物件
- mysql 大表mysqldump遷移方案MySql
- centos7 mysql5.6升級5.7CentOSMySql
- MySQL最優配置模板( 5.6&5.7轉)MySql