mysql日常維護工具--備份-還原

MySQL字符集

1:字符集介紹
字符集就是一套文字符號及其編碼、比較規則的集合,第一個計算機字符集ASC2!MySQL數據庫字符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念,其中字符集用來定義MySQL數據字符串的存儲方式,而校對規則定義比較字符串的方式

2:MySQL數據庫常見字符集介紹
在這裏插入圖片描述

選擇字符集建議使用國際標準的utf8

3:MySQL怎樣選擇合適的字符集
1、如果處理各種各樣的文字,發佈到不同語言國家地區,應選Unicode字符集,對MySQL來說就是utf8(每個漢字三個字節)
2、如果只是需要支持中文,並且數據量很大,性能要求也高,可選GBK(定長,每個漢字佔雙字節,英文也佔雙字節),如果是大量運算,比較排序等,定長字符集更快,性能也高
3、處理移動互聯網業務,可能需要使用utf8mb4字符集,apple,互聯網業務

4:查看當前MySQL支持的字符集
MySQL可以支持多種字符集,同一臺服務器,庫或表的不同字段都可以指定不同的字符集

[root@localhost ~]# mysql -uroot -p123456 -e "show character set \G;"   查看所有的字符集
查看常用的字符集:
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
          Charset: big5
      Description: Big5 Traditional Chinese
Default collation: big5_chinese_ci
           Maxlen: 2
*************************** 2. row ***************************
          Charset: dec8
      Description: DEC West European
Default collation: dec8_swedish_ci
           Maxlen: 1
*************************** 3. row ***************************
          Charset: cp850
      Description: DOS West European
Default collation: cp850_general_ci
           Maxlen: 1
*************************** 4. row ***************************
          Charset: hp8
      Description: HP West European
Default collation: hp8_english_ci
           Maxlen: 1
*************************** 5. row ***************************
          Charset: koi8r
      Description: KOI8-R Relcom Russian
Default collation: koi8r_general_ci
           Maxlen: 1
*************************** 6. row ***************************
          Charset: latin1
      Description: cp1252 West European
Default collation: latin1_swedish_ci
           Maxlen: 1
*************************** 7. row ***************************
          Charset: latin2
      Description: ISO 8859-2 Central European
Default collation: latin2_general_ci
           Maxlen: 1
*************************** 8. row ***************************
          Charset: swe7
      Description: 7bit Swedish
Default collation: swe7_swedish_ci
           Maxlen: 1
*************************** 9. row ***************************
          Charset: ascii
      Description: US ASCII
Default collation: ascii_general_ci
           Maxlen: 1
*************************** 10. row ***************************
          Charset: ujis
      Description: EUC-JP Japanese
Default collation: ujis_japanese_ci
           Maxlen: 3
*************************** 11. row ***************************
          Charset: sjis
      Description: Shift-JIS Japanese
Default collation: sjis_japanese_ci
           Maxlen: 2
*************************** 12. row ***************************
          Charset: hebrew
      Description: ISO 8859-8 Hebrew
Default collation: hebrew_general_ci
           Maxlen: 1
*************************** 13. row ***************************
          Charset: tis620
      Description: TIS620 Thai
Default collation: tis620_thai_ci
           Maxlen: 1
*************************** 14. row ***************************
          Charset: euckr
      Description: EUC-KR Korean
Default collation: euckr_korean_ci
           Maxlen: 2
*************************** 15. row ***************************
          Charset: koi8u
      Description: KOI8-U Ukrainian
Default collation: koi8u_general_ci
           Maxlen: 1
*************************** 16. row ***************************
          Charset: gb2312
      Description: GB2312 Simplified Chinese
Default collation: gb2312_chinese_ci
           Maxlen: 2
*************************** 17. row ***************************
          Charset: greek
      Description: ISO 8859-7 Greek
Default collation: greek_general_ci
           Maxlen: 1
*************************** 18. row ***************************
          Charset: cp1250
      Description: Windows Central European
Default collation: cp1250_general_ci
           Maxlen: 1
*************************** 19. row ***************************
          Charset: gbk
      Description: GBK Simplified Chinese
Default collation: gbk_chinese_ci
           Maxlen: 2
*************************** 20. row ***************************
          Charset: latin5
      Description: ISO 8859-9 Turkish
Default collation: latin5_turkish_ci
           Maxlen: 1
*************************** 21. row ***************************
          Charset: armscii8
      Description: ARMSCII-8 Armenian
Default collation: armscii8_general_ci
           Maxlen: 1
*************************** 22. row ***************************
          Charset: utf8
      Description: UTF-8 Unicode
Default collation: utf8_general_ci
           Maxlen: 3
