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