mysql如何備份一個表單_Mysql億級數據大表單表備份

上一篇Mysql已有億級數據大表按時間分區,介紹了億級數據大表如何按時間分區,也留下了一個問題:備份億級數據大表要耗時多久。本篇將就如何備份億級數據大表展開討論。

注意:我這里所說的備份指的是數據從一張表拷貝到另外一張表,也就是說單表備份。

創建原表t_send_message_send的sql:

CREATE TABLE `t_send_message_send` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`plan_id` bigint(20) DEFAULT NULL,

`job_uuid` varchar(36) DEFAULT NULL,

`send_port` varchar(16) DEFAULT NULL,

`mobile` varchar(16) DEFAULT NULL,

`content` varchar(200) DEFAULT NULL,

`product_code` varchar(16) DEFAULT 'HELP',

`fake` bit(1) DEFAULT b'0',

`date_push` datetime DEFAULT NULL,

`activity_id` bigint(20) DEFAULT '0',

PRIMARY KEY (`id`),

KEY `mobile` (`mobile`),

KEY `date_push` (`date_push`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

原表一個自增主鍵id,兩個索引mobile、date_push,數據量如下圖:

ad8c5e5c14fd643cb15a5f537206d105.png

創建新表的t_send_message_send2的sql:

CREATE TABLE `t_send_message_send2` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`plan_id` bigint(20) DEFAULT NULL,

`job_uuid` varchar(36) DEFAULT NULL,

`send_port` varchar(16) DEFAULT NULL,

`mobile` varchar(16) DEFAULT NULL,

`content` varchar(200) DEFAULT NULL,

`product_code` varchar(16) DEFAULT 'HELP',

`fake` bit(1) DEFAULT b'0',

`date_push` datetime NOT NULL,

`activity_id` bigint(20) DEFAULT '0',

PRIMARY KEY (`id`,`date_push`),

KEY `mobile` (`mobile`),

KEY `date_push` (`date_push`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION BY RANGE COLUMNS(date_push)

(PARTITION p2016 VALUES LESS THAN ('2017-01-01') ENGINE = InnoDB,

PARTITION p2017 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB,

PARTITION p2018 VALUES LESS THAN ('2019-01-01') ENGINE = InnoDB,

PARTITION p2019 VALUES LESS THAN ('2020-01-01') ENGINE = InnoDB,

PARTITION p2020 VALUES LESS THAN ('2021-01-01') ENGINE = InnoDB);

新表一個聯合主鍵(id,date_push),兩個索引mobile、date_push,5個分區,字段和結構跟原表一樣,數據量為0。

上一篇提供了兩類備份方式:①在線備份;②離線備份。

1.在線備份;

數據一直在數據庫中不離線。

insert into t_send_message_send2 (select * from t_send_message_send);

sql很簡單,意思很明確,就是將select的查詢結果插入到t_send_message_send2。這個過程我跑了一個多小時,沒跑完,被我中止了。用navicate查看t_send_message_send2的對象信息,看到有500多萬行記錄,打開t_send_message_send2表,里面一行記錄都沒有,空的。應該是請求中止了,數據還沒提交。好吧,看下為什么慢,解析下:

EXPLAIN

insert into t_send_message_send2 (select * from t_send_message_send);

執行結果:

"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"

"1""INSERT""t_send_message_send2""p2016,p2017,p2018,p2019,p2020""ALL"""""""""""""""

"1""SIMPLE""t_send_message_send""""ALL""""""""""100568970""100.00"""

好家伙,第5列type都是ALL。type表示MySQL在表中找到所需行的方式,又稱“訪問類型”。常用的類型有: ALL, index, range, ref, eq_ref, const, system, NULL(從前往后,性能從差到好)。ALL,Full Table Scan, MySQL將遍歷全表以找到匹配的行。明白了吧,每次插入全表掃描,這能不慢嗎?

2. 離線備份

數據先導出到本地,再從本地導回數據庫。

1)數據導出(數據備份)

離線備份也分為冷備和熱備。

冷備:數據庫處于關閉的狀態下的備份,優點是:①保證數據庫的完整性;②備份過程簡單并且恢復速度快。缺點是:①關閉數據庫,意味著相關的業務無法正常進行,用戶無法訪問你的業務,一般冷備用于不是很重要、非核心業務上面。

冷備顯然是不滿足我的業務需求的,冷備是全庫備份,而我只是單表備份。

熱備:數據庫處于運行狀態下的備份,不影響現有業務的進行。熱備又分為裸文件備份和邏輯備份。裸文件備份:基于底層數據文件的copy datafile。進入到數據庫的數據目錄,再進入到你的庫目錄,你會發現在這個目錄下有很多.frm文件和.ibd文件,.frm文件是表的結構文件,.ibd文件是表的數據文件。邏輯備份:備份成SQL語句或者其他文件(如csv),恢復時執行SQL,實現數據庫數據的重現。

裸文件備份顯然也是全庫備份,也是不滿足我的業務需求的,下面討論邏輯備份。

邏輯備份常見的兩種方式:

①mysqldump

mysqldump -u root -p marketing t_send_message_send > e:/mysql/marketing_t_send_message_send.sql;

哈哈哈,暴露了在windows上操作的。

mysqldump導出相當快,億級的記錄,50多個G數據量,大概僅用了40分鐘左右。沒記錄到具體時間,是因為執行這個腳本不需要登錄到mysql,命令行就可以了,而命令行不會提示執行腳本花了多長時間,如果登錄mysql,每次執行都會提示執行腳本好了多長時間。

②select … into outfile …;

mysql> use marketing;

Database changed

mysql> select * from t_send_message_send into outfile 'e:/mysql/t_send_message_send.csv';

Query OK, 110900005 rows affected (34 min 10.22 sec)

mysql>

億級的記錄,50多個G數據量,僅需要34分鐘,就問你快不快?

2)數據導入(數據恢復)

