1.資料庫的備份 備份=拷貝加管理,防止數據的丟失同時記錄用戶的操作記錄。其中最有效的備份是對IT架構進行備份。 原則: (1)資料庫要定期備份,備份的周期應當根據應用數據系統可承受的恢復時間,而且定期備份的時間應當在系統負荷最低的時候進行。對於重要的數據,要保證在極端情況下的損失都可以正常恢復。 ...
1.資料庫的備份
備份=拷貝加管理,防止數據的丟失同時記錄用戶的操作記錄。其中最有效的備份是對IT架構進行備份。
原則:
(1)資料庫要定期備份,備份的周期應當根據應用數據系統可承受的恢復時間,而且定期備份的時間應當在系統負荷最低的時候進行。對於重要的數據,要保證在極端情況下的損失都可以正常恢復。
(2)定期備份後,同樣需要定期做恢複測試,瞭解備份的正確可靠性,確保備份的有意義的、可恢復的。
(3)根據系統需要來確定是否採用增量備份,增量備份只需要備份每天的增量數據,備份花費的時間少,對系統負載的壓力也小。缺點是恢復的時候需要載入之前所有的備份數據。恢復時間較長。
(4)確保mysql打開了log-bin選項,mysql在做完整恢復或者基於時間點恢復的時候都需要binlog。
(5)可以考慮異地備份。
2.邏輯備份和恢復
(1)邏輯備份:也可以成為文件級備份,是將資料庫中的數據備份為一個文本文件,而備份大小取決於文件大小。並且該文本文件是可以移植到其他機器上的,甚至是不同硬體結構的機器。
- 使用mysqldump命令生成insert語句備份
語法:mysqldump [arguments] >file_name.sql
使用幫助如下:
[root@cai ~]# mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump –help 例:備份所有資料庫,語句如下: [root@cai dumpback]# mysqldump -uroot -p123456 --all-databases >/tmp/dumpback/alldb.sql 備份某些資料庫,語法如下: [root@cai dumpback]# mysqldump -uroot -p123456 --databases aa >/tmp/dumpback/data_aa.sql 備份某資料庫中的表,語句如下: [root@cai dumpback]# mysqldump -uroot -p123456 aa cairui >/tmp/dumpback/aa_cairui.sql 查看備份內容,語句如下: [root@cai dumpback]# more aa_cairui.sql
如何保證數據備份的一致性?有以下兩種方法:
①同一時刻取出所有數據
對於事務支持的存儲引擎,如innodb或者bdb等,可以通過控制將整個備份過程在同一事物中,使用 -single-transaction test>test_backup.sql選項
例:[root@cai dumpback]# mysqldump -uroot -p123456 --single-transaction aa >/tmp/dumpback/aa_backup.sql
②資料庫中的數據處於靜止狀態
通過鎖表參數未完成
LOCK-TABLES 每次鎖定一個資料庫的表,此參數預設為true
LOCK-ALL-TABLES 一次鎖定所有的表,適用於dump的表分別處於各個不同的資料庫中的情況。
l 生成特定格式的純文本文件備份
①通過select … to outfile from … 命令
參數如下:
fields escaped by [‘name’]:在sql語句中需要轉義的字元
fields terminated by:設定每兩個欄位之間的分隔符
fields [optionally] enclosed by ‘name’:包裝,有optionally數字類型不被包裝,否則全包裝。
lines terminated by ‘name’:行分隔符,即每記錄結束時添加的字元。
例:mysql> select * into outfile '/tmp/tb1.txt' -> fields terminated by ',' -> optionally enclosed by '"' -> lines terminated by '\n' -> from cai limit 50;
②通過mysqldump工具命令導出文本。
用此方法可以生成一個文本數據和一個對應的資料庫結構創建腳本,主要參數:
-T,--tab=name
例:導出sqoop庫的tb1表(http://blog.itpub.net/31386161/viewspace-2130313/錯誤處理方法)
[root@cai ~]# mysqldump -uroot -p123456 -T /tmp sqoop tb1 --fields-enclosed-by=\" --fields-terminated-by=,
(2)邏輯備份的恢復
[root@cai dumpback]# mysql -uroot -p123456 -D cai </tmp/dumpback/aa_cairui.sql
將aa底下的cairui表恢復到cai database下
②純文本文件的恢復
使用mysqllimport工具恢復,此工具可以用於恢復生成txt和sql兩文件,所以保證txt文件對應的資料庫的表存在。
首先恢復表結構,語句如下: [root@cai tmp]# mysql -uroot -p123456 -D aa </tmp/tb1.sql 恢複數據,語句如下: [root@cai tmp]# mysqlimport -uroot -p123456 aa --fields-enclosed-by=\" --fields-terminated-by=, /tmp/tb1.txt
3.物理備份和恢復
物理備份比邏輯備份速度要快,分為以下兩種:
a。冷備份:這種方式是最直接的備份方式,就是首先停掉資料庫服務,然後cp數據文件,恢復時停止mysql,先進行操作系統級別恢覆文件,然後重啟mysql服務,使用mysqlbinlog工具恢復自備份以來的所有binlog。這種方式雖然簡單,而且對所有引擎支持,但是有一個非常大的弊端就是需要關閉資料庫服務。在當前的大多數信息系統都是不允許長期時間停機的。
b。熱備份:對於不同的存儲引擎方法也不同
4.各種備份與恢復方法的具體實現
(1)利用select into outfile實現數據備份與還原
①把需要備份的數據備份出來
mysql> select * from students; +------+------+------+ | id | name | age | +------+------+------+ | 1 | li | 36 | | 2 | wang | 26 | | 3 | cai | 12 | mysql> select * from students where age>30 into outfile '/tmp/students.txt';//將年齡大於30的同學的信息備份出來
發現students。txt是文本文件,不能直接導入資料庫,需要使用load data infile恢復到mysql伺服器端,刪除年齡大於30的用戶,模擬數據被破壞。
mysql> delete from students where age>30; mysql> load data infile '/tmp/students.txt' into table students;
(2)備份策略:完全備份+增量備份+二進位日誌
①先給資料庫做完全備份
http://www.cnblogs.com/kerrycode/p/4565669.html(錯誤解決辦法)
[root@cai tmp]# mysqldump -uroot -p123456 --single-transaction --master-data=2 --databases hellodb >/backup/hellodb_'data+%F'.sql
②回到mysql伺服器端更新數據
mysql> use hellodb; Database changed mysql> create table tb1(id int); Query OK, 0 rows affected (0.02 sec) mysql> insert into tb1 values(1),(2),(3); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0
③先查看完全備份文件裡面記錄的位置
[root@cai backup]# cat hellodb_data+%F.sql | less -- CHANGE MASTER TO MASTER_LOG_FILE='cai-bin.000001', MASTER_LOG_POS=107;(記錄了二進位日誌的位置)
④回到伺服器端
mysql> show master status;顯示此時的二進位日誌的位置,從備份文件裡邊記錄的位置到我們此時的位置即為增量的部分。 +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | cai-bin.000001 | 394 | | | +----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
⑤做增量備份
[root@cai backup]# mysqlbinlog --start-position=107 --stop-position=394 /application/mysql/data/cai-bin.000001 >/backup/hellodb_'data+$F_%H'.sql
⑥再回到伺服器
mysql> insert into tb1 values(4),(5); mysql> drop database hellodb;
⑦導出這次二進位日誌
[root@cai backup]# mysqlbinlog --start-position=394 /application/mysql/data/cai-bin.000001 查看刪除操作時二進位日誌的位置 [root@cai backup]# mysqlbinlog --start-position=394 --stop-position=587 /application/mysql/data/cai-bin.000001 >/tmp/hellodb.sql(導出二進位日誌)
⑧先讓mysql離線
mysql>set sql_log_bin=0;關閉二進位日誌 mysql>flush logs;滾動下日誌
⑨模擬資料庫破壞
mysql>drop database hellodb;
⑩開始恢複數據
#mysql </backup/hellodb_2013-09-08.sql導入完全備份文件 #mysql </backup/hellodb_2013-09-08_05.sql導入增量備份文件 #mysql <hellodb.sql//導入二進位文件
(1真正生產環境中,應該導出的是整個mysql伺服器中的數據,而不是單個資料庫,因此應該使用-all-databases。
(2在導出二進位日誌的時候,可以直接複製文件即可,但是要註意的是,備份之前滾動下日誌。
(3利用LVM快照實現幾乎熱備的數據備份與恢復。
重要:使用xtrabackup做備份恢復
1.優勢
(1)快速可靠的進行完全備份
(2)在備份的過程中不影響事務
(3)支持數據流、網路傳輸、壓縮,所以它可以有效地節約磁碟資源和網路帶寬。
(4)可以自動備份檢驗數據的可用性。
a。安裝rabackup
[root@cai tools]# tar zxf percona-xtrabackup-2.4.2-Linux-x86_64.tar.gz [root@cai tools]# mv percona-xtrabackup-2.4.2-Linux-x86_64 /application/percona-xtrabackup2.4.2 [root@cai tools]# ln -s /application/percona-xtrabackup2.4.2/ /application/xtrabackup [root@cai tools]# echo "export PATH=\$PATH:/application/xtrabackup/bin" >> /etc/profile [root@cai tools]# . /etc/profile
b。全量備份
mysql> create user 'backup'@'%' identified by '123456';創建備份用戶 mysql> grant all on *.* to 'backup'@'%';授權 mysql> flush privileges;使生效 mysql> select * from cairui; +------+------+ | id | name | +------+------+ | 1 | li | | 2 | wang | 測試的表為cairui 在cai底下
[root@cai backup]# innobackupex --user=root --password=123456 /data/backup/(備份到backup下)170511 16:46:14 completed OK!表示成功
xtrabackup_checkpoints:備份類型、備份狀態和LSN(日誌序列號)範圍信息。
xtrabackup_binlog_info:mysql伺服器當前正在使用的二進位文件及備份這一刻為止的二進位日誌事件的位置。
xtrabackup_logfile:非文本文件,xtrabackup自己的日誌文件。
backup-my.cnf:備份時數據文件中關於mysql的配置。
mysql> delete from bb where age >30; xtrabackup的增量備份代碼如下: [root@cai backup]# innobackupex --user=root --password=123456 --incremental /data/backup/--incremental-basedir=/data/backup/2017-05-11_16-57-24