1. 程式人生 > >MySQL之——基於mysqldump全量備份還原

MySQL之——基於mysqldump全量備份還原

SQL格式備份還原
不帶--tab選項時,mysqldump輸出sql格式的標準輸出,包含CREATE及INSERT語句。
基本格式為:

mysqldump [arguments] > file_name

1、 匯出全部資料庫及表

[[email protected] /]# mysqldump --all-databases > /tmp/dump.sql
匯出部分資料庫及表
[[email protected] /]# mysqldump --databases db1 db2 db3 > /tmp/dump.sql
匯出單個數據庫可以用如下兩種格式
[[email protected]
/]# mysqldump --databases test > /tmp/dump.sql [[email protected] /]# mysqldump test > /tmp/dump.sql
區別是使用--databases在匯出資料時會加上CREATE DATABASE 或 USE 語句,不使用--databases引數在匯入資料時需要先指定一個存在的資料庫作為預設資料庫匯入資料。
匯出指定表
[[email protected] /]# mysqldump test t1 t3 t5 > /tmp/dump.sql
[[email protected]
/]# mysqldump --tables test t1 t3 t5 > /tmp/dump.sql

2、匯入SQL格式備份檔案

如果匯出檔案時指定了--all-databases 或 --databases選項,備份檔案會包含CREATE DATABASE 和 USE語句,我們直接匯入即可,無需預先建立庫和指定庫。以下兩種方式均可。

[[email protected] /]# mysql < /tmp/dump.sql (方法1:shell命令列操作)
mysql> source /tmp/dump.sql              (方法2:進入mysql資料庫操作)
如果匯出檔案時未指定了--all-databases 或 --databases選項,備份檔案不包含CREATE DATABASE 和 USE語句,匯入資料前我們需要預先建立庫和指定庫。
方法1:shell命令列下操作
[
[email protected]
/]# mysqladmin create db1 [[email protected] /]# mysql db1 < /tmp/dump.sql
方法2:進入mysql資料庫操作
mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql> source dump.sql

3、檔案分隔符格式備份還原

帶--tab選項時,mysqldump為每個表輸出兩種檔案到tab指定的路徑下,分別是帶CREATE TABLE語句的形如tbl_name.sql的檔案,存放表結構,以及製表符分割的形如tbl_name.txt的資料檔案。資料檔案本質上是通過SELECT ... INTO OUTFILE語句寫入資料到檔案的。
該備份方式最好在本地執行,如果client在遠端執行的話,client端和server端需要有相同路徑的備份目錄,且.sql檔案記錄在client端,.txt檔案記錄在server端。

3.1 匯出tab格式備份檔案

預設格式匯出
這種方式匯出的檔案,以製表符(tab空格)作為列的分割,且列欄位沒有引號包裹,以換行作為一行的結束。

[[email protected] /]# mysqldump --tab=/tmp db1
指定格式匯出
我們可以通過引數控制匯出資料檔案的格式,引數分別為:
--fields-terminated-by=str:隔開欄位的字元,預設為tab製表符。
--fields-enclosed-by=char:包裹欄位的符號(包裹所有欄位),預設沒有符號。
--fields-optionally-enclosed-by=char:包裹欄位的符號(包裹除數字型別之外的所有欄位),預設沒有符號。
--fields-escaped-by=char:指定字元對特殊字元進行轉義,例如--fields-enclosed-by指定為雙引號,而欄位內容包含雙引號,就需要一個字元如#或其他,對欄位內的雙引號進行轉義。
--lines-terminated-by=str:一行的終止,預設為換行符。
例如:需要匯出的表資訊為
mysql> select * from db.dbtable;
+------+-------------+--------------+
| c1   | c2          | c3           |
+------+-------------+--------------+
|    1 | test, comma | test " quote |
+------+-------------+--------------+
匯出指定格式資料表命令
[[email protected] /]# mysqldump --tab=/tmp --fields-terminated-by=',' --fields-enclosed-by=0x22 --fields-escaped-by='#' --lines-terminated-by='\n' db1
[[email protected] tmp]# cat dbtable.txt 
"1","test, comma","test #" quote"
或者
[[email protected] /]# mysqldump --tab=/tmp --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --fields-escaped-by='#' --lines-terminated-by='\n' db1
[[email protected] tmp]# cat dbtable.txt 
1,"test, comma","test #" quote"
注:我們可以用十六進位制代替引數所指定的值。--fields-optionally-enclosed-by選項對數字不包裹。