①mysqldump方式導出的

mysql> use marketing;

Database changed

mysql> source e:/mysql/marketing_t_send_message_send.sql

或者

mysql -uroot -p marketing < e:/mysql/marketing_t_send_message_send.sql

mysqldump方式不滿足我的業務需求的,mysqldump備份了整個t_send_message_send表,包括表結構,而表結構是我不需要的,如果恢復的話,只會是恢復成t_send_message_send,數據不會恢復到t_send_message_send2中。

②select … into outfile …;導出的

mysql> use marketing;

Database changed

mysql> load data infile 'e:/mysql/t_send_message_send.csv' into table t_send_message_send2;

或者

將備份的t_send_message_send.csv重命名為t_send_message_send2.csv,然后命令行里面執行:

mysqlimport -u root -p marketing e:/mysql/t_send_message_send2.csv

很遺憾,這種方式不可行,我從凌晨1點開始執行,到早上9點多還沒執行完。七八個小時,插入了2700多萬記錄,13個G數據量,1.7個G索引。

2997baa3ad1f6b11149b59a770d4002c.png

之前我一直覺得應該是可行的,開始執行的那一刻我就感覺不對。分析下了原因,大概是因為有索引。我的理解是這樣的:索引相當于排序,插入數據前,還得先全表掃描下,才曉得數據應該插入到哪個位置,插入一億條記錄,就得一億次全表掃描,這能不慢嗎?那既然這樣,先把索引刪了,先不排序,數據直接插到最后面,等數據插完之后再排序,再建索引,這樣應該會快一些。開搞,先刪除索引:

##先truncate掉t_send_message_send2##

TRUNCATE TABLE t_send_message_send2;

ALTER TABLE t_send_message_send2 DROP INDEX mobile;

ALTER TABLE t_send_message_send2 DROP INDEX date_push;

然后再次導入。

C:\Users\maanjun>mysqlimport -u root -p marketing e:/mysql/t_send_message_send2.csv

Enter password: ******

marketing.t_send_message_send2: Records: 110900005 Deleted: 0 Skipped: 0 Warnings: 0

耗時3個多小時,跟Mysql數據庫快速插入億級數據差不多。最后,再重建索引:

ALTER TABLE `t_send_message_send2` ADD INDEX (mobile);

ALTER TABLE `t_send_message_send2` ADD INDEX (date_push);

重建兩個索引,一個varchar類型,一個datetime類型,建一個索引差不多二三十分鐘,加上數據導入過程耗時,數據導入、重建索引總共耗時4個小時。

回過頭來想,插入數據前刪除索引,然后插入數據,最后重建索引,不管是哪種導入方式差不多都是耗時3個多小時,加上重建索引的時間,整個恢復過程差不多4個小時。再加上導出耗費的時間,5個小時內億級記錄表單表備份是可以的。當然這說的離線備份,其實如果順利的話,在線備份花費的時間會更短,因為在線備份也可以是刪除索引–>插入數據–>重建索引這個過程,況且在線備份不需要耗費導出數據這段時間。其次,在線備份也不需要占用本地幾十個G的中轉空間。但是在線備份一定好嗎?未必!在線備份頻繁地查詢原表,會不會影響線網業務?我是在本機測試的,直接操作數據庫,沒有業務在跑,當然沒有關系,如果是線網那就值得考慮下啦。再者,我在用navicate進行在線備份過程中連接無故中斷了。

