Mysql 與Xtrabackup 詳解

簡介

CentOS 7.0中,已經使用MariaDB替代了MySQL數據庫,因爲MYSQL被Oracle收購以後, MYSQL兄弟MariaDB繼續開源事業。

安裝

yum -y install httpd mariadb-server mariadb

啓動服務、查看服務

systemctl start mariadb 
systemctl enable mariadb 
systemctl status mariadb

安全配置嚮導

安裝完mysql-server 會提示可以運行mysql_secure_installation。運行mysql_secure_installation會執行幾個設置:
1.爲root用戶設置密碼
2.刪除匿名賬號
3.取消root用戶遠程登錄
4.刪除test庫和對test庫的訪問權限
5.刷新授權表使修改生效

mysql_secure_installation,詳細步驟請參看下面的命令:
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):#<–初次運行直接回車
OK, successfully used password, moving on…
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] #<– 是否設置root用戶密碼(如果已設置密碼,輸n)
... skipping
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] #<– 是否刪除匿名用戶,生產環境建議刪除,所以直接回車或Y
… Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] #<–是否禁止root遠程登錄,根據自己的需求選擇Y/n並回車,建議禁止
… Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] #<– 是否刪除test數據庫,直接回車或Y
- Dropping test database…
… Success!
- Removing privileges on test database…
… Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] #<– 是否重新加載權限表,直接回車
… Success!
Cleaning up…
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!

測試數據庫連接

語法mysql -h IP -u USER -pPASS

mysql -u root –p –h 10.10.10.68

字符集

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

MySQL數據庫常見字符集介紹

MySQL怎樣選擇合適的字符集

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

查看支持數據庫所有的字符集

mysql -uroot -e "show character set \G;"

查看當前字符集設置情況

show variables like 'character_set%';

實操作

將字符集爲latin1已有記錄的數據庫test轉成utf8,並且已經存在的記錄不亂碼
1.導出表結構(此處一定要按原數據表字符集導)

mysqldump –uroot --default-character-set=latin1 -d test> testtable.sql
  1. 將testtable.sql中latin1修改成utf8
  2. 確保數據庫不再更新,導出所有數據
mysqldump -uroot --quick --no-create-info --extended-insert --default-character-set=latin1 test>testdata.sql

參數說明

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

3.打開testdata.sql 將SET NAME latin1 修改成SET NAME utf8
4.重新建庫

create database test2 default charset utf8;

5.導表結構

mysql –uroot test2<testtable.sql

6.導數據

mysql -uroot test2 <testdata.sql

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

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)
日誌備份:二進制日誌備份,主從複製

邏輯備份工具mysqldump

MySQL所提供的命令行工具mysqldump進行備份恢復,可支持MyISAM,InnoDB(數據量大的時候不推薦使用,)

備份全部數據庫的數據和表結構

mysqldump -uroot -ppassword -A >all.sql

只備份結構,不備份數據

mysqldump -uroot -ppassword -A -d > database.sql

只備份數據庫,不備份結構

mysqldump -uroot -ppassword -A -t > data.sql

備份單個數據庫的數據和表結構(只備份數據或者表結構可以用-t或者-d)

mysqldump -uroot -password dbname > dbname.sql

一次性備份多個數據庫的數據和表結構(只備份數據或者表結構可以用-t或者-d)

mysqldump -uroot -ppassword db1 db2 > dbs.sql

備份一個表結構(只備份數據可以用-t)

mysqldump -d db1 table1 -uroot -ppassword > dbs.sql

備份多個表結構(只備份數據可以用-t)

mysqldump -d -B db1 --tables table1 table2 -uroot -ppassword > dbs.sql

還原數據庫

mysql -uroot -ppassword
mysql> source all.sql

參數

--all-databases, -A: 備份所有數據庫
--databases, -B: 用於備份多個數據庫,如果沒有該選項,mysqldump把第一個名字參數作爲數據庫名,後面的作爲表名。使用該選項,mysqldum把每個名字都當作爲數據庫名。
--force, -f:即使發現sql錯誤,仍然繼續備份
--host=host_name, -h host_name:備份主機名,默認爲localhost
--no-data, -d:只導出表結構
--password[=password], -p[password]:密碼
--port=port_num, -P port_num:制定TCP/IP連接時的端口號
--quick, -q:快速導出
--tables:覆蓋 --databases or -B選項,後面所跟參數被視作表名
--user=user_name, -u user_name:用戶名
--xml, -X:導出爲xml文件

xtrabackup備份工具使用

針對InnoDB存儲引擎,MySQL本身沒有提供合適的熱備工具,開源、免費的Xtrabackup熱備工具,它可實現ibbackup的所有功能,並且還擴展支持真正的增量備份功能。
Xtrabackup包括兩個主要工具:Xtrabackup和innobackupex:
Xtrabackup只能備份InnoDB和XtraDB兩種引擎表,而不能備份MyISAM數據表。
innobackupex則封裝了xtrabackup,同時可以備份MyISAM數據表。Xtrabackup做備份的時候不能備份表結構、觸發器等等,智能區分.idb數據文件。另外innobackupex還不能完全支持增量備份,需要和xtrabackup結合起來實現全備的功能

XtraBackup優勢

1.備份過程不鎖表,快速可靠
2.備份過程不會打斷正在執行的事務
3.能夠基於壓縮等功能節約磁盤空間和流量

安裝

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 
tar -xvf Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar 
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=/usr/local/mysql/data,然後重啓mysql

vim /etc/my.cnf  #在mysqld的範圍添加
[mysqld]
datadir=/usr/local/mysql/data
systemctl restart mysqld    #重啓msyql

