91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

MySQL下200GB大表備份,利用傳輸表空間解決停服發版表備份問題

freeflydom
2025年4月18日 10:49 本文熱度 187

問題背景

在停服發版更新時,需對 200GB 大表(約 200 億行數據)進行快速備份以預防操作失誤。

因為曾經出現過有開發寫的發版語句里,UPDATE語句的WHERE條件寫錯了,原本只需要更新幾行數據,最終導致更新了半張表的數據。

MySQL版本是MySQL 8.0.X,為了預防這種情況,需要對某個重要的大表進行預先備份,以便可以及時回滾,及時恢復,及時回退,對于備份方法大概有下面幾種:

方案優點缺點
mysqldump  導出簡單易用大表導出耗時(200GB 可能需數小時)
CREATE TABLE...SELECT直接 SQL 操作數據復制慢,鎖表風險高
表空間 傳輸秒級備份 ,零數據復制需操作系統權限,依賴文件拷貝
主從復制/延遲復制無需停服,恢復靈活需主從架構,維護成本高

這個場景的核心需求:停服更新的時間非常有限,比如1個小時之內要完成更新。

操作流程

前面兩種都比較簡單,通過導數據的方法來備份舊表,萬一出現問題,可以使用導出來的數據進行快速恢復,第三種方法估計比較少人用,下面是具體操作方法

  1. 源表與備胎表結構

-- 源表(aa)
CREATE TABLE aa (
id int(11) DEFAULT NULL,
  sname VARCHAR(100)
) ENGINE=InnoDB;
-- 備胎表(bb)
CREATE TABLE bb (
id int(11) DEFAULT NULL,
  sname VARCHAR(100)
) ENGINE=InnoDB;
greatsql> INSERTINTO aa SELECT1,"nihao";

2、查看兩個表的表ID和表空間ID,可以看到aa表的表ID是1081 表空間ID是13,bb表的表ID是1082 表空間ID是14

greatsql> select * from information_schema.innodb_tables where name='school/aa'\G
*************************** 1. row ***************************
          TABLE_ID: 1081
              NAME: school/aa
              FLAG: 33
            N_COLS: 6
             SPACE: 13
        ROW_FORMAT: Dynamic
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
      INSTANT_COLS: 0
TOTAL_ROW_VERSIONS: 0
1 row in set (0.01 sec)
greatsql> select * from information_schema.innodb_tables where name='school/bb'\G
*************************** 1. row ***************************
          TABLE_ID: 1082
              NAME: school/bb
              FLAG: 33
            N_COLS: 6
             SPACE: 14
        ROW_FORMAT: Dynamic
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
      INSTANT_COLS: 0
TOTAL_ROW_VERSIONS: 0
1 row in set (0.00 sec)

3、備胎表卸載表空間:

greatsql> ALTER TABLE bb DISCARD TABLESPACE;  -- 加鎖并生成配置文件

4、源表執行表空間導出:

greatsql> USE school;
greatsql> FLUSH TABLES aa FOR EXPORT;   

5、拷貝表空間文件(ibd和cfg文件),然后重新賦予權限,確保導入表空間時候不會出現問題

