mysql數據備份及恢復

備份工具 mysqldump

mysqldump是mysql和mariadb上最好的備份工具之一,免費開源。
mysqldump 首先查詢每一個數據庫和每一個表的結構與數據,而後把查出的全部內容導出到文本文件中。它建立的默認的文本文件被稱爲dump文件,裏面包含重建數據庫和數據必需的SQL語句。mysql

備份全部數據庫

mysqldump --user=admin_backup \
          --password=123 --lock-all-tables
          --all-databases > /root/all-dbs.sql

--user=admin_back
讓mysqldump以admin_back用戶與MYSQL服務器交互,應該儘可能不用root賬號來備份,由於若是是愛腳本執行的時候須要指定用戶名和密碼,並且都是明文寫在腳本中,這樣容易暴露,所以建立一個專有賬戶只須要讀表和鎖表權限更安全。
--password=123
指明備份賬號的密碼,交互模式下可使用--password 後面在彈出須要輸入密碼的時候再輸入密碼。
--lock-all-tables
在作備份前,先讓mysql鎖住全部表,備份完成才解鎖,這會有個問題,對於比較繁忙的數據庫來講,長時間鎖表會有很大影響。應儘可能分表分庫備份。
--all-databases
導出全部數據庫。sql

備份指定的數據庫

mysqldump --user=admin_back --password --lock-tables \
          --verbose --databases test > /root/test.sql

--verbose
顯示備份詳細過程
--databases
後面接數據庫的名稱,指定備份哪一個數據庫,若是要備份多個數據庫,後面寫上多個數據庫的名稱,並用空格隔開。數據庫

備份指定表

mysqldump --user=admin_back --password --lock-tables \
          --verbose --databases test --tables user > /root/test-user.sql

--tables
後面接表名,指定要備份的表安全

建立備份腳本

若是要想自動化備份能夠編寫腳本列入crontab。如:bash

#!/bin/bash
# backup mysql use mydqldump tool,and add to crontab
my_user='admin_back'
my_pwd='123'
db1='test1'
db2='test2'
date_today=$(date +%Y-%m-%d-%H:%M:%S)
backup_dir='/data/backup'
dump_file=$db1-$db2-$date-today'.sql'
/usr/bin/mysqldump --user=$my_user --password=$my_pwd --lock-tables --databases $db1 $db2 > $backup_dir$dump_file

加入crontab任務計劃服務器

crontab -e -u root
* 1 * * * /root/back_mysql.sh

恢復數據庫

mysql --user=admin_backup --password < /root/test.sql

用二進制日誌來恢復

使用二進制日誌能夠作到按時間節點來恢復數據。二進制日誌會記錄全部執行過的,修改數據的SQL語句。session

  • 開啓二進制日誌
    在my.cnf文件[mysqld]部分加入如下語句
[mysqld]
log-bin
binlog-ignore-db=mysql
重啓mysql服務器,查看狀態
MariaDB [(none)]> show master status;
+----------------------+----------+--------------+------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql-bin-200.000002 |     2447 | m_s          |                  |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
查看二進制日誌保存位置
MariaDB [(none)]> show variables where variable_name like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin-200.000001
/var/lib/mysql/mysql-bin-200.000002
/var/lib/mysql/mysql-bin-200.000003
/var/lib/mysql/mysql-bin-200.index
  • 將二進制日誌導出
# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 >/root/m_s.txt
# ll /root/m_s.txt 
-rw-r--r--. 1 root root 920 Mar 17 13:55 /root/m_s.txt
  • 查看二進制日誌內容
# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003
# at 922
#180317 14:58:31 server id 200  end_log_pos 989     Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1521269911/*!*/;
BEGIN
/*!*/;
# at 989
#180317 14:58:31 server id 200  end_log_pos 1104    Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1521269911/*!*/;
insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
/*!*/;
# at 1104
#180317 14:58:31 server id 200  end_log_pos 1131    Xid = 159
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

其中#開頭表示註釋
BEGIN和COMMIT中間表示事務
at 後面跟的是pos位置信息
at下面一行表示 執行時間,結束日誌位置號工具

使用二進制恢復實例

  • 查看數據庫及表中數據
MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | wangshib  |
|  2 | guohuihui |
|  3 | 3aaa      |
|  4 | 4bb       |
+----+-----------+
4 rows in set (0.00 sec)
  • 先備份數據庫
# mysqldump --database m_s --user=root --password --tables haha --flush-logs > /root/mysql/m_s-haha.sql
Enter password: 
# ll /root/mysql/m_s-haha.sql 
-rw-r--r--. 1 root root 1917 Mar 17 15:29 /root/mysql/m_s-haha.sql

--flush-logs 表示備份時刷新二進制日誌ui

  • 刪除表中的行

咱們手動把 haha 表中的id爲3和4的數據刪除日誌

MariaDB [m_s]> delete from haha where id in (3,4);
Query OK, 1 row affected (0.00 sec)

MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | wangshib  |
|  2 | guohuihui |
+----+-----------+
3 rows in set (0.00 sec)
  • 從二進制日誌中抽取須要恢復的行

先導出二進制日誌

先查看一下二進制日誌
MariaDB [m_s]> show master logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| mysql-bin-200.000001 |      2664 |
| mysql-bin-200.000002 |      2466 |
| mysql-bin-200.000003 |      1178 |
| mysql-bin-200.000004 |       428 |
+----------------------+-----------+
4 rows in set (0.00 sec)
[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003 |grep insert
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
insert into haha (id,name) values('7','aaa')
insert into m_s.haha values(1,"wangshib"),(2,"guohuihui")
insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000004 |grep insert
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
咱們看到在mysql-bin-200.000003這個日誌中記錄了 插入語句(id,3,4),那就把這個二進制日誌先導出成爲文本文件再抽取出咱們須要恢復語句。

# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 > /root/mysql/m_s-haha.txt
[root@master ~]# vi /root/mysql/m_s-haha.txt 
...
# at 922
 61 #180317 14:58:31 server id 200  end_log_pos 989     Query   thread_id=2 exec_time=0 error_code=0
 62 SET TIMESTAMP=1521269911/*!*/;
 63 BEGIN
 64 /*!*/;
 65 # at 989
 66 #180317 14:58:31 server id 200  end_log_pos 1104    Query   thread_id=2 exec_time=0 error_code=0
 67 SET TIMESTAMP=1521269911/*!*/;
 68 insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
 69 /*!*/;
 70 # at 1104
 71 #180317 14:58:31 server id 200  end_log_pos 1131    Xid = 159
...

這裏執行insert id=3的語句開始pos位置爲 989 結束於1104

  • 恢復數據
# mysqlbinlog --database=m_s --start-position="989" --stop-position="1104" /var/lib/mysql/mysql-bin-200.000003 | mysql --user=root --password 
Enter password: 
MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | wangshib  |
|  2 | guohuihui |
|  3 | 3aaa      |
|  4 | 4bb       |
+----+-----------+
4 rows in set (0.00 sec)

這裏看到數據已經恢復成功。

相關文章
相關標籤/搜索