[SQL]insert into t_send_message_send2 (select * from t_send_message_send);

[Err] 2013 - Lost connection to MySQL server during query

在數據導出導入過程中還踩了一些,這些坑在百度上搜一下,都有解決方法。下一篇,將對整個mysql億級數據大表分區的過程做個總結。

附:

type

表示MySQL在表中找到所需行的方式,又稱“訪問類型”。

常用的類型有: ALL, index, range, ref, eq_ref, const, system, NULL(從左到右,性能從差到好)

ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行

index: Full Index Scan,index與ALL區別為index類型只遍歷索引樹

range:只檢索給定范圍的行,使用一個索引來選擇行

ref: 表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值

eq_ref: 類似ref,區別就在使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用primary key或者 unique key作為關聯條件

const、system: 當MySQL對查詢某部分進行優化,并轉換為一個常量時,使用這些類型訪問。如將主鍵置于where列表中,MySQL就能將該查詢轉換為一個常量,system是const類型的特例,當查詢的表只有一行的情況下,使用system

NULL: MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列里選取最小值可以通過單獨索引查找完成。

更多explain解釋,參見MySQL Explain詳解

1、https://www.cnblogs.com/xuanzhi201111/p/4175635.html

2、https://blog.csdn.net/weixin_44297303/article/details/99197637

3、https://www.jianshu.com/p/c64b857a9996

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql mos login_MySQL 中常用的函數

一、DATE_FORMAT()需求&#xff1a;按照日期月份統計數據&#xff0c;但數據庫存儲的格式是 2020-10-01 10:20:45 &#xff0c;因此需要格式化日期語法&#xff1a;DATE_FORMAT(date,format)第一個參數&#xff1a;指定的日期&#xff0c;第二個參數&#xff1a;需要獲取的格式…

mysql用戶信息備份還原_mysql遷移之新建用戶、備份還原數據庫

事例? 1 mysql -uzixie -pzixie game < /temp/zixie_back.sqlmysql: [Warning] Using a password on the command line interface can be insecure.? 1 mysql -uzixie -p"zixie"mysql: [Warning] Using a password on the command line interface can be insecu…

centos radius mysql_FreeRadius2 MySQL配置

FreeRadius2可以和MySQL進行集成&#xff0c;集成的內容包括創建符合要求的數據庫和表結構&#xff0c;為MySQL進行的相關配置&#xff0c;基于數據庫安裝Web管理程序(如daloradius,ARA等)&#xff0c;大部分內容可以參見0. 環境FreeRadius2 / MySQL 5 /CentOS 5.5(VirtualBox)…

需求調研的方法及過程_培訓需求調研方法

課程設計與開發是每一位職業培訓師都必須會的技能&#xff0c;今天我們就來分享一下如何開發課程。第一節課&#xff0c;讓我們先從培訓需求調研開始。培訓需求調研方法有很多&#xff0c;從個體層次分為&#xff1a;問卷法、觀察法、訪談法&#xff1b;從組織層次分為&#xf…

java報錯空指針異常_java – 空指針異常錯誤,沒有明顯的代碼錯誤

我在這里有一個錯誤,我不知道它來自哪里.我在初學者的java課程是高中,所以我在這里還沒有太多的經驗.我有3個相互合并的程序.我有一個卡片類,可以創建一張撲克牌//********************************************************************// Card.java Author: Lewis and Loftus…

mysql表的設計幾種方式_支持多種登錄方式的數據表設計 | 六阿哥博客

一個帶有用戶系統的應用最基本登錄方式是站內賬號登錄&#xff0c;但這種方式往往不能滿足我們的需求。現在的應用基本都有站內賬號、email、手機和一堆第三方登錄&#xff0c;那么如果需要支持這么多種登錄方式&#xff0c;或者還有銀行卡登錄、身份證登錄等等更多的登錄方式&…

將Go語言開發的Web程序部署到K8S

搭建K8S基礎環境 如果已經有K8S環境的同學可以跳過&#xff0c;如果沒有&#xff0c;推薦你看看我的《Ubuntu22加Minikue搭建K8S環境》&#xff0c;課程目錄如下&#xff1a; Ubuntu22安裝Vscode 下載&#xff1a;https://code.visualstudio.com/Download 安裝命令&#…

python 掃描儀_基于Opencv和Python的多選掃描儀

首先&#xff0c;我檢測到圖像右側的20個黑框&#xff0c;然后將x和寬度添加到列表中&#xff1a;image cv2.imread(args["image"])gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)(_, thresh) cv2.threshold(gray, 220, 255,cv2.THRESH_BINARY)kernel cv2.getStr…

mysql dmz_MySQL 中LIMIT的使用詳解