3.2匯入tab格式備份檔案

大體步驟:先匯入sql檔案,再匯入txt檔案。
對預設格式的匯入:

[[email protected] /]# mysql db1 < /tmp/t1.sql
[[email protected] /]# mysqlimport db1 /tmp/t1.txt
對指定格式的匯入:
[[email protected] /]# mysql db1 < /tmp/t1.sql    
[[email protected] /]# mysqlimport --fields-terminated-by=',' --fields-enclosed-by='"' --fields-escaped-by='#' --lines-terminated-by='\n' db1 t1.txt
或者
mysql> USE db1;
mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1 FIELDS FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '#'  LINES TERMINATED BY '\n';

3.3 填充資料至另一資料庫

[[email protected] /]# mysqldump  db1 | mysql -h192.168.1.100 -P3306 -ujesse -pjesse  -C db2

4 mysqldump一些使用技巧

4.1 線上熱備份

使用引數 --single-transaction,適用於InnoDB表,與--lock-tables引數互斥,備份期間不鎖表。為確保得到有效的備份檔案,使用該引數備份期間應避免使用DDL(ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE.)語句,因為連續性的讀並沒有對這些語句進行隔離,備份期間使用這些DDL語句會導致潛在的select獲取到的返回的資料不一致或錯誤,比如資料讀出一半表被刪了。
參考例項:

[[email protected] /]# mysqldump --all-databases --single-transaction --master-data=1 --flush-logs --events > /tmp/dump.sql
 --flush-logs:全備前重新整理所有日誌到binlog檔案,並建立一個新的binlog檔案,用於增備。
--master-data:該引數有兩個值1和2,預設為1,mysqldump匯出資料時,當這個引數的值為1的時候,mysqldump出來的檔案就會包括CHANGE MASTER TO這個語句,CHANGE MASTER TO後面緊接著就是file和position的記錄,在slave上匯入資料時就會執行這個語句,salve就會根據指定這個檔案位置從master端複製binlog。當這個值是2的時候,chang master to也是會寫到dump檔案裡面去的,但是這個語句是被註釋的狀態。

4.2 備份儲存過程觸發器及事件

--events: 事件排程,預設未開啟,顯示關閉使用--skip-events
--routines: 儲存過程及函式, 預設未開啟,顯示關閉使用--skip-routines
--triggers: 觸發器,預設為開啟,關閉使用--skip-triggers

4.3 只備份表結構或資料

--no-data:只匯出建表語句。
--no-create-info:只匯出資料,不匯出表結構。

[[email protected] /]# mysqldump --no-data --routines --events testdb > /tmp/dump.sql
[[email protected] /]# mysqldump --no-create-info  testdb > /tmp/dump.sql

4.4 備份壓縮

參考例項:
壓縮備份檔案,並以當前時間戳命名

[[email protected] /]# mysqldump --all-databases --single-transaction --master-data=1 --flush-logs --events | gzip > /tmp/dump_`date '+%Y-%m-%d_%H:%M:%S'`.sql.gz

5 常見問題及注意事項

5.1 對備份目錄沒有寫許可權

[[email protected] tmp]# mysqldump -uroot -p******  --tab=/tmp/test/  db1 
mysqldump: Got error: 1: Can't create/write to file '/tmp/test/dump.txt' (Errcode: 13 - Permission denied) when executing 'SELECT INTO OUTFILE'
 解決辦法:    