xtrbackup使用

我們一般使用innobackupex腳本,innobackupex是perl腳本對xtrabackup的封裝,和功能擴展。

備份權限準備工作

XtraBackup需要能夠連接到數據庫服務器,並創建備份、在某些場景中進行準備和恢復備份時,在服務器的datadir上執行操作。爲了做到這一點,必須滿足其執行的特權和權限要求。無論使用xtrabackup還是innobackupex,都會涉及兩個角色。
調用程序的用戶(系統用戶)和在數據庫服務器中執行操作的用戶(數據庫用戶)。

系統用戶權限

它需要有對備份目錄的讀寫權限以及數據目錄(datadir)的讀、寫和執行權限。
注意:備份後的文件屬性爲執行命令時的用戶的屬性。例如,原數據庫文件屬於mysql用戶,root用戶調用命令則生成的文件的屬主屬於root用戶,同樣恢復時屬性也不會變化,需要手動更改爲mysql屬主。

數據庫用戶權限

由於備份時需要使用賬號密碼連接到數據庫,所以需要有適當權限(不推薦使用root)

mysql>CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'password'; 
mysql>GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; 
mysql> FLUSH PRIVILEGES;

參數

1.RELOAD重新加載和LOCK TABLES鎖定表(除非指定了-no-lock選項)二個權限,LOCK TABLES是爲了在開始複製文件之前使用READ LOCK讀鎖, 在使用備份鎖時,用於備份的鎖表和用於備份的鎖BINLOG需要此特權。RELOAD是爲了刷新引擎日誌來FLUSH TALBES刷新表。
2.REPLICATION CLIENT複製權限,是客戶端爲了獲得二進制日誌位置。
3.TABLESPACE表空間權限,創建表空間以導入表(參見恢復各個表)。
4.PROCESS進程權限,是爲了運行SHOW ENGINE INNODB STATUS(這是強制性的),並可選地看到所有線程運行在服務器上(見改進的嵌入式表與讀鎖處理)。
5.SUPER權限,爲了在複製環境中啓動/停止從線程,使用XtraDB更改後的頁面跟蹤來進行增量備份和改進的具有讀鎖處理的刷新表。
6.CREATE privilege特權 是爲了創建PERCONA_SCHEMA.xtrabackup_history庫和表。
7.INSERT privilege特權,是爲了添加歷史記錄PERCONA_SCHEMA.xtrabackup_history 表。
8.select privilege特權,是爲了使用innobackupex—incremental-history-name或innobackupex—incremental-history-uuid,以便特性在PERCONA_SCHEMA.xtrabackup_history 表中查找innodb_to_lsn值。

全備

innobackupex --user=bkpuser --password=password /tmp/db_backup/ 2>>/tmp/db_backup/db_backup.log   #不顯示輸出信息,輸出信息重定向到db_backup.log

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

其他選項:
--no-timestamp,指定了這個選項備份會直接備份在BACKUP-DIR,不再創建時間戳文件夾。
--default-file,指定配置文件,用來配置innobackupex的選項
innobackupex --user=bkpuser --password=password --no-timestamp /tmp/db_backup/full
innobackupex --user=bkpuser --password=password --no-timestamp /tmp/db_backup/full (使用--no-timestamp時,後面的這個full目錄必須跟上且不能提前自己建立,它由innobackupex自動建立,否則會報錯innobackupex: Error: Failed to create backup directory)

還原備份

Systemctl stop mysqld #停止mysql
rm -rf /var/lib/mysql/* #刪除數據:(危險動作):
innobackupex --copy-back /tmp/db_backup/xxxfile/  #還原,其中xxxfile是備份生成的文件
ll /usr/local/mysql/data/  #查看權限
chown -R mysql:mysql /var/lib/mysql/   #重新授權,要不然mysql啓動不起來
systemctl restart mysqld

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

增量備份

增量備份作用:減少備份數據重複,節省磁盤空間,縮短備份時間
增量備份的實現,依賴於innodb頁上面的LSN(log sequence number),每次對數據庫的修改都會導致LSN自增。增量備份會複製指定LSN<日誌序列號>之後的所有數據頁。
在創建增量備份之前需要一個全備,不然增量備份是沒有意義的。
檢查備份文件夾下的xtrabackup-checkpoints,查看信息

cat /tmp/db_backup/ xxxfile /xtrabackup_checkpoints
backup_type = full-backuped #全備的意思
from_lsn = 0
to_lsn = 1600459
last_lsn = 16004592:創建第一個增量備份

然後數據有變化後,使用格式 innobackupex --user=bkpuser --password=password --incremental /增量1路徑 --incremental-basedir=全備路徑 後面指定這哪個全備上進行增量備份

innobackupex --user=bkpuser --password=password --incremental /tmp/db_backup/ --incremental-basedir=/tmp/db_backup/ xxxfile /

再查看LSN<日誌序列號>

cat /tmp/xxxfile/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1600459
to_lsn = 1601301
last_lsn = 1601301

增量備份創建的替代方法

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

innobackupex --user=bkpuser --password=password --incremental /tmp/db_backup/ --incremental-lsn=1600459  #從這個編號點開始備份

增量備份還原

增量備份的恢復比全備要複雜一點,第一步是在所有備份目錄下重做已提交的日誌,如:

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

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

innobackupex --apply-log BASE-DIR

然後BASE-DIR裏的備份文件已完全準備就緒,最後一步是拷貝

innobackupex --copy-back BASE-DIR
chown –R mysql.mysql /var/lib/mysql/ #恢復mysql權限
systemctl start mysqld  #最後啓動

檢驗數據是否恢復正常

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