*************************** 23. row ***************************
          Charset: ucs2
      Description: UCS-2 Unicode
Default collation: ucs2_general_ci
           Maxlen: 2
*************************** 24. row ***************************
          Charset: cp866
      Description: DOS Russian
Default collation: cp866_general_ci
           Maxlen: 1
*************************** 25. row ***************************
          Charset: keybcs2
      Description: DOS Kamenicky Czech-Slovak
Default collation: keybcs2_general_ci
           Maxlen: 1
*************************** 26. row ***************************
          Charset: macce
      Description: Mac Central European
Default collation: macce_general_ci
           Maxlen: 1
*************************** 27. row ***************************
          Charset: macroman
      Description: Mac West European
Default collation: macroman_general_ci
           Maxlen: 1
*************************** 28. row ***************************
          Charset: cp852
      Description: DOS Central European
Default collation: cp852_general_ci
           Maxlen: 1
*************************** 29. row ***************************
          Charset: latin7
      Description: ISO 8859-13 Baltic
Default collation: latin7_general_ci
           Maxlen: 1
*************************** 30. row ***************************
          Charset: utf8mb4
      Description: UTF-8 Unicode
Default collation: utf8mb4_general_ci
           Maxlen: 4
*************************** 31. row ***************************
          Charset: cp1251
      Description: Windows Cyrillic
Default collation: cp1251_general_ci
           Maxlen: 1
*************************** 32. row ***************************
          Charset: utf16
      Description: UTF-16 Unicode
Default collation: utf16_general_ci
           Maxlen: 4
*************************** 33. row ***************************
          Charset: utf16le
      Description: UTF-16LE Unicode
Default collation: utf16le_general_ci
           Maxlen: 4
*************************** 34. row ***************************
          Charset: cp1256
      Description: Windows Arabic
Default collation: cp1256_general_ci
           Maxlen: 1
*************************** 35. row ***************************
          Charset: cp1257
      Description: Windows Baltic
Default collation: cp1257_general_ci
           Maxlen: 1
*************************** 36. row ***************************
          Charset: utf32
      Description: UTF-32 Unicode
Default collation: utf32_general_ci
           Maxlen: 4
*************************** 37. row ***************************
          Charset: binary
      Description: Binary pseudo charset
Default collation: binary
           Maxlen: 1
*************************** 38. row ***************************
          Charset: geostd8
      Description: GEOSTD8 Georgian
Default collation: geostd8_general_ci
           Maxlen: 1
*************************** 39. row ***************************
          Charset: cp932
      Description: SJIS for Windows Japanese
Default collation: cp932_japanese_ci
           Maxlen: 2
*************************** 40. row ***************************
          Charset: eucjpms
      Description: UJIS for Windows Japanese
Default collation: eucjpms_japanese_ci
           Maxlen: 3
*************************** 41. row ***************************
          Charset: gb18030
      Description: China National Standard GB18030
Default collation: gb18030_chinese_ci
           Maxlen: 4
[root@localhost ~]# mysql -uroot -p123456 -e "show character set\G;" |egrep "gbk|utf8|latin1"|awk '{print $0}'  
mysql: [Warning] Using a password on the command line interface can be insecure.
          Charset: latin1
Default collation: latin1_swedish_ci
          Charset: gbk
Default collation: gbk_chinese_ci
          Charset: utf8
Default collation: utf8_general_ci
          Charset: utf8mb4
Default collation: utf8mb4_general_ci
[root@localhost ~]# mysql -uroot -p123456 -e "show variables like 'character_set%'";  查看MySQL當前的字符集設置情況
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> show create database TEST;   查庫的字符集
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| TEST     | CREATE DATABASE `TEST` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

遷移數據

(數量大,就不建議,在修改字符集前記得先備份)
由於之前建表沒注意字符集的問題,導致之前寫入的數據出現亂碼。現在要將之前的數據和現在數據的字符集一致,不出現亂碼情況

將字符集爲latin1已有記錄的數據轉成utf8,並且已經存在的記錄不亂碼

步驟
1:建庫及建表的語句導出,sed批量修改爲utf8
2:導出之前所有的數據
3:修改mysql服務端和客戶端編碼爲utf8
4:刪除原有的庫表及數據
5:導入新的建庫及建表語句
6:導入之前的數據

1):導出表結構

[root@localhost ~]# mysqldump -uroot -p123456 --default-character-set=latin1 -d TEST > TESTtable.sql
參數說明
mysqldump    導出數據的工具  
default-character-set  默認參數
latin1   原來字符集
-d 只要導出結構不要數據
TEST  庫名 
TESTtable.sql  自定義.sql

查看

