mysql備份與還原之mysqldump


一.備份類型
邏輯備份:把數據導出到一個文檔中(.sql/.txt)
適合場景:中小型數據庫

物理備份:保存/usr/local/mysql/data數據庫文件目錄
適合場景:大型數據庫

在線熱備(冗余):需要有多台機器,主備模式,集群模式

二.邏輯備份(mysqldump)
表級別備份
mysqldump [OPTIONS] database [tables]
庫級別備份
mysqldump [OPTIONS] --databases DB1 [DB2 DB3...]
全庫級別備份
mysqldump [OPTIONS] --all-databases [OPTIONS]

① 表級別備份
語法:mysqldump -p密碼 數據庫名稱 表名稱 > /tmp/mysqlbak/it_student.sql
案例:把db_itcast中的it_student表進行邏輯備份導出文件放入/tmp/mysqlbak目錄下
第一步:創建目錄
# mkdir /tmp/mysqlbak
第二步:備份數據表it_student
[root@localhost ~] # mysqldump -p123 db_itcast it_student > /tmp/mysqlbak/it_student.sql

② 表級別恢復

方法一:
第一步:登錄MySQL
# mysql -uroot -p
第二步:選擇數據庫(因為這個表屬於某一個數據庫)
mysql > use db_itcast;
第三步:使用source 導出sql文件路徑+名稱
mysql > source /tmp/mysqlbak/it_student.sql

方法二:

# mysql -u root -p 數據庫名稱 </tmp/mysqlbak/it_student.sql

③ 庫級別備份
退出mysql,使用mysqldump進行庫級別備份
語法:mysqldump -p123 --databases 數據庫名稱1 [數據庫名稱2] > /tmp/mysqlbak/db_itcast.sql

特別說明:
如果計算機中有多個MySQL實例,備份一定要指定備份那個MySQL
# mysqldump -S /tmp/mysql31.sock
案例:把db_itcast數據庫進行備份操作
# mysqldump --databases db_itcast > /tmp/mysqlbak/db_itcast.sql -p
Enter password:

④ 庫級別恢復

方法一:
第一步:登錄MySQL
# mysql -uroot -p
第二步:刪除原來的數據庫
mysql > drop database 數據庫名稱;
第三步:使用source命令恢復文件
mysql > source /tmp/mysqlbak/db_itcast.sql

方法二:

# mysql -u root -p </tmp/mysqlbak/db_itcast.sql

⑤ 全庫級別備份
基本語法:# mysqldump --all-databases [options] > /tmp/mysqlbak/all.sql
常用參數:
--flush-logs, -F 開始備份前刷新日志
--flush-privileges 備份包含mysql數據庫時刷新授權表
--lock-all-tables, -x MyISAM一致性,服務可用性(針對所有庫所有表)
--lock-tables, -l 備份前鎖表(針對要備份的庫)
--single-transaction 適用InnoDB引擎,保證一致性,服務可用性
--master-data=2  表示將二進制日志位置和文件名寫入到備份文件並在dump文件中注釋掉這一行;
--master-data=1  表示將二進制日志位置和文件名寫入到備份文件,在dump文件中不注釋這一行;
--master-data參數其他說明:
1)恢復時會執行,默認是1
2)需要RELOAD privilege並必須打開二進制文件
3)這個選項會自動打開--lock-all-tables,關閉--lock-tables

--single-transaction :保持數據的一致性與完整性
--master-data :開啟使用二進制文件,默認關閉的
開啟二進制文件:如果/usr/local/mysql目錄下存在my.cnf文件,則直接修改。如果沒有my.cnf文件,自己創建一個即可。
# vim my.cnf
# log-bin = /usr/local/mysql/data/mybinlog
# :wq
# service mysql restart

案例:對MySQL進行全庫備份(開啟二進制文件)
# mysqldump --all-databases --single-transaction --master-data > /tmp/mysqlbak/all.sql -p

⑥ 全庫級別恢復
# 退出MySQL
# exit
# 使用mysql命令進行恢復
# mysql < /tmp/mysqlbak/all.sql -p

三.mysqldump+二進制日志實現增量備份

1、特殊說明
mysqldump默認情況下不支持增量備份的,其提供了表級、庫級、全庫級備份
如果想實現增量備份必須結合二進制日志文件
2、說說什么是增量備份
增量備份 = 全量備份 + 后期增加的數據(要備份的核心)=== 差異備份
3、二進制日志文件(類似日常生活中的日記)
① 錯誤日志 :把mysql啟動、運行、關閉過程中產生的異常寫入到錯誤日志中$hostname.err
localhost.localdomain.err
在my.cnf配置文件中,可以通過如下形式進行定義:
# log-error = /usr/local/mysql/mysql.err
但是默認情況下,要特別注意:
第一種情況:如果定義了錯誤日志,但是沒有這個文件,會報錯,會導致數據庫無法啟動。
第二種情況:mysql.err沒有數據寫入,原因:權限問題 chown mysql.mysql mysql.err

② 一般查詢日志(數據查詢過程中產生的信息,了解)

當客戶端連接或斷開時,服務器會將信息寫入該日志,並記錄從客戶端收到的每一條SQL語句。當您懷疑客戶端的錯誤並想知道客戶端發送給mysqld的確切信息時,一般查詢日志可能非常有用。

默認情況下,一般查詢日志是==被禁用==的。 如果要開啟,可以使用以下參數:
general_log[={0|1} 0表示禁用,1表示開啟.
默認情況下,系統會在數據目錄下創建以host_name.log命名的一般查詢日志。如果要自己指定,可以使用以下參數:
指定一般查詢日志的路徑及文件名
general_log_file=/path/file.log
該參數用於定義general log和slow log的輸出目標
log-output=[value,...]

value=[TABLE|FILE|NONE],默認值為FILE
TABLE表示將日志記錄到表中,general_log表或者slow_log表中
FILE表示將日志記錄的文本文件中
NONE表示不記錄到表或者文件

注意:
如果log-output=NONE,則即使啟用了日志,也不會寫入條目。
如果log-output不等於NONE,但是沒有啟用日志也不會寫入條目。

③ 二進制日志(binary log,非常非常重要),我們對數據庫的任何更改(增加、修改、刪除)都會寫入到二進制日志文件中。
在my.cnf配置文件中,可以通過如下形式進行定義:
# log-bin = /usr/local/mysql/data/mybinlog
一般情況下,二進制文件沒有后綴
還有一點要特別注意:二進制日志沒有辦法直接通過cat命令查看,使用mysqlbinlog命令進行查看

4、具體增量備份步驟
① 首先要做全量備份
前提:先開啟二進制文件(my.cnf)
# log-bin = /usr/local/mysql/data/mybinlog
# 全量備份
# mysqldump --all-databases --single-transaction --flush-logs --master-data=2 > /tmp/mysqlbak/all.sql -p
問題:如果以上語句報錯,mysqldump: Got error: 1105: Unknown error when doing refresh
解決方案:代表mysql.err沒有權限,chown mysql.mysql /usr/local/mysql/mysql.err
② 對數據庫進行增刪改操作
at 120 按時間
# delete from it_student where id=5;
# insert into it_student values (null,'廖星辰',25,'男','9999.00','yunwei');
# insert into it_student values (null,'上官婉兒',19,'女','6666.00','ui');
③ 對二進制文件進行備份
# show master status
# mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| mybinlog.000003 | 980 | | | |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
方法一:備份03這個二進制日志文件
# cp /usr/local/mysql/data/mybinlog.000003 /tmp/mysqlbak/

方法二:把03這個二進制日志文件導出成sql文件
# mysqlbinlog mybinlog.000003
從以上命令中我們可以看到備份點:# at 209
# mysqlbinlog --start-position=209 mybinlog.000003 > /tmp/mysqlbak/mybinlog.sql

④ 模擬故障
drop database myblog;
use db_itcast;
drop table it_student;

⑤ 數據恢復
第一步:先進行全量恢復
# mysql < /tmp/mysqlbak/all.sql -p
第二步:恢復增量備份的數據
方案一:直接source 增量的sql文件
# mysql > source /tmp/mysqlbak/mybinlog.sql

方案二:恢復二進制文件
# mysqlbinlog --start-position=209 /tmp/mysqlbak/mybinlog.000003 |mysql -p
Enter password:123

⑥ 測試驗證
# select * from db_itcast.it_student;

二、邏輯導入導出(了解)
1、導入導出
只能針對數據表內容,最終結果:產生一個txt文本文檔
2、案例:把it_student表中的數據全部導出
基本語法:select 字段列表 into outfile '存放路徑+名稱' from 數據表
# use db_itcast
# select * into outfile '/tmp/mysqlbak/it_student.txt' from it_student
默認報錯:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
解決方案:出現以上錯誤,是因為我們沒有設置導出的目錄,在my.cnf中,設置以上目錄即可
vim my.cnf
secure-file-priv = ''
chown -R mysql.mysql /tmp/mysqlbak
service mysql restart
恢復數據:
# 必須有一個表,因為它只保存了表中的內容
# load data local infile '/tmp/mysqlbak/it_student.txt' into table '數據表名稱';

案例:把/etc/passwd文件,導入到以下表中:不要直接導入/etc/passwd,最好把/etc/passwd,最好把復制到/tmp/mysqlbak/password

CREATE TABLE `password` (
`uname` varchar(50) DEFAULT NULL,
`pass` char(2) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
`gid` int(11) DEFAULT NULL,
`comment` varchar(80) DEFAULT NULL,
`home` varchar(50) DEFAULT NULL,
`shell` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--fields-terminated-by=':' # 設置分隔符
--lines-terminated-by='\n' # \n代表遇到換行符就認為是一條記錄的結束

/tmp/mysqlbak/password一共有7列
root:x:0:0:備注:/root:/bin/bash

導入:mysqlimport dbname /path/file -p
案例:把/tmp/mysqlbak/password文件導入到password表中
mysqlimport db_itcast --fields-terminated-by=':' --lines-terminated-by='\n' /tmp/mysqlbak/password -p


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM