mysql數據庫數據備份與恢復

1、通過物理拷貝備份與恢復

         對MyISAM引擎的表來說:如果當前此表在拷貝過程中沒有任何寫操作時,可以直接拷貝,對單張表拷貝時只需把把表相關的三個以.frm,.MYD,.MYI結尾的文件拷貝到另外的數據庫實例對應的數據庫目錄下即可。

         對InnoDB表來說:即使是innodb_file_per_table=on的情況下直接拷貝與表相關的兩個文件到目標實例下不行,但可以通過拷貝整個數據目錄到目標實例的數據目錄下的方式來完成備份和恢復。

2、通過mydump工具實現備份與恢復

(1)通過mydump備份數據

備份的語句格式:mysqldump [options] db_name [tbl_name ...]

                             mysqldump [options] --databases db_name ...

                             mysqldump [options] --all-databases

options中選項:

         --host=host_name(h host_name):指定要導出的目標數據庫所在的主機,默認是localhost

         --user=user_name(-u user_name):指定鏈接目標數據庫的數據庫用戶名

         --password[=password](-p[password]):指定鏈接目標數據庫的數據庫密碼

         --port=port_num(-P port_num):指定鏈接目標數據庫的端口

         --all-databases(-A):參數代表導出所有數據庫裏的所有的表

# 導出所有的數據庫
]# mysqldump -uroot -p --all-databases > backup.sql

         --databases(-B):參數代表導出指定的一個或多個數據庫

# 導出一個數據庫
]# mysqldump -uroot -p --databases course >course.sql
# 同時導出多個庫
mysqldump -uroot -p --databases course test >mysqlbackup.sql

         --add-drop-database:表示在使用--databases或者是--all-databases參數時在每個create database命令前都加上drop database的命令

         --add-drop-table:表示在每個create table命令前加上drop table命令

         --add-drop-trigger:表示在每個create trigger命令前加上drop trigger命令

         --replace:表示使用replace命令插入數據而不是使用insert命令

         --default-character-set=charset_name:指定默認的字符集,默認是UTF8

         --set-charset:表示將SET NAMES default_character_set命令寫入到導出備份文件中,默認是開啓狀態

         --dump-slave[=value]:表示從複製的slave從庫導出備份,且其中包含了change master to語句,則利用此備份文件可以直接建立另一個複製從庫。value參數如果不寫或者=1的情況下,則change master to語句寫入到dump文件中,如果設置=2則代表也寫入到dump文件中,只是會註釋掉

# 從從庫上備份
]# mysqldump -uroot -p --dump-slave --single-transaction course >course.sql

         --master-data[=value]:表示從複製的主庫上導出備份,和--dump-slave參數配置類似,可以利用此備份文件直接建立另一個複製從庫。其value的取值含義也和dump-slave相同。使用該參數會自動打開—lock-all-table參數,除非同時使--single-transaction參數

# 從主庫備份此備份方式會在備份開始之初在所有表上加一個只讀鎖(FLUSH TABLES WITH READ LOCK),當成功獲取了該鎖並開始備份之後,此鎖就會立即釋放。而後續的dump過程中不會影響其他的讀寫操作
]# mysqldump -uroot -p --master-data=2 --single-transaction course >course.sql

         --tab=dir_name(-T dir_name):參數表示將備份文件以文本文件的方式生成,dir_name指定了存放的文件路徑,每個表會生成兩個文件,一個是.sql文件保存的表結構信息,一個是.txt文件保存的表數據信息,但是需要在my.cnf中先配置secure_file_priv=/usr/local/mysql/backup/參數。以文本的方式導出時還可以加入以下的參數

                   --fields-terminated-by=str參數指定每個字段值之間的間隔符,默認是tab

                   --fields-enclosed-by=char參數指定每個字段值使用什麼字符括起來,默認是沒有

                   --fields-optionally-enclosed-by=char參數指定對每個非數字類型的字段值使用什麼       字符括起來,默認沒有

                   --lines-terminated-by=str參數指定行之間的結束符,默認是newline

# 以文本方式導出數據庫
]# mysqldump -uroot -p --tab=/tmp/ course
# 導出時指定分隔符等
]# mysqldump -uroot -p --tab=/tmp/ --fields-terminated-by="===" --fields-enclosed-by="\"" test
]# cat test_index01.txt 
"4"==="DBMS stands for DataBase ..."===\N
"5"==="After you went through a ..."===\N
"6"==="In this tutorial we will show ..."===\N

         --ignore-table=db_name.tbl_name:代表導出過程中忽略某個指定表的導出,如果要忽略多個表則這個參數要使用多次