讓other使用者也能夠寫。
[[email protected] /]# chmod 757 /tmp/test/ 
或者把目標目錄修改為mysql組所有
[[email protected] tmp]# chown mysql:mysql /tmp/test/ 

5.2 執行備份時磁碟空間不足

[[email protected] /]# mysqldump --tab=/tmp/test -uroot -p****** db1
mysqldump: Error: 'Got error 28 from storage engine' when trying to dump tablespaces
mysqldump: Couldn't execute 'show fields from `handler_table`': Got error 28 from storage engine (1030)
出現此問題的原因:臨時空間不夠,無法執行此SQL語句
實際案例:
查了一下,資料庫檔案所在的盤應該沒事,應該是資料庫用的臨時目錄空間不夠
[[email protected] /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       64G   64G     0 100% /
tmpfs                 128G     0  128G   0% /dev/shm
/dev/sda1             190M   68M  113M  38% /boot
解決辦法:清理磁碟空間。

5.3 遠端備份,client端與server端目錄不一致

client端(沒有/tmp/test目錄)

[[email protected] /]# mysqldump --tab=/tmp/test -uroot -p -h192.168.1.200 -P3355 test
Enter password: 
mysqldump: Can't create/write to file '/tmp/test/handler_table.sql' (Errcode: 2)
mysqldump: Can't create/write to file '/tmp/test/handler_table.sql' (Errcode: 2)
 解決辦法:
在client端建立目錄/tmp/test(使用mysqldump進行tab格式遠端備份時,client端存放sql表定義檔案,server端存放列式資料檔案,兩端要存在相同的備份目錄)

相關推薦

MySQL——基於mysqldump備份還原

SQL格式備份還原 不帶--tab選項時,mysqldump輸出sql格式的標準輸出,包含CREATE及INSERT語句。 基本格式為: mysqldump [arguments] > file_name 1、 匯出全部資料庫及表 [[email p

mysqldump備份與恢復

一個 like secure exit extra ssi 統計表 建議 per mysql用戶管理 創建授權用戶和密碼 ?grant all on . to ‘user1‘ identified by ‘pwd@1234‘;在mysql中創建連接管理數據庫的用戶,創建用戶

使用xtrbackup/mysqldump備份+binlog備份恢復到最近一個時間點

先用xtrabackup做全備: innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=123 /home/backup/xtrabackup/ 全備完成之後新建sanguoyanyi表,並插入

mysqldump備份+mysqlbinlog二進位制日誌增量備份

1、mysqldump資料庫增量備份前提:1>要開啟mysql log-bin日誌功能,若沒有開啟則,修改配置檔案/etc/my.cnf,新增如下內容:  [mysqld]  datadir=/var/lib/mysql/data  log-bin=mysql-bin  server-id=1  重啟m

MySQL基於mysqldump和二進制日誌log-bin二進制日誌進行邏輯備份以及基於時間點的還原

總結 mysql-bin lin .sql bin -h eat log-bin 之前 本文出處:http://www.cnblogs.com/wy123/p/6956464.html 本文僅模擬使用mysqldump和log-bin二進制日誌進行簡單

mysql 備份和增量備份

mysql備份mysql 全量備份:vim /root/mysql_bakup.sh #!/bin/bash#Date:2017/5/2#Author:wangpengtai#Blog:http://wangpengtai.blog.51cto.com#At Sunday, we will backup th

XtraBackup備份與恢復MySQL數據

備份 mysql xtrabackup 防偽碼:沒有相當程度的孤獨是不可能有內心的平和。1、概述Percona XtraBackup(簡稱PXB)是 Percona 公司開發的一個用於 MySQL 數據庫物理熱備的備份工具,支持 MySQl(Oracle)、Percona Server 和 Mar

負責數據庫的備份,實現周一 周六增量備份,周日備份

數據庫 增量 備份 1、mysql全量備份、增量備份。開啟mysql的logbin日誌功能。在/etc/my.cnf文件中加入以下代碼: [mysqld]log-bin ="/home/mysql/logbin.log"binlog-format = ROWlog-bin-index ="/hom

Mysql 通過備份和binlog恢復整體數據

mysql 通過全量備份和binlog恢復整體數據 某天工作時間,一個二貨犯暈登錯生產當測試環境了,直接drop了一個數據庫,需要緊急恢復!可利用備份的數據文件以及增量的 binlog 文件進行數據恢復。具體思路歸納幾點:1、恢復條件為 MySQL 要開啟 binlog 日誌功能,並且要全備和增量的所有

mysql備份與增量備份

mysql linux 1.全量備份 簡單的說就是將所有數據庫或一個庫全部備份。2.增量備份 從上一次全量備份之後到下一次全量備份之前都叫做增量備份。對於mysql,binlong日誌就是mysql數據,對binlong的備份就是對mysql的備份。備份的時候要鎖表,影響用戶

基於邏輯卷LVM的MySQL、mariadb數據庫備份還原詳細實現

快照恢復數據庫 lvm 前提是數據庫的數據是放在邏輯卷上的; 數據庫數據和日誌分開存放;正常情況下數據和日誌是放在兩個獨立的磁盤上,如果是raid的話,那麽就無所謂了。創建分區: [root@mysql ~]$fdisk /dev/sda Command (m for

mysql備份及增量備份流程

日誌格式 --date nlog 超過 form 方式 basename ESS transacti 由於線上mysql數據量很大,天天進行全備份數據既浪費時間又占用資源,所以打算采用全量備份和增量備份結合的方式進行備份采用每周日全量備份、周一到周六增量備份的方式背景是從一

mysql備份、增量備份實現方法

mysql全量備份、增量備份。開啟mysql的logbin日誌功能。在/etc/my.cnf檔案中加入以下程式碼: [mysqld] log-bin = "/home/mysql/logbin.log" binlog-format = ROW log-bin-index = "/home/

MySQL定時備份備份+增量備份

參考 zone7_ 的 實戰-MySQL定時備份系列文章 說明 產品上線後,資料非常非常重要,萬一哪天資料被誤刪,那麼就gg了,準備跑路吧。 所以要對線上的資料庫定時做全量備份和增量備份。 增量備份的優點是沒有重複資料,備份量不大,時間短。但缺點也很明顯,需要建立在上次完全備份及完全備份之後所有的增量才

mysql備份和增量備份

mysql全量備份指令碼 #!/bin/bash Data_back="/data/data_backup/"; Date=`date +"%Y_%m_%d"` mysqldump -uroot -proot --quick --events --flush-logs --single-trans

mysql 備份與增量備份指令碼

  全量備份 [[email protected] scripts]# cat wqbk.sh #!/bin/bash #use mysqldump to fully backup mysql data BakDir=/mnt/sata02/backup/wq

實戰-MySQL定時備份(1)

閱讀本文大約需要 5 分鐘 概要 引言 全量備份 恢復全量備份 定時備份 引言 在產品上線之後,我們的資料是相當重要的,容不得半點閃失,應該做好萬全的準備,搞不好哪一天被黑客入侵或者惡意刪除,那就 gg 了。所以要對我們的

Mysql 開啟bin-log並實現自動化增量和備份

思路:開啟 bin-log 來做增量,用 Mysqldump 做全量 1 開啟 bin-log 檢視是否開啟 binlog 進入mysql命令列介面,show variables like '%log_bin%'; 如果 log-bin 是 O

mysql xtrabackup 自動備份 shell

#!/bin/sh #victory chen   INNOBACKUPEX=innobackupex INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX TODAY=`date +%Y%m%d%H%M%S` USEROPTIONS="--user

MySQL innobackupex備份恢復

ann sql sta important 其他 fin rect exec -- 轉自 http://blog.itpub.net/27099995/viewspace-1295099/ 先簡單介紹一下這個工具:innobackupexinnobackupex比xta