MySQL的Limit子句Limit子句可以被用于強制 SELECT 語句返回指定的記錄數。Limit接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數&#xff0c;第一個參數指定第一個返回記錄行的偏移量&#xff0c;第二個參數指定返回記錄行的最大數目。//初始記錄行的偏移量…

python編程入門到實踐筆記習題_Python編程從入門到實踐筆記——列表簡介

python編程從入門到實踐筆記——列表簡介#codingutf-8#列表——我的理解等于c語言和java中的數組bicycles ["trek","cannondale","readline","specialized"]print(bicycles)#列表索引從0開始print(bicycles[0].title())#訪問列表元素…

informatica mysql odbc_Informatica 配置mysql community odbc連接

Informatica linux 版本內置的DataDirect 驅動支持各種數據庫例如oracle、sybase、postgreSQL、Greenplum、mysql等等但是mysql 只支持企業版本&#xff0c;如果我們使用的是community 社區版本便不能使用自帶的DataDirect方式了&#xff0c;那我們就需要手動配置其他odbc連接。…

mysql分表 動態擴容_數據庫hash分表后的擴容方案

postgres的hash分表不停機擴容方案原來我們hash分表之后&#xff0c;數據擴容采用的是rehash&#xff0c;這樣遷移全部的數據&#xff0c;比較麻煩。本次擴容利用hash環原理&#xff0c;并在此基礎上做一些適應性的改動。首先假定哈希環的范圍為0-1023&#xff0c;總共1024的數…

php mysql長連接聊天室_PHP之探索MySQL 長連接、連接池

PHP連接MysqL的方式&#xff0c;用的多的是MysqL擴展、MysqLi擴展、pdo_MysqL擴展,是官方提供的。PHP的運行機制是頁面執行完會釋放所有該PHP進程中的所有資源的&#xff0c;如果有多個并發訪問本地的測試頁面 http://127.0.0.1/1.php 根據PHP跟web服務器的不同&#xff0c;會開…

python 讀取地震道頭數據_python地震數據可視化詳解

本文實例為大家分享了python地震數據可視化的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下準備工作&#xff1a;在windows10下安裝python3.7&#xff0c;下載參考源碼到本地。1. demo繪圖測試demo繪圖指令cmd> python seisplot.py --demo問題1)缺少依賴包File &…

在MySQL查詢山東省男生信息_MySQL-查詢

來一波英語單詞解釋(意思)create 創建show 顯示database 數據庫use 使用select 選擇table 表from 來自…distinct 消除重復行as 同樣地(用于其別名)where 范圍like 模糊查詢rlike 正則查詢In 范圍查詢not in 不非連續的范圍之內between ... and …表示…

java 導入world數據_java讀取world文件,把world文件中的內容,原樣輸出到頁面上。...

POI,處理可以。樣式在Java代碼中添加就可以。給了一個例子這個是Excel的。package cn.com.my.common;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.sql.Connection;import java.sql.ResultSet…

java程序員 css_Java程序員從笨鳥到菜鳥之(十七)CSS基礎積累總結(下)

七.組織元素(span和div)span和div元素用于組織和結構化文檔&#xff0c;并經常聯合class和id屬性一起使用。在這一課中&#xff0c;我們將進一步探究span和div的用法&#xff0c;因為這兩個HTML元素對于CSS是很重要的。用span組織元素用div組織元素用span組織元素span元素可以說…

redlock java_Redlock分布式鎖

這篇文章主要是對 Redis 官方網站刊登的 Distributed locks with Redis 部分內容的總結和翻譯。什么是 RedLockRedis 官方站這篇文章提出了一種權威的基于 Redis 實現分布式鎖的方式名叫 Redlock&#xff0c;此種方式比原先的單節點的方法更安全。它可以保證以下特性&#xff1…

java 兩個數組交叉_java – 如何交叉兩個沒有重復的排序整數數組?

這個問題本質上減少到一個連接操作,然后是一個過濾器操作(刪除重復,只保留內部匹配).由于輸入都已經排序,所以可以通過O(O(size(a)size(b))的merge join來有效地實現連接.過濾器操作將為O(n),因為連接的輸出被排序,并且要刪除重復項,所有您需要做的是檢查每個元素是否與之??前…

java retentionpolicy_Java注解之如何利用RetentionPolicy.SOURCE生存周期

上一篇文章簡單講了下Java注解的學習之元注解說明&#xff0c;學習了Java注解是如何定義的&#xff0c;怎么使用的&#xff0c;但是并沒有介紹Java的注解是怎么起作用的&#xff0c;像Spring Boot里面的那些注解&#xff0c;到底是怎么讓程序這樣子運行起來的&#xff1f;特別是…