MySQL資料庫的備份還原至最新狀態
模擬資料庫在某次備份後但未達到下次備份時間中,被意外刪除的資料
此處恢復hello資料庫和裡面的students表
使用工具:均為mariadb-server自帶
1 mysqldump
2 mysqlbinlog
前提條件:
二進位制日誌檔案必須開啟
MariaDB [(none)]> show master logs;
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 7674 | |mysql-bin.000002 | 264 | | mysql-bin.000003 | 15864234 | | mysql-bin.000004 | 30379 | | mysql-bin.000005 | 1038814 | | mysql-bin.000006 | 264 | | mysql-bin.000007 | 245 | +------------------+-----------+
但因為我伺服器上有過二進位制日誌檔案,清除掉這些二進位制日誌
1 MariaDB [hello]> reset master;
MariaDB [hello]> show master logs;+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 245 | +------------------+-----------+
現在就是個乾淨的日誌檔案
1 cat /etc/my.cnf
2 [mysqld] 3 log_bin=/data/logbin/mysql-bin
這裡指定了二進位制日誌檔案的位置,實際生產中,建議二進位制日誌檔案放在其他盤上,實在沒有,最好也在其他分割槽上
sql_log_bin=ON|OFF:是否記錄二進位制日誌,預設ON log_bin=/PATH/BIN_LOG_FILE:指定檔案位置;預設OFF,表示不啟用二進位制日誌功能,上述兩項都開啟才可
註釋:MariaDB [hello]>這個表示在資料庫中執行的,沒有這個就表示在shell命令中執行的
一、開始全域性備份重定向到 /data/下,備份檔案後的檔名為all.sql
mysqldump -A --master-data=2 > /data/all.sql
#註釋:此處-A表示全域性備份,--master-data=後面有兩個選項,分別是1和2,1可以用來配合主從複製,此處我沒有配置主從伺服器就選擇2就可以
1和2區別1是命令,而2只是個註釋
1:
2:
mysql -e 'show master logs' +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 245 | +------------------+-----------+
#註釋:此處為了看的清除,我清除了之前的二進位制日誌檔案,現在的位置是245(初始的二進位制日誌檔案就是245)
二、切換到hello表,查看錶中的資料,以做後續參考
MariaDB [mysql]> use hello MariaDB [hello]> select * from students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | | 26 | a | 20 | F | NULL | NULL | | 27 | b | 20 | F | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+
三、對資料進行修改
MariaDB [hello]> insert students (name,age)values('測試1',100); MariaDB [hello]> insert students (name,age)values('測試2',101); MariaDB [hello]> insert students (name,age)values('測試3',102);
MariaDB [hello]> update students set classid=111 where stuid=27
備份後修改前:
修改後:
四、開始模擬資料庫被異常刪除了(實驗環境這樣,實際生產中千萬不要用這種命令)
rm -rf /var/lib/mysql/*
五、先禁止使用者通過網路訪問,只能使用本地的套接字來連線
vim /etc/my.cnf skip-networking
六、開始重啟服務
systemctl restart mariadb
註釋:重新啟動資料庫,會生成嶄新的資料庫檔案,但裡面是沒有資料的
七、臨時關閉二進位制日誌檔案
MariaDB [(none)]> set sql_log_bin=off;
註釋:還原資料的生成二進位制日誌檔案沒有什麼用,其他使用者此時也不能訪問,此處暫時不用記錄二進位制日誌檔案
八、檢視之前的二進位制日誌檔案更新到哪裡了
MariaDB [(none)]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 1175 | | mysql-bin.000002 | 30379 | | mysql-bin.000003 | 1038814 | | mysql-bin.000004 | 245 | +------------------+-----------+
註釋:此處1,2,3是上次備份之後生成的,需要匯出的,而這個4是剛剛啟動時生成的(每次重啟服務之後會重新生成二進位制日誌)沒有用,可以不用匯出
九、其他視窗開啟,匯出二進位制日誌檔案
mysqlbinlog mysql-bin.000001 > /data/inc.sql
mysqlbinlog mysql-bin.000002 >> /data/inc.sql mysqlbinlog mysql-bin.000003 >> /data/inc.sql
註釋:此處特地分開寫,後面兩個是追加,mysqlbinlog是匯出二進位制日誌檔案的命令
十、回到之前的視窗
把之前備份的檔案匯入進資料庫,還有之前生成的二進位制日誌檔案,也匯入進資料庫
MariaDB [test]> source /data/all.sql;
MariaDB [test]> source /data/inc.sql
十一、此時檢視上次備份後,新增和修改的資料是否恢復成功了。
MariaDB [hello]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hello | | mysql | | performance_schema | | test | +--------------------+
註釋:此時hello資料庫已經恢復成功了
MariaDB [hello]> show tables; +-----------------+ | Tables_in_hello | +-----------------+ | classes | | coc | | courses | | scores | | students | | teachers | | testlog | | toc | +-----------------+
註釋:此時可以檢視到之前的students表恢復成功了
註釋:通過select * from students;可以檢視到之前修改過的資料庫檔案都恢復成功了。
至此恢復完成