[root@localhost ~]# ll
-rw-r--r--. 1 root root    0 10月 23 18:09 TESTtable.sql

修改
:%s/latin1/utf8/g 全文替換
在這裏插入圖片描述
保存退出

確保數據庫不再更新,導出所有數據

[root@localhost ~]# mysqldump  -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latin1 TEST>TESTdata.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

參數說明
–quick:用於轉儲大的表,強制mysqldump從服務器一次一行的檢索數據而不是檢索所有行,並輸出當前cache到內存中
–no-create-info:不要創建create table語句
–extended-insert:使用包括幾個values列表的多行insert語法,這樣文件更小,IO也小,導入數據時會非常快
–default-character-set=latin1:按照原有字符集導出數據,這樣導出的文件中,所有中文都是可見的,不會保存成亂碼

[root@localhost ~]# ll
總用量 8
-rw-r--r--. 1 root root 1621 10月 23 18:29 TESTdata.sql

修改
在這裏插入圖片描述

重新建庫(建庫前需要修改字符集或者在建庫的時候指定字符集)

mysql>  create database TEST2  default charset utf8;

進到新建的數據庫,導入表結構,導入數據

mysql> use TEST2;
mysql> source /root/TESTtable.sql;       #寫文件的絕對路徑
或者
[root@localhost ~]#mysql -uroot -p TEST2 < TESTtable.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
mysql> source /root/TESTdata.sql;
或者
[root@localhost ~]#mysql -uroot -p TEST2 < TESTdata.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

測試

mysql> insert into students values(22,5,'張三',3,'M');  #插入一條記錄

查看

Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+------+------+--------+------+------+
| uid  | id   | stname | age  | sex  |
+------+------+--------+------+------+
|   23 |    3 | xie    |   23 | M    |
|   44 |    8 | zhangs |   21 | M    |
|   45 |    7 | dd     |   21 | W    |
|    5 |    1 | dz     |   21 | W    |
|   40 |    6 | DD     |   26 | W    |
|   41 |   11 | DD     |  223 | W    |
|   41 |   11 | DD     |    3 | M    |
|   22 |    5 | r      |    3 | M    |
|   22 |    5 | 張三   |    3 | M    |
+------+------+--------+------+------+
9 rows in set (0.00 sec)

注意:選擇目標字符集時,要注意最好大於等於原字符集(字庫更大),否則可能會丟失不被支持的數據
做恢復前切記先備份

MySQL日常維護

1:mysqlcheck mysql修復工具
mysqlcheck客戶端工具可以檢查和修復MyISAM表,還可以優化和分析表。
實際上,它集成了mysql工具中check、repair、analyze、tmpimize的功能。
/usr/local/mysql/bin/mysqlcheck #源碼編譯安裝位置
rpm -qf which mysqlcheck yum安裝查看

參數選項:
mysqlcheck –-help 查看幫助
-c, --check (檢查表);
-r, --repair(修復表);
-a, --analyze (分析表);
-o, --tmpimize(優化表); //其中,默認選項是-c(檢查表)
-u, 使用mysql中哪個用戶進行操作

Mysqlcheck使用語法:
使用以下3種方式來調用mysqlcheck:

mysqlcheck[tmpions] db_name [tables]
mysqlcheck[tmpions] ---database DB1 [DB2 DB3...]
mysqlcheck[tmpions] --all--database

如果沒有指定任何表或使用—database或–all–database選項,則檢查整個數據庫。

[root@localhost ~]# mysqlcheck -uroot -p123456 TEST
mysqlcheck: [Warning] Using a password on the command line interface can be insecure.
TEST.students                                      OK

1:檢查表(check)

[root@localhost ~]# mysqlcheck -uroot -p123456 -c TEST
mysqlcheck: [Warning] Using a password on the command line interface can be insecure.
TEST.students                                      OK

2:修復表(repair)innodb的存儲引擎不支持修復,這個修復只支持myisam

[root@localhost ~]# mysqlcheck -uroot -p123456 -r TEST2 students 
mysqlcheck: [Warning] Using a password on the command line interface can be insecure.
TEST2.students
note     : The storage engine for the table doesn't support repair

修復指定的數據庫

[root@localhost ~]# mysqlcheck -uroot -p123456 -r --TEST2 students 
mysqlcheck -uroot -p123456 -A -r

參數-A 等於 --all-databases

每天定時對mysql數據庫進行優化
使用計劃任務
crontab –e

#0 1 * * * mysqlcheck -A -o -r  -u你的用戶名 -p你的密碼 > /dev/null 2>&1
0 3 * * *  mysqlcheck -uroot -p123456 -r -o -A > /dev/null 2>&1 每天3點優化