# 導出course庫中除了student_bak表外的所有表結構及數據
]# mysqldump -uroot -p --ignore-table course.student_bak course > nostubak_course.sql

         --no-data(-d):參數代表不要導出數據,只導出表結構

# 僅導出表結構不導出數據
]# mysqldump -uroot -p --no-data course > nodata_course.sql

         --no-create-info:僅導出數據不導出表結構

# 僅導出數據不導出表結構
]# mysqldump -uroot -p --no-create-info course > course.sql

         --routines(-R):參數代表也要把存儲過程和函數導出來

         --triggers:參數代表也要將觸發器導出來

# 導出course庫中的存儲過程和觸發器
]# mysqldump -uroot -p --routines --triggers course >course_rt.sql

         --where='where_condition'(-w ‘where_condition’):參數代表僅導出符合條件的數據

# 導出student表中sid小於5的數據
]# mysqldump -uroot -p --where="sid < 5" course student >course.student.sql
# 導出student表中sid爲5或者6的數據
mysqldump -uroot -p --where="sid in (5,6)" course student >course.student.sql

         --lock-all-tables(-x):參數代表在導出過程中對每個數據庫的每個表加上一個只讀鎖

         --no-autocommit:參數代表對每個表的數據導出內容用set autocommit=0和commit兩個語句包圍

         --single-transaction:參數代表將事務隔離級別設置爲可重複讀並在導出開始時執行start transaction開啓一個新的事務,在dump的執行過程中也不會阻止任何的讀寫操作

# 備份時開啓一個新的事務
]# mysqldump -uroot -p --master-data  --single-transaction  course >course.sql

導出命令的其他用法:

# 導出course庫中的一個表
]# mysqldump -uroot -p course student >course.student.sql

(2)FLUSH TABLES WITH READ LOCK

         FLUSH TABLES WITH READ LOCK簡稱(FTWRL),該命令主要用於備份工具獲取一致性備份(數據與binlog位點匹配)。由於FTWRL總共需要持有兩把全局的MDL鎖,並且還需要關閉所有表對象,因此這個命令的殺傷性很大,執行命令時容易導致庫hang住。

         FTWRL主要包括3個步驟分別是:上全局讀鎖(lock_global_read_lock),上全局讀鎖會導致所有更新操作都會被堵塞、清理表緩存(close_cached_tables)、上全局COMMIT鎖(make_global_read_lock_block_commit) ,上全局COMMIT鎖時,會堵塞活躍事務提交。

(3)記錄導出的具體邏輯

         打開在mysql的配置文件中配置gerenal_log的相關參數,可以記錄導出過程的具體邏輯,配置如下:

# 修改配置文件記錄導出過程的具體邏輯
general_log=on
# 記錄的文件存放位置
general_log_file=/usr/local/mysql/data/general_log

(4)備份的導入

         1)通過mysql命令導入

# 通過mysql命令導入
]# mysql -uroot -p <test.sql

         2)通過source命令導入

# 進入備份文件存放目錄下
]# cd /data/mysql/backup
# 通過source命令導入備份
mysql> source test.sql;

         3)文本文件的導入

         對於文本文件的導入,分爲兩步,先要導入表結構,再導入文件,表結構文件的導入可以使用”mysql test < test.sql”或者source命令導入,數據文件的導入可以使用mysqlimport或者load data infile命令。

# 先導入表結構
]# mysql -uroot -p test <test_index01.sql
# 再導入數據
]# mysqlimport -uroot -p --fields-terminated-by="===" --fields-enclosed-by="\"" test /tmp/test_index01.txt

         通過load data infile命令導入

# 登錄mysql數據庫,切換到test庫,導入表結構
mysql> source test_index02.sql;
# 導入數據
mysql> load data infile "/tmp/test_index02.txt" into table test_index02 FIELDS TERMINATED BY "===" ENCLOSED BY "\"";

3、基於時間點的數據的恢復

         基於時間點的恢復是將數據庫恢復到指定的時間點狀態,通常是先通過全量恢復的方式先將數據庫恢復到上一個全量恢復的時間點,然後再利用二進制日誌恢復到指定的時間點。

(1)binglog日誌的查看與執行

         Mysqlbinlog工具可以用來解析二進制日誌的內容,讓日誌可以被執行或者是查看

