【MySQL】MySQL備份與恢復

1. 備份數據的意義
針對不同業務,7*24小時提供服務和數據的重要性不同。
數據庫數據是比較核心的數據,對企業的經營至關重要,數據庫備份顯得尤爲重要。

2. 備份數據庫
MySQL數據庫自帶的備份命令 `mysqldump`,基本使用方法:
語法:`mysqldump -u username -p password dbname > filename.sql`

執行備份命令
`mysqldump -uroot -pmysqladmin db_test > /opt/mysql_bak.sql`

查看備份內容
`grep -v "#|\*|--|^$" /opt/mysql_bak.sql`

> 導出的格式沒有加字符集,會出現亂碼,一般恢復到數據庫會正常。INSERT語句是批量插入的方式,這樣恢復的效率會更高。

指定對應的字符集備份,默認字符集爲 `default-character-set=latinl`
`mysqldump -uroot -p'mysqladmin' --default-character-set=latinl db_test > /opt/mysql_bak.sql`

恢復數據
`mysql -uroot -p'mysqladmin' db_test < /opt/mysql_bak.sql`

參數`-B`的使用
`mysqldump -uroot -pmysqladmin -B db_test > /opt/mysql_bak_B.sql`
> 使用 -B 參數的作用是增加創建數據庫和連接數據的命令。即:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_test`
USE `db_test`;
恢復的時候也不用指定庫名稱。

優化備份文件大小減少輸出註釋
利用`mysqldump`的`--compact`參數優化備份結果

--compact參數說明:
優化輸出內容,輸出更簡潔,適合調試。
--skip-add-drop-table
--no-set-names
--skip-disable-keys
--skip-add-locks

指定壓縮命令壓縮備份MySQl數據
`mysqldump -uroot -p'mysqladmin' -B db_test|gzip > /opt/mysql_bak.sql.gz`

```
1. 導出數據用`-B`參數(帶創建數據庫語句)
2. 使用 `|gzip` 對數據進行壓縮
```

3. mysqldump備份原理
mysqldump 實際上就是把數據以sql語句的形式直接輸出。(邏輯備份)
恢復的過程就是把sql文件進行執行。

4. 備份多個庫
`mysqldump -uroot -p'mysqladmin' -B db_test db_test1 |gzip > /opt/all_bak.sql.gz`

-B(--database) 參數是關鍵,表示連接多個庫,並且增加 `CREATE DATABASE db_name` 、 `USE db_name`的信息。

-B 後的參數將被作爲數據庫名,該參數較常用。
當 -B 後的數據庫全部列出時,同 -A 參數。

5. 分庫備份
分庫備份實際上就是將每個庫執行一條命令單獨備份,使用對應的庫名作爲備份文件,以`.sql` 結尾。備份多個庫的命令如下:

1. 查詢所有的數據庫
`mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor"`

2. 在所有庫之前加上備份命令
`mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed 's#^#mysqldump -uroot -p'mysqladmin' -B #g'`

3. 將備份內容輸出到文件
`mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed -r 's#^([a-z].*$)#mysqldump -uroot -p'mysqladmin' -B \1|gzip > /opt/\1.sql.gz#g'`

4. 執行上述輸出的命令 `|bash`
`mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed -r 's#^([a-z].*$)#mysqldump -uroot -p'mysqladmin' --events -B \1|gzip > /opt/\1.sql.gz#g'| bash`

6. 分庫備份2
```bash
for dbname in `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor"`; do
mysqldump -uroot -p'mysqladmin' --events -B $dbname | gzip > /opt/bak/${dbname}_bak.sql.gz
done
```

7. 多表備份
`mysqldump -uroot -p'mysqladmin' db_name tb_test1 tb_test2 `

> 備份多表不使用`-B` 參數,第一個爲數據庫名稱,之後的爲表名稱

8. 分表備份
和分庫備份類似,每執行一條語句備份一個表,生成不同的文件。

> 分表備份缺點:文件較多

- 完整備份
- 分庫備份
- 分表備份
- 批量恢復

9. 備份表結構
`mysqldump -uroot -p'mysqladmin' --compact -d db_test tb_test`

10. 備份表數據
`mysqldump -uroot -p'mysqladmin' --compact -t db_test tb_test`


11. 刷新binlog參數
```
mysqldump -uroot -p'mysqladmin' -A -B --events|gzip > /opt/a.sql.gz
mysqldump -uroot -p'mysqlamdin' -A -B -F --events|gzip > /opt/a.sql.gz
-F 切割binlog

```

12. 記錄binlog位置
`mysqldump -uroot -p'mysqladmin' --master-data=1 --compact db_test`
`--master-data=1`
`--master-data=2` 將CHANGE語句加上註釋

--master-data 作用:
--master-data=1: 從庫
`CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=1191;`


**mysqldump 的關鍵參數說明**
`mysqldump --help`
-B 指定多個庫,增加建庫語句和 `USE` 語句
--compact 去掉註釋,調試使用
-A 所有庫
-F 刷新binlog日誌
--master-data 增加binlog日誌文件名及對應的位置點
-x, --lock-all-tables 鎖表
-l, --lock-tables 只讀鎖表
-d 只備份表結構
-t 只備份數據
--single-transaction 適合innodb事務數據庫備份

InnoDB 表在備份時,通常啓用選項 --single-transaction 來保證備份的一致性,實際上它的工作原理是設定本次會話的隔離級別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其它會話已經提交了的數據。

MyIsam備份命令:
mysqldump -uroot -p'mysqladmin' -A -B --master-data=2 -x --events|gzip > /opt/all.sql.gz

Innodb備份命令(推薦):
mysqldump -uroot -p'mysqladmin' -A -B --master-data=2 --single-transaction --events|gzip > /opt/all.sql.gz


### 數據庫恢復
1. source 數據恢復
`systel ls `執行系統命令
`source *.sql` 文件默認爲登錄mysql前的系統路徑

2. 標準恢復命令
```mysql
mysql -uroot -p'mysqladmin' -e "USE db_test; DROP tables; SHOW tables;"
mysql -uroot -p'mysqladmin' db_test < /opt/mysql_bak.sql
mysql -uroot -p'mysqladmin' -e "USE db_test;SHOW tables;"
```

提取目錄下的備份文件名
```bash
ls| awk -F "." '{print $1}'
sed 's#_bak.sql.gz##g'
```

循環恢復
```bash
for dbname in `sed 's#_bak.sql.gz##g'`; do
gzip -d ${dbname}_bak.sql.gz;
mysql -uroot -p'mysqladmin' $dbname < ${dbname}_bak.sql;
done
```

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