MySQL備份恢復

1)MySQL備份的類型
按照備份時對數據庫的影響範圍分爲:
Hot backup(熱備) Cold Backup(冷備)Warm Backup(溫備)
Hot backup:指在數據庫運行中直接備份,對正在運行的數據庫沒有任何影響。(Online Backup)官方手冊爲在線備份
Cold Backup:指在數據庫停止的情況下進行備份(OfflineBackup) 官方手冊稱爲離線備份
Warm Backup:備份同樣在數據庫運行時進行,但是會對當前數據庫的操作有所影響,例如加一個全局讀鎖以保證備份數據的一致性 #就是在備份的時候會鎖表

按照備份後文件內容:
邏輯備份 -->
指備份後的文件內容是可讀的,通常爲文本文件,內容一般是SQL語句,或者是表內的實際數據,如mysqldump和SELECT * INTO OUTFILE的方法,一般適用於數據庫的升級和遷移,恢復時間較長
裸文件備份–>
拷貝數據庫的物理文件,數據庫既可以處於運行狀態(mysqlhotcopy 、ibbackup、xtrabackup這類工具),也可以處於停止狀態,恢復時間較短。

按照備份數據庫的內容來分,又可以分爲:
完全備份:對數據庫完整的備份
增量備份:在上一次完全備份基礎上,對更新的數據進行備份(xtrabackup)
日誌備份:二進制日誌備份,主從複製

2)邏輯備份工具mysqldump
使用的時候MySQL當要導入或者導出數據量大的庫的時候,用PHPMYADMIN甚至MySQL Administrator這些工具都會力不從心,這時只能使用MySQL所提供的命令行工具mysqldump進行備份恢復。數據量大的時候不推薦使用,可支持MyISAM,InnoDB

MySQL數據的導出和導入工具:mysqldump

導出數據

語法: mysqldump [TMPIONS] database [tables] >導出的文件名.sql

A:導出所有數據庫

mysqldump -uroot -p123456 -A >all.sql
mysqldump -uroot -p123456 --all-databases >all2.sql

參數-A代表所有,等同於—all-databases

B:導出某個數據庫

mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名.sql  # 注意是-p空格後是數據庫名,不是密碼。
mysqldump -uroot -p123456 book >book.sql
vim book.sql

C:導出單張表

mysqldump -uroot -p123456 book books >books.sql  #導出book庫books表

D:導出庫的表結構

mysqldump -uroot -p123456 -d book>booktable.sql  #只導出book庫的表結構

E:只導出數據

mysqldump -uroot -p123456 -t book>bookdata.sql  #只導出book庫中的數據

F:導出數據庫,並自動生成庫的創建語句

mysqldump -uroot -p123456 -B book2 >book2.sql
mysql -uroot -p123456 < book2.sql  導入不用指定數據名

導入數據:

A:導入所有數據庫

mysql -uroot -p123456 <all.sql

B:導入數據庫

Mysql -uroot -p123456 book <book.sql  #如果導入時,沒有對應的數據庫,需要你手動創建一下:mysql> create database book;

使用source導入

mysql> create database book;
mysql> use book;
mysql> source /root/book.sql

c:導入表

mysql> drop table books;
mysql> source /root/books.sql;   ##導入表時,不需要重新,創建表。要先進到相應的數據庫中
mysql> select * from books;

D:導入表結構和數據

mysql> create database book;
mysql -uroot -p123456 book<booktable.sql
mysql -uroot -p123456 book<bookdata.sql

mysqlhotcopy-裸文件備份

--5.7版本已經去掉此命令,請在5.5以下測試

mysqlhotcopy使用lock tables、flush tables和cp或scp來快速備份數據庫.它是備份數據庫或單個表最快的途徑,完全屬於物理備份,但只能用於備份MyISAM存儲引擎和運行在數據庫目錄所在的機器上.與mysqldump備份不同,mysqldump屬於邏輯備份,備份時是執行的sql語句.
Mysqlhotcopy本質是使用鎖表語句後再使用cp或scp拷貝數據庫
1.安裝mysqlhotcopy所依賴的軟件包(perl-DBD)
yum install perl-DBD* -y
2.查看mysqlhotcopy幫助信息:

mysqlhotcopy –help
  --allowold   don't abort if target dir already exists (rename it _old) --不覆蓋以前備份的文件
  --addtodest  don't rename target dir if it exists, just add files to it      --屬於增量備份
   --noindices   don't include full index files in copy          --不備份索引文件
   --debug     enable debug                                 --啓用調試輸出
    --regexp=#   copy all databases with names matching regexp  --使用正則表達式
    --checkpoint=#  insert checkpoint entry into specified db.table    --插入檢查點條目
  --flushlog      flush logs once all tables are locked          --所有表鎖定後刷新日誌
  --resetmaster    reset the binlog once all tables are locked     --一旦鎖表重置binlog文件
  --resetslave  reset the master.info once all tables are locked  --一旦鎖表重置master.info文件 

舉例說明:
A:備份一個數據庫到一個目錄中

mysqlhotcopy -u root -p 123456 book /tmp  #-u –p 後面都有空格

在這裏插入圖片描述
在這裏插入圖片描述
對比下大小
[root@localhost~]# du -h /tmp/book/ /var/lib/mysql/book
48K /tmp/book/
48K /var/lib/mysql/book
B:備份多個數據庫到一個目錄

mkdir /tmp/book-mysql
mysqlhotcopy -u root -p 123456 book mysql /tmp/book-mysql
Flushed 24 tables with read lock (`book`.`books`, `book`.`category`, `mysql`.`columns_priv`, `mysql`.`db`, `mysql`.`event`, `mysql`.`func`, `mysql`.`help_category`, `mysql`.`help_keyword`, `mysql`.`help_relation`, `mysql`.`help_topic`, `mysql`.`host`, `mysql`.`ndb_binlog_index`, `mysql`.`plugin`, `mysql`.`proc`, `mysql`.`procs_priv`, `mysql`.`proxies_priv`, `mysql`.`servers`, `mysql`.`tables_priv`, `mysql`.`time_zone`, `mysql`.`time_zone_leap_second`, `mysql`.`time_zone_name`, `mysql`.`time_zone_transition`, `mysql`.`time_zone_transition_type`, `mysql`.`user`) in 0 seconds.
Locked 0 views () in 0 seconds.
Copying 7 files...
Copying indices for 0 files...
Copying 72 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 26 tables (79 files) in 0 seconds (0 seconds overall).

在這裏插入圖片描述
C:備份數據庫中的某個表
語法:mysqlhotcopy -u 用戶 -p 密碼 數據庫名./要備份的表名/ 要備份的路徑

mkdir /tmp/books
mysqlhotcopy -u root -p 123456 book./books/ /tmp/books/   #注意 / 一定要

在這裏插入圖片描述
實際上是把對應的表文件複製到/tmp目錄下
在這裏插入圖片描述
D:恢復數據
首先我們破壞數據

rm -rf /usr/local/mysql/data/book/

在這裏插入圖片描述
開始恢復

cp -ra /tmp/book/ /usr/local/mysql/data/
ll -d /usr/local/mysql/data/book/
drwxr-x--- 2 mysql mysql 4096 Nov  9 17:28 /usr/local/mysql/data/book/

在這裏插入圖片描述
在這裏插入圖片描述
總結:
mysqldump和mysqlhotcopy的比較:
1、mysqldump 是採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,數據庫大時,佔用系統資源較多,支持常用的MyISAM,innodb
2、mysqlhotcopy只是簡單的緩存寫入和文件複製的過程,佔用資源和備份速度比mysqldump快很多很多。特別適合大的數據庫,但需要注意的是:mysqlhotcopy只支持MyISAM 引擎
3、mysqlhotcopy只能運行在數據庫目錄所在的機器上,mysqldump可以用在遠程客戶端。
4、相同的地方都是在線執行LOCK TABLES 以及 UNLOCK TABLES
5、mysqlhotcopy恢復只需要COPY備份文件到源目錄覆蓋即可,mysqldump需要導入SQL文件到原來庫中。

xtrabackup備份工具使用

1、xtrabackup簡介
我們知道,針對InnoDB存儲引擎,MySQL本身沒有提供合適的熱備工具,ibbackup雖是一款高效的首選熱備方式,但它是是收費的。好在Percona公司給大家提供了一個開源、免費的Xtrabackup熱備工具,它可實現ibbackup的所有功能,並且還擴展支持真正的增量備份功能,是商業備份工具InnoDB Hotbackup的一個很好的替代品。

Xtrabackup包括兩個主要工具:Xtrabackup和innobackupex:
Xtrabackup只能備份InnoDB和XtraDB兩種引擎表,而不能備份MyISAM數據表。
innobackupex則封裝了xtrabackup,同時可以備份MyISAM數據表。Xtrabackup做備份的時候不能備份表結構、觸發器等等,智能區分.idb數據文件。另外innobackupex還不能完全支持增量備份,需要和xtrabackup結合起來實現全備的功能