$ cd /data/mysql/mysql3306/data/school
$ cp aa.ibd  bb.ibd  
$ cp aa.cfg  bb.cfg
$ chown -R mysql:mysql /data/mysql/mysql3306/data/*

6、在相同數據庫下,備胎表導入表空間

greatsql> USE school;
greatsql> UNLOCK TABLES;  
greatsql> ALTER TABLE bb IMPORT TABLESPACE;

7、查詢表數據,驗證數據一致性

greatsql> USE school;
greatsql> SELECT * FROM bb;
greatsql> SELECT * FROM aa;

查詢表數據正常,沒有任何問題

greatsql> SELECT * FROM aa;
+------+-------+
| id   | sname |
+------+-------+
|    1 | nihao |
+------+-------+
1 row in set (0.01 sec)
greatsql> SELECT * FROM bb;
+------+-------+
| id   | sname |
+------+-------+
|    1 | nihao |
+------+-------+
1 row in set (0.00 sec)

查看表的數據文件,沒什么問題

$ ll
total 228
-rw-r----- 1 mysql mysql 114688 Mar  4 16:51 aa.ibd
-rw-r----- 1 mysql mysql    781 Mar  4 16:52 bb.cfg
-rw-r----- 1 mysql mysql 114688 Mar  4 16:52 bb.ibd

 

8、再次查看兩個表的表ID和表空間ID,可以看到aa表的表ID是1081 表空間ID是13(沒有變化),bb表的表ID是1083 表空間ID是14(表空間ID已經變了),bb表的表ID變了是防止與現有表沖突


mysql> select * from information_schema.innodb_tables where name='school/aa'\G
*************************** 1. row ***************************
          TABLE_ID: 1081
              NAME: school/aa
              FLAG: 33
            N_COLS: 6
             SPACE: 13
        ROW_FORMAT: Dynamic
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
      INSTANT_COLS: 0
TOTAL_ROW_VERSIONS: 0
1 row in set (0.00 sec)
mysql> select * from information_schema.innodb_tables where name='school/bb'\G
*************************** 1. row ***************************
          TABLE_ID: 1083
              NAME: school/bb
              FLAG: 33
            N_COLS: 6
             SPACE: 14
        ROW_FORMAT: Dynamic
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
      INSTANT_COLS: 0
TOTAL_ROW_VERSIONS: 0
1 row in set (0.00 sec)

9、發版更新與回滾

-- 發版操作(示例)
greatsql> UPDATE aa SET sname = 'new_value' WHERE id > 1;

10、如果發版有問題,直接交換表名,最快速度恢復整個表的數據

-- 回滾操作(交換表名)
greatsql> ALTER TABLE aa RENAME TO aa_temp; 
greatsql> ALTER TABLE bb RENAME TO aa; 

總結

整個操作最重要的是第4步,操作系統級別的拷貝就完成了整個表的備份,相比于數據倒來倒去在速度上要快不少。另外,第5步的備胎表也可以不用導入,只有當發現發版出現問題時候,再導入也可以。

這種方法的關鍵優勢如下

  • 直接拷貝 .ibd 文件,無需逐行復制數據。
  • 零鎖表時間:FLUSH TABLES tablename FOR EXPORT 僅短暫加鎖(秒級)。
  • 快速恢復:通過表名交換實現秒級回滾。

特別適合于這幾種場景:無主從架構的單實例環境、大表快速備份、停服時間敏感。

當然,如果有主從架構的話,則更加推薦使用第四種方法,在操作上也更加可控,短時間也能保證能夠完成。

轉自https://www.cnblogs.com/lyhabc/p/18816226/ 


該文章在 2025/4/18 10:49:52 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产婬乱视频免费 | 蜜桃成熟时在线观看 | 国产v视频| 日本a级在线 | 蜜桃传媒视频 | 人成在线免费视频 | 91夜间福利| 欧美日韩免费播 | 青青综合 | 日韩成a| 国产美女视频福利 | 午夜男女福利 | 国产污视频网站 | 国产精品免费专区 | 国产三区视 | 日韩色区 | 国产91专区 | 91午夜福利在线 | 国产午夜视频专区 | 国产精品极品白 | 91大神在线菠萝蜜 | 日韩精品区 | 91精品推荐| 精品日本一区 | 国产精品观看在 | 日本欧美午夜三 | 国产91免费不 | 91九色精品 | 精品一区二区免费 | 欧美一区二区免费 | 91影院| 国精品吹潮 | 日本夜间福利91 | 国产亚洲美女精品 | 精品日韩一区二 | 97人操| 精品欧美А∨被黑人 | 人善交vi | 日本护士喷 | 国产日本韩国欧美 | 午夜不卡视频 |