在數據庫中重新執行某個二進制日誌文件中的內容,可以使用如下命令:

# 執行binglog日誌
]# mysqlbinlog /data/mysql/data/mysql-bin.000014 | mysql -uroot –p
]# mysqlbinlog /data/mysql/data/mysql-bin.000012 /data/mysql/data/mysql-bin.000013 | mysql -uroot –p
# 對binglog日誌的導出也可先將日誌識別導出到文件,在導入到數據庫
]# mysqlbinlog /data/mysql/data/mysql-bin.000011 > testsql.sql
]# mysql -uroot -p <testsql.sql

(2)根據時間段恢復數據

         如果是恢復某個日誌文件中的一部分內容,可以通過指定—start-datetime或者是—stop-datetime參數來確定開始恢復時間和停止恢復時間。

# 跳過某個時間段恢復數據
~]# mysqlbinlog --stop-datetime="2018-11-07 20:19:04" /data/mysql/data/mysql-bin.000013|mysql -uroot -p 
~]# mysqlbinlog --start-datetime="2018-11-08 03:41:04" /data/mysql/data/mysql-bin.000013|mysql -uroot -p

(3)依據日誌點恢復數據

         基於binglog日誌恢復數據時也可以通過設置--start-position和--stop-position兩個參數指定開始位置和結束位置恢復數據。

# 從某個點開始恢復
]# mysqlbinlog --start-position=194 /data/mysql/data/mysql-bin.000014|mysql -uroot -p

4、通過Select … into語句導入與導出語句

(1)導出數據

         select … into outfile命令可以用來導出表中符合條件的數據到文本文件,不會導出表結構,僅用來導出數據。

         語句格式:select * from Table into outfile '/PATH/filename' fields terminated by ',' enclosed by '"' lines terminated by ‘\r\n'

         各字段說明:

                   TERMINATED BY:用於指定字段值之間的符號

                   ENCLOSED BY:用來指定包裹文件中字符值的符號

                   ESCAPED BY:用來指定轉義字符

# 將查詢的數據導入到文本文件中
mysql> select * from test_index01 into outfile "/tmp/test01.txt" fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

(2)導入數據

         使用select … into outfile導出的文本文件,可以通過load data infile命令導入到表裏,導入語句如下:

         load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]

         into table tbl_name

         [fields

         [terminated by't']

         [OPTIONALLY] enclosed by '']

         [escaped by'\' ]]

         [lines terminated by'n']

         [ignore number lines]

         [(col_name,   )]

各字段說明:

         terminated by:指定分隔符

         enclosed by:字段括起字符

         escaped by:轉義字符

         terminated by:描述字段的分隔符,默認情況下是tab字符(\t)

         enclosed by:描述的是字段的括起字符。

         escaped by:描述的轉義字符。默認的是反斜槓(backslash:\ ) 

         lines:指定了每條記錄的分隔符默認爲'\n'即爲換行符

         local: 如果指定local關鍵詞,則表明從客戶主機讀文件。如果local沒指定,文件必須位於服務器上

         replace和ignore關鍵詞控制對現有的唯一鍵記錄的重複的處理

# 導入備份的數據
mysql> load data infile '/tmp/test01.txt' into table test_index01 fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

5、通過Xtrabackup備份恢復數據

         Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),Xtrabackup有兩個主要的工具:xtrabackup、innobackupex,其中xtrabackup只能備份InnoDB和XtraDB兩種數據表,innobackupex則封裝了xtrabackup,同時可以備份MyISAM數據表。Xtrabackup做備份的時候不能備份表結構、觸發器等。

(1)Xtrabackup的特點

         1)備份過程快速、可靠;

         2)備份過程不會打斷正在執行的事務;

         3)能夠基於壓縮等功能節約磁盤空間和流量;

         4)自動實現備份檢驗;

         5)還原速度快

(2)Xtrabackup的安裝

         Xtrabackup下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/

         Xtrabackup提供了多種安裝方式,使用二進制包安裝,只需將xtrabackup下載下來將二進制包拷貝至二進制文件目錄”/usr/ bin”下即可。

# 下載二進制面編譯安裝包
]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/tarball/percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
# 解壓並將可執行文件拷貝至相應目錄
]# tar -xf percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
]# cp percona-xtrabackup-2.4.8-Linux-x86_64/bin/* /usr/bin/

(3)使用Xtrabackup進行全量備份與恢復

         全量備份:

# 備份所有的庫
]# xtrabackup --backup --target-dir=/data/mysql/backup/ -uroot -pdayi123 -P 3306 --host=127.0.0.1

         全量恢復:

         恢復過程中首先要執行prepare,將所有的數據文件都準備到同一個時間點,因爲在備份過程中所有的數據文件備份都是在不同的時間點,如果直接啓動可能會導致衝突。

# 恢復前將所有數據準備到同一個時間點
]# xtrabackup --prepare --target-dir=/data/mysql/backup
# 恢復數據
]# xtrabackup --copy-back --target-dir=/data/mysql/ --datadir=/data/mysql/data/
# 確保回覆後的數據的權限爲mysql
]# chown mysql:mysql /data/mysql/data –R
# 回覆後啓動mysql
]# /etc/init.d/mysqld start

(4)使用Xtrabackup進行增量備份與恢復

         增量備份:

# 先進行一次增量備份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181115_LVO/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
# 基於全量備份的增量備份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181116_LV1/ --incremental-basedir=/data/mysql/backup/20181115_LVO/ -uroot -pdayi123 -P 3306 --host=127.0.0.1
# 基於上一次增量備份的增量備份
]# xtrabackup --backup --target-dir=/data/mysql/backup/20181117_LV2/ --incremental-basedir=/data/mysql/backup/20181116_LV1/ -uroot -pdayi123 -P 3306 --host=127.0.0.1

         增量備份的恢復大體爲3個步驟:恢復完全備份——>恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最後一次增量備份去掉--redo-only參數)——>對整體的完全備份進行恢復,回滾那些未提交的數據。

# 恢復完全備份,並通過--redo-only參數應用xtrabackup日誌中已提交的事務數據,不回滾還未提交的數據
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --datadir=/data/mysql/data
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --incremental-dir=/data/mysql/backup/20181116_LV1/ --datadir=/data/mysql/data
# 將兩份增量備份引用到完全備份
]# xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/backup/20181115_LVO/ --incremental-dir=/data/mysql/backup/20181117_LV2/ --datadir=/data/mysql/data
# 使用全備恢復數據
]# xtrabackup --copy-back --target-dir=/data/mysql/backup/20181115_LVO/ --datadir=/data/mysql/data
# 更改數據目錄權限爲mysql
]# chown mysql:mysql /data/mysql/data -R

(5)使用innobackupex進行全量備份與恢復

         全量備份:

# 使用innobackupex進行全量備份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --port=3306 /data/mysql/back/

         全量備份恢復:

# 生成ib_logfile文件        
]# innobackupex --apply-log --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_04-43-50/
#還原數據到mysql的數據目錄,確保在my.cnf中設置datadir
]# innobackupex --copy-back --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_04-43-50/
# 修改數據目錄權限
]# chown mysql:mysql /data/mysql/data –R
# 啓動mysql
]# /etc/init.d/mysqld start

(6)使用innobackupex進行增量備份與恢復

         使用增量備份時,首先要有一個全量備份:

# 先進行一次全量備份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --port=3306 /data/mysql/back/
# 基於全量備份的增量備份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --incremental-basedir=/data/mysql/back/2018-11-09_05-30-52/ --incremental /data/mysql/back/
# 基於上次增量備份進行增量備份
]# innobackupex --user=root --password=dayi123 --host=127.0.0.1 --incremental-basedir=/data/mysql/back/2018-11-09_05-39-07/ --incremental /data/mysql/back/

         增量備份的恢復:

# 準備基礎的全量備份
]# innobackupex --apply-log --redo-only /data/mysql/back/2018-11-09_05-30-52/
# 準備增量備份1
]# innobackupex --apply-log --redo-only /data/mysql/back/2018-11-09_05-30-52/ --incremental-dir=/data/mysql/back/2018-11-09_05-39-07/
# 準備增量備份2,最後一個增量備份恢復不需要指定—redo-only
]# innobackupex --apply-log /data/mysql/back/2018-11-09_05-30-52/ --incremental-dir=/data/mysql/back/2018-11-09_05-40-55/
# 把所有的備份放在一起,準備全部備份來回滾暫停的事務
]# innobackupex --apply-log /data/mysql/back/2018-11-09_05-30-52/
# 恢復數據
]# innobackupex --copy-back --user=root --password=dayi123 --host=127.0.0.1 /data/mysql/back/2018-11-09_05-30-52/
# 修改mysql數據目錄的權限並啓動mysql
]# chown mysql:mysql /data/mysql/data –R
]# /etc/init.d/mysqld start

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章