下載
https://www.percona.com/downloads/Percona-Server-5.7/LATEST/
在這裏插入圖片描述
xtrbackup 安裝 (mysql5.7.28需安裝最新版XtraBackup2.4.9)
這個下載需要根據自己安裝的數據來進行選擇下載,我這裏安裝的是mysql5.7.28版本的數據庫

[root@localhost ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar 
[root@localhost ~]# yum -y install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

注意:安裝完成以後記得更改你的/etc/my.cnf配置文件制定數據目錄,因爲Xtrabackup是根據你的/etc/my.cnf配置文件來獲取你備份的文件,比如在/etc/my.cnf的[mysqld] 下添加datadir=/var/lib/mysql/,然後重啓mysqld

[root@localhost ~]#vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql/
[root@localhost ~]#systemctl restart mysqld   重啓數據庫

xtrbackup使用

一般使用innobackupex腳本
innobackupex是perl腳本對xtrabackup的封裝,和功能擴展。
備份準備工作:
權限和鏈接
xtrabackup需要連接到數據庫和datadir操作權限。
xtrabackup或者innobackupex在使用過程中涉及到2類用戶權限:
1.系統用戶,用來調用innobackupex或者xtrabackup

連接到服務:innobackupex或者xtrabackup通過—user和—password連接到數據庫服務
$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
$ innobackupex --user=LUKE  --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -   壓縮
$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/

2.數據庫用戶,數據庫內使用的用戶
其他連接選項:

Tmpion Description
–port The port to use when connecting to the database server with TCP/IP
–socket The socket to use when connecting to the local database.
–host The host to use when connecting to the database server with TCP/IP.

可以單獨創建用來備份數據庫的用戶,安全,並賦予對應的權限

4、全備和全備還原

使用innobackupex創建全備

需要的權限:連接到服務是爲了執行備份,需要在datadir上有read,write和execute權限。在數據庫中需要以下權限:
RELOAD和LOCK TABLES權限爲了執行FLUSH TABLES WITH READ LOCK   。
 REPLICATION CLIENT爲了獲取binary log 位置
 CREATE TABLESPACE權限爲了導入表,用戶表級別的恢復
SUPER權限在slave環境下備份用來啓動和關閉slave線程

創建全備:

[root@localhost ~]#innobackupex --user=root --password=123456 /tmp/db_backup/
191023 21:17:56 Executing UNLOCK TABLES
191023 21:17:56 All tables unlocked
191023 21:17:56 [00] Copying ib_buffer_pool to /tmp/db_backup/2019-10-23_21-17-54/ib_buffer_pool
191023 21:17:56 [00]        ...done
191023 21:17:56 Backup created in directory '/tmp/db_backup/2019-10-23_21-17-54/'
191023 21:17:56 [00] Writing /tmp/db_backup/2019-10-23_21-17-54/backup-my.cnf
191023 21:17:56 [00]        ...done
191023 21:17:56 [00] Writing /tmp/db_backup/2019-10-23_21-17-54/xtrabackup_info
191023 21:17:56 [00]        ...done
xtrabackup: Transaction log of lsn (2903592) to (2903601) was copied.
191023 21:17:56 completed OK!

在這裏插入圖片描述
出現completed OK!的字樣說明備份成功。

[root@localhost ~]#innobackupex --user=root --password=123456 /tmp/db_backup/ 2>>/tmp/db_backup/db_backup.log
2>>/tmp/db_backup/db_backup.log   #不顯示輸出信息,輸出信息重定向到db_backup.log

內部機制:在備份的時候innobackupex會調用xtrabackup來備份innodb表,並複製所有的表定義,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。

其他選項:
–no-timestamp,指定了這個選項備份會直接備份在BACKUP-DIR,不再創建時間戳文件夾。
–default-file,指定配置文件,用來配置innobackupex的選線

[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp /tmp/db_backup/full

在這裏插入圖片描述
innobackupex --user=root --password=123456 --no-timestamp /tmp/db_backup/full (使用–no-timestamp時,後面的這個full目錄必須跟上且不能提前自己建立,它由innobackupex自動建立,否則會報錯innobackupex: Error: Failed to create backup directory)

使用innobackupex還原備份

使用innobackupex --copy-back來還原備份

停止mysql:

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ll
總用量 110672
drwxr-x---. 2 mysql mysql     4096 10月 23 21:01 app
drwxr-x---. 2 mysql mysql     4096 10月 23 21:01 app2
drwxr-x---. 2 mysql mysql       20 10月 23 21:01 appfenfa
-rw-r-----. 1 mysql mysql       56 10月 23 21:02 auto.cnf
drwxr-x---. 2 mysql mysql       20 10月 23 21:01 book
-rw-------. 1 mysql mysql     1680 10月 23 21:02 ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 10月 23 21:02 ca.pem
-rw-r--r--. 1 mysql mysql     1112 10月 23 21:02 client-cert.pem
-rw-------. 1 mysql mysql     1680 10月 23 21:02 client-key.pem
-rw-r-----. 1 mysql mysql      456 10月 24 12:04 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 10月 24 12:04 ibdata1
-rw-r-----. 1 mysql mysql 50331648 10月 24 12:04 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 10月 23 21:02 ib_logfile1
drwxr-x---. 2 mysql mysql     4096 10月 23 21:01 mysql
drwxr-x---. 2 mysql mysql     8192 10月 23 21:01 performance_schema
-rw-------. 1 mysql mysql     1680 10月 23 21:02 private_key.pem
-rw-r--r--. 1 mysql mysql      452 10月 23 21:02 public_key.pem
-rw-r--r--. 1 mysql mysql     1112 10月 23 21:02 server-cert.pem
-rw-------. 1 mysql mysql     1680 10月 23 21:02 server-key.pem
drwxr-x---. 2 mysql mysql     8192 10月 23 21:01 sys
drwxr-x---. 2 mysql mysql       60 10月 23 21:01 TEST
drwxr-x---. 2 mysql mysql       20 10月 23 21:01 test1
drwxr-x---. 2 mysql mysql       60 10月 23 21:01 TEST2
drwxr-x---. 2 mysql mysql       20 10月 23 21:01 v6
-rw-r-----. 1 mysql mysql      414 10月 23 21:01 xtrabackup_info

注:刪除之前記得查看當前文件的屬主與屬組,數據恢復之後要保持一致,否則會無法啓動數據庫,當前目錄是數據庫數據存儲目錄
刪除數據:(危險動作):

[root@localhost ~]#rm -rf /var/lib/mysql/*
[root@localhost mysql]# ll
總用量 0

已刪除所有

還原:

[root@localhost mysql]# innobackupex --copy-back /tmp/db_backup/full/
191024 12:09:47 [01] Copying ./app2/prefix_signlog.MYD to /var/lib/mysql/app2/prefix_signlog.MYD
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./app2/prefix_user.frm to /var/lib/mysql/app2/prefix_user.frm
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./app2/prefix_user.MYI to /var/lib/mysql/app2/prefix_user.MYI
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./app2/prefix_user.MYD to /var/lib/mysql/app2/prefix_user.MYD
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./book/db.opt to /var/lib/mysql/book/db.opt
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
191024 12:09:47 [01]        ...done
191024 12:09:47 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
191024 12:09:47 [01]        ...done
191024 12:09:47 completed OK!
[root@localhost mysql]# ll
總用量 12332
drwxr-x---. 2 root root     4096 10月 24 12:09 app
drwxr-x---. 2 root root     4096 10月 24 12:09 app2
drwxr-x---. 2 root root       20 10月 24 12:09 appfenfa
drwxr-x---. 2 root root       20 10月 24 12:09 book
-rw-r-----. 1 root root      545 10月 24 12:09 ib_buffer_pool
-rw-r-----. 1 root root 12582912 10月 24 12:09 ibdata1
drwxr-x---. 2 root root     4096 10月 24 12:09 mysql
drwxr-x---. 2 root root     8192 10月 24 12:09 performance_schema
drwxr-x---. 2 root root     8192 10月 24 12:09 sys
drwxr-x---. 2 root root       60 10月 24 12:09 TEST
drwxr-x---. 2 root root       20 10月 24 12:09 test1
drwxr-x---. 2 root root       60 10月 24 12:09 TEST2
drwxr-x---. 2 root root       20 10月 24 12:09 v6
-rw-r-----. 1 root root      443 10月 24 12:09 xtrabackup_info

注意文件的屬主與屬組
修改文件的屬主

[root@localhost mysql]# chown -R mysql.mysql /var/lib/mysql/
[root@localhost mysql]# ll
總用量 12332
drwxr-x---. 2 mysql mysql     4096 10月 24 12:09 app
drwxr-x---. 2 mysql mysql     4096 10月 24 12:09 app2
drwxr-x---. 2 mysql mysql       20 10月 24 12:09 appfenfa
drwxr-x---. 2 mysql mysql       20 10月 24 12:09 book
-rw-r-----. 1 mysql mysql      545 10月 24 12:09 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 10月 24 12:09 ibdata1
drwxr-x---. 2 mysql mysql     4096 10月 24 12:09 mysql
drwxr-x---. 2 mysql mysql     8192 10月 24 12:09 performance_schema
drwxr-x---. 2 mysql mysql     8192 10月 24 12:09 sys
drwxr-x---. 2 mysql mysql       60 10月 24 12:09 TEST
drwxr-x---. 2 mysql mysql       20 10月 24 12:09 test1
drwxr-x---. 2 mysql mysql       60 10月 24 12:09 TEST2
drwxr-x---. 2 mysql mysql       20 10月 24 12:09 v6
-rw-r-----. 1 mysql mysql      443 10月 24 12:09 xtrabackup_info

啓動數據庫

[root@localhost mysql]# systemctl start mysqld

查看是否啓動成功

[root@localhost mysql]# netstat -luntp|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      9000/mysqld         
[root@localhost mysql]# ps -aux |grep mysqld
mysql      9000  2.4  8.7 1121868 177316 ?      Sl   12:12   0:01 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root       9035  0.0  0.0 112728   976 pts/0    S+   12:13   0:00 grep --color=auto mysqld

注:datadir必須是爲空的,innobackupex –copy-back不會覆蓋已存在的文件,還要注意,還原時需要先關閉服務,如果服務是啓動的,那麼就不能還原到datadir。

創建增量備份和還原

增量備份作用:減少備份數據重複,節省磁盤空間,縮短備份時間
增量備份的實現,依賴於innodb頁上面的LSN(log sequence number),每次對數據庫的修改都會導致LSN自增。增量備份會複製指定LSN<日誌序列號>之後的所有數據頁。

創建增量備份
1:首先創建全備
在創建增量備份之前需要一個全備,不然增量備份是沒有意義的。
[root@localhost ~]# innobackupex --user=root --password=123456 /tmp/db_backup/
這樣就會在/tmp/db_backup下創建一個時間戳文件夾 2019-10-24_12-18-19,文件夾下就是備份文件

檢查備份文件夾下的xtrabackup-checkpoints,查看信息

[root@localhost ~]# cd /tmp/db_backup/
[root@localhost db_backup]# cat 2019-10-24_12-18-19/xtrabackup_checkpoints 
backup_type = full-backuped    #全備的意思
from_lsn = 0
to_lsn = 2903592
last_lsn = 2903601      #創建第一個增量備份
compact = 0
recover_binlog_info = 0

登錄數據庫插入一些數據

[root@localhost db_backup]# mysql -uroot -p123456
mysql> use app;
mysql> insert into test  values (2,'tt',1234555);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test  values (2,'tet',1234555);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test  values (2,'4de',1234555);
Query OK, 1 row affected (0.01 sec)

插入三條數據

使用—incremental創建增量備份
innobackupex --user=root --password=123456 --incremental /增量1路徑 --incremental-basedir=全備路徑 後面指定這哪個全備上進行增量備份

[root@localhost ~]# innobackupex --user=root --password=123456 --incremental /tmp/db_backup/ --incremental-basedir=/tmp/db_backup/2019-10-24_12-18-19/

再查看LSN<日誌序列號>

[root@localhost ~]# cat /tmp/db_backup/2019-10-24_12-30-52/xtrabackup_checkpoints 
backup_type = incremental   #增量備份
from_lsn = 2903592  
to_lsn = 2905713
last_lsn = 2905722
compact = 0
recover_binlog_info = 0

增量備份的命令還可以這樣寫
可以使用指定—incremental-lsn來代替—incremental-basedir的方法創建增量備份。

[root@localhost ~]# innobackupex --user=root --password=123456 --incremental /tmp/db_backup/ ----incremental-lsn=2903592 #從這個編號點開始備份

注意:xtrabackup只會影響xtradb或者innodb的表,其他引擎的表在增量備份的時候只會複製整個文件,不會差異。
測試:
停止mysql,刪除數據rm –rf /var/lib/mysql/*
還原增量備份
增量備份的恢復比全備要複雜一點,第一步是在所有備份目錄下重做已提交的日誌,如:

innobackupex --apply-log --redo-only BASE-DIR  
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  

還原
先還原全備
再按順序還原增量備份,逐個還原既可。

注意:如果僅有一份增量備份,第2條語句忽然
其中BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。
這裏要注意的是:最後一步的增量備份並沒有–redo-only選項!
以上語句執行成功之後,最終數據在BASE-DIR(即全備目錄)下。

第一步完成之後,我們開始第二步:回滾未完成的日誌:
innobackupex --apply-log BASE-DIR
上面執行完之後,BASE-DIR裏的備份文件已完全準備就緒,最後一步是拷貝:
innobackupex --copy-back BASE-DIR
恢復mysql權限 chown –R mysql.mysql /var/lib/mysql/
最後啓動systemctl start mysqld 

檢驗數據是否恢復正常

官方有手冊可以下載
官方文檔可以參考:
https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

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