一、備份的目的
做災難恢復:對損壞的數據進行恢復和還原。
二、備份需要考慮的問題
可以接受丟失多少數據;
恢復數據的時間要多久;
恢復數據時是否持續提供服務;
恢復的對象,是一個庫,多個表,單個表,還是整個數據庫。
三、備份的類型
1,完全備份 每次對數據庫的數據進行完全備份,備份整個數據庫。所以完全備份耗時較長。
2,增量備份 在上次備份的基礎上,備份更新的數據。
四、如何完全備份
在數據庫較小,要備份的庫小於(50G)時可以使用mysql 自帶的備份工具mysqldump進行數據庫或者表的完全備份。
Mysqldump 工具備份
優點:
備份的粒度靈活,既可以備份整個mysql服務也可以備份單個的庫或者表。
缺點:
1,當數據浮點數時會出現精度丟失。
2,Mysqldump 備份的過程是串行化的,不會並行的進行備份,當備份的數據量較大時,耗時太長效率太低。
Mysqdump 工具對innodb 的儲存引擎支持熱備,即在不影響服務使用的情況下備份。
使用語法;
在命令行下 mysqldump -uroot -p‘password’ 數據庫名稱 > 備份文件的名稱以 . sql 結尾.
-B 選項 導出指定的某個/某幾個庫 用空格 隔開 包含 create database 的語句.
五、如何增量備份
二進制日誌,binary log
記錄著數據庫的所有增、刪、改、等操作日誌。可以使用 mysqlbinlog 在命令行下查看日誌。可利用binlog日誌文件進行數據的備份和還原。
查看數據binlog功能是否開啟
Show variables like ‘log_bin%’;
要開啟binlog功能可以修改 my.cnf文件
在文件尾部添加 log-bin=/data/mysql/log/mysql_bin
server-id=1
重啟mysql服務使其生效即可.
Mysqlbinlog 指定binlog 文件 | mysql -uroot -p 密碼 即可恢復指定日誌文件中所記錄的所有操作.
六、備份和恢復數據庫實驗。
準備實驗環境
1,進入mysql到中 ,創建實驗數據庫 create database shiyan;
Use shiyan; 切換當前數據庫為 shiyan
Create table kdata1(id int,name char(200)); 創建表一
2, 修改 my.cnf mysql配置文件. 在最後一行插入
Log-bin=/data/mysql/log/mysql_bin
Server-id=1
重啟mysql服務使修改的配置項生效 也就是開啟 binlog服務
3,
先對實驗數據庫做完全備份
Mysqldump -uroot -p密碼 --single-transaction --flush-logs -B shiyan > shiyan_data_$(date +%Y%m%d%H%M%S).sql
–single-transaction 是熱備份 只有在存儲引擎為 innodb 時有效
–flush-logs 是生成新的binlog 文件 刷新二級制日誌.
4,
在實驗庫 的kdata1表中插入數據 insert into shiyan.kdata1 values(1,’zhangsan’);
查看數據是否插入成功 select * from shiyan.kdata1;
可以看到數據成功插入了.
Mysqlbinlog -vv /data/mysql/log/mysql_bin.000001
可以看到剛才插入數據的操作已經記錄在日誌文件中了.
5 ,
使用flush logs; 生成一個新的日誌文件
在實驗庫中再創建一個新的表二
Create table kdata2(u_id int,b_name char(20));
插入一條數據
Insert into shiyan.kdata2 values(2,’wangwu’);
查看數據
Set sql_log_bin=0 臨時關閉binlog功能
6, 模擬一個表的數據丟失
Drop table kdata2; 刪除表二
7, 使用binlog 日誌來恢復刪除的表二.
Mysqlbinlog /data/mysql/log/mysql_bin.000002 | mysql -uroot -p密碼 再命令行下
進入到mysql中 use shiyan; 切換到實驗庫
Show tables; 查看當前庫中的表
可以看到表二已經恢復了
查看一下表二的記錄
表二中的數據也找回來了.
8,模擬實驗數據庫丟失了
Drop database shiyan; 刪除實驗數據庫
然後恢復數據庫
1, 先利用 完全備份的文件進行恢復
Mysql -uroot -p密碼 < /root/shiyan_data_20200112131142.sql 數據還原
然後查看實驗庫中的表
Show tables;
發現表一恢復回來了但是沒有表二
這時想要最大程度的恢復數據需要利用binlog文件儘可能的去恢復數據庫丟失前的數據.
Mysqlbinlog /data/mysql/log/mysql_bin.00000.2 | mysql -uroot -p密碼
這時再去查看實驗庫中的表就會看到表二也恢復了
實驗總結:
單獨的使用完全備份 無疑有很大缺點,當數據越來越多時備份的效率也越來越低. 但是我們使用 完全備份加 增量備份 binlog日誌 數據備份的效率不會有太大的影響 而且還原時也可以最大程度還原到數據丟失前的狀態,減少數據丟失.
閱讀更多 微科技分享 的文章