mysql备份与还原

mysql备份与还原
一、备份常用操作基本命令
1、备份命令mysqldump格式
格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql
example
mysqldump --opt --single-transaction=TRUE --user=root --password=123456 --host=127.0.0.1 --protocol=tcp --port=3306 --single-transaction=TRUE --routines --events "testdba" > c:\mysql_backup\backup_%Ymd%.sql
2、备份MySQL数据库为带删除表的格式
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
mysqldump --add-drop-table -uusername -ppassword -database databasename > backupfile.sql
3、直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword -database databasename | gzip > backupfile.sql.gz
4、备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
5、同时备份多个MySQL数据库
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql仅仅备6、仅备份份数据库结构
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
7、备份服务器上所有数据库
mysqldump –all-databases > allbackupfile.sql
8、还原MySQL数据库的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
9、还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
10、将数据库转移到新服务器
mysqldump -uusername -ppassword databasename | mysql –host=... -C databasename
11、--master-data 和--single-transaction
在mysqldump中使用--master-data=2,会记录binlog文件和position的信息 。--single-transaction会将隔离级别设置成repeatable-commited
12、导入数据库
常用source命令,用use进入到某个数据库,mysql>source d:\test.sql,后面的参数为脚本文件。
13、查看binlog日志
查看binlog日志可用用命令 mysqlbinlog binlog日志名称|more
14、general_log
General_log记录数据库的任何操作,查看general_log 的状态和位置可以用命令show variables like "general_log%" ,开启general_log可以用命令set global general_log=on
二、增量备份
小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了mysql的binlog志。
1、首先做一次完整备份:
mysqldump -h10.6.208.183 -utest2 -p123 -P3310 --single-transaction --master-data=2 test>test.sql这时候就会得到一个全备文件test.sql
在sql文件中我们会看到:
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000002', MASTER_LOG_POS=107;是指备份后所有的更改将会保存到bin-log.000002二进制文件中。
2、在test库的t_student表中增加两条记录,然后执行flush logs命令。这时将会产生一个新的二进制日志文件bin-log.000003,bin-log.000002则保存了全备过后的所有更改,既增加记录的操作也保存在了bin-log.00002中。
3、再在test库中的a表中增加两条记录,然后误删除t_student表和a表。a中增加记录的操作和删除表a和t_student的操作都记录在bin-log.000003中。

三、恢复
1、首先导入全备数据
mysql -h10.6.208.183 -utest2 -p123 -P3310 < test.sql,也可以直接在mysql命令行下面用source导入
example登入mysql客户端
use databaseName;
mysql> source C:\mysql_backup\backup_20201026172232.sql;
2、恢复bin-log.000002
mysqlbinlog bin-log.000002 |mysql -h10.6.208.183 -utest2 -p123 -P3310
example
进入C:\Program Files\MySQL\MySQL Server 8.0\bin下进行编辑
mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 8.0\Data\F1335291-B2B-bin.000052">C:\Users\F1335291\Desktop\a\a.txt;
登入mysql客户端
source C:\Users\F1335291\Desktop\a\a.txt;
3、恢复部分 bin-log.000003
在general_log中找到误删除的时间点,然后更加对应的时间点到bin-log.000003中找到相应的position点,需要恢复到误删除的前面一个position点。
可以用如下参数来控制binlog的区间
--start-position 开始点 --stop-position 结束点
--start-date 开始时间 --stop-date 结束时间
找到恢复点后,既可以开始恢复。
mysqlbinlog mysql-bin.000003 --stop-position=208 |mysql -h10.6.208.183 -utest2 -p123 -P3310

4增量备份知识点
show master logs; #檢視資料庫所有日誌檔案。
show binlog events \g; #檢視當前使用的binlog檔案資訊。
show binlog events in 'mysql-bin.000016'; #檢視指定的binlog檔案資訊
flush logs; #將記憶體中log日誌寫磁碟,儲存在當前binlog檔案中,併產生一個新的binlog日誌檔案。
flush logs; reset master; #刪除所有二進位制日誌,並重新(mysql-bin.000001)開始記錄。
flush tables with read lock; 備份前需要將資料庫加讀鎖,防止資料在備份時寫入。
flush logs; 通過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000001),在生成一個新的binlog(mysql-bin.000002)為增備做準備。
unlock tables; 解除表鎖。

目錄
一、簡介()
1、增量備份
增量備份 是指在一次全備份或上一次增量備份後,以後每次的備份只需備份與前一次相比增加或者被修改的檔案。這就意味著,第一次增量備份的物件是進行全備後所產生的增加和修改的檔案;第二次增量備份的物件是進行第一次增量備份後所產生的增加和修改的檔案,如此類推。這種備份方式最顯著的優點就是:沒有重複的備份資料,因此備份的資料量不大,備份所需的時間很短。但增量備份的資料恢復是比較麻煩的。您必須具有上一次全備份和所有增量備份磁帶(一旦丟失或損壞其中的一個增量,就會造成恢復的失敗),並且它們必須沿著從全備份到依次增量備份的時間順序逐個反推恢復,因此這就極大地延長了恢復時間。
假如我們有一個資料庫,有20G的資料,每天會增加10M的資料,資料庫每天都要全量備份一次,這樣的話伺服器的壓力比較大,因此我們只需要備份增加的這部分資料,這樣減少伺服器的負擔。
2、binlog簡介
binlog日誌由配置檔案的 log-bin 選項負責啟用,MySQL伺服器將在資料根目錄建立兩個新文 件XXX-bin.001和xxx-bin.index,若配置選項沒有給出檔名,Mysql將使用主機名稱命名這兩個檔案,其中.index檔案包含一份全體日誌檔案的清單。
Mysql會把使用者對所有資料庫的內容和結構的修改情況記入XXX-bin.n檔案,而不會記錄 SELECT和沒有實際更新的UPDATE語句。
當MySQL資料庫停止或重啟時,伺服器會把日誌檔案記入下一個日誌檔案,Mysql會在重啟時生成一個新的binlog日誌檔案,檔案序號遞增,此外,如果日誌檔案超過max_binlog_size系統變數配置的上限時,也會生成新的日誌檔案。
二、binlog日誌操作
2.1、開啟binlog日誌
修改 MySQL 的配置檔案my.cnf 如下:
1
2
3 [mysqld]
log-bin = mysql-bin
binlog_format = row
其中:log-bin若不顯示指定儲存目錄,則預設儲存在mysql的data目錄下
binlog_format的幾種格式:(STATEMENT,ROW和MIXED),
STATEMENT:基於SQL語句的複製(statement-based replication, SBR)
ROW:基於行的複製(row-based replication, RBR)
MIXED:混合模式複製(mixed-based replication, MBR)
啟動後會產生mysql-bin.*這樣的檔案,每啟動一次,就會增加一個或者多個。

• 檢視binlog開啟情況

1
2 mysql> show variables like 'log_bin%';

  1. 08.mysql> show variables like 'binlog%';

2.2、檢視binlog日誌內容
這裡我們碰到了mysqlbinlog的一個bug,解決方法有兩個:
• 方法一:使用–no-defaults選項

• 方法二:將my.cnf中[client]選項組中default-character-set=utf8選項臨時遮蔽掉(該選項即時生效,不用重啟資料庫),使用完mysqlbinlog命令時在恢復。因為使用mysqlbinlog工具檢視二進位制日誌時會重新讀取的mysql的配置檔案my.cnf(windows下是my.ini),而不是伺服器已經載入進記憶體的配置檔案。

1
2
3
4
5
6
SET TIMESTAMP=1404573835/!/;
create database test
/!/;
DELIMITER ;
ROLLBACK /* added by mysqlbinlog /;
/
!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
包含以下要素:
Position:位於檔案中的位置,即第一行的(#at 4)和第二行的(log_pos 4),說明該事件記錄從檔案第4位元組開始。
Timestamp:事件發生的時間戳,即第二行的(#070813 14:16:36)
Exec_time:事件的執行花費時間
Error_code:錯誤碼
Type 事件型別:
Master ID:建立二進位制事件的主機伺服器ID
Master Pos:事件在原始二進位制檔案中的位置
Flags:標誌資訊

2.3 一些常用操作
1
2
3
4
5 mysql> show master logs; #檢視資料庫所有日誌檔案。
mysql> show binlog events \g; #檢視當前使用的binlog檔案資訊。
mysql> show binlog events in 'mysql-bin.000016'; #檢視指定的binlog檔案資訊。
mysql> flush logs; #將記憶體中log日誌寫磁碟,儲存在當前binlog檔案中,併產生一個新的binlog日誌檔案。
mysql> flush logs; reset master; #刪除所有二進位制日誌,並重新(mysql-bin.000001)開始記錄。

三、MySQL備份例項(全備 基於 binlog的增備)
示例採用小資料量進行模擬,包含一份全備及兩份增備,主要演示下備份還原過程,工程中可根據資料實際情況進行備份還原策略調整。
3.1 檢視當前資料庫binlog檔案
• 通過mysql客戶端檢視:
1 mysql> show master logs;
• 通過linux命令列直接檢視(mysql資料目錄data)
目前只有一個binlog檔案mysql-bin.000001。

3.2 準備全量資料

1
2
3
4 mysql> create database backup_full;
mysql> create table full (c1 int(10), c2 varchar(20)) engine=innodb;
mysql> insert into full values (1, 'full1'),(2, 'full2'),(3, 'full3'),(4, 'full4'),
(5, 'full5'),(6, 'full6'),(7, 'full7'),(8, 'full8'),(9, 'full9'),(10, 'full10');
3.3 將全量資料進行備份
步驟如下:
a.備份前需要將資料庫加讀鎖,防止資料在備份時寫入。
1 mysql> flush tables with read lock;
b.通過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000001),在生成一個新的binlog(mysql-bin.000002)為增備做準備。
1 mysql> flush logs;
c.進行資料備份。在linux命令列下執行:
1
2 [root]mysqldump -u使用者名稱 -p密碼 -hIP地址 -P埠 資料庫名 > /tmp/backup_full.sql
[root]mysqldump -uroot -pjesse -h127.0.0.1 -P3355 buckup_full > /tmp/backup_full.sql
d.解除表鎖。
1 mysql> unlock tables;
至此全量備份全部結束,將全量資料檔案buckup_full.sql儲存即可。資料庫再有新的資料更新會記錄在新的binlog(mysql-bin.000002)裡面。

3.4 準備第一份增量資料

1
2
3
4 mysql> create database backup_increment;
mysql> use backup_increment;
mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb;
mysql> insert into increment values (11, 'increment1'),(12, 'increment2'),(13, 'increment3'),(14, 'increment4'),(15, 'increment5');

3.5 將第一份增量資料進行備份
步驟如下:
a.備份前需要將資料庫加讀鎖,防止資料在備份時寫入。
1 mysql> flush tables with read lock;
b.通過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000002),在生成一個新的binlog(mysql-bin.000003)為下次增備做準備。
1 mysql> flush logs;
c.將binlog第一個增備檔案mysql-bin.000002直接複製儲存即可。 也可以將二進位制檔案匯出到文字檔案儲存,在linux命令列下執行
1 [root ]mysqlbinlog mysql-bin.000002 > /tmp/increment1.txt
d.解除表鎖。
1 mysql> unlock tables;
至此第一個增量備份全部結束,將增量binlog檔案mysql-bin.000002或者有binlog檔案匯出的文字檔案/tmp/increment1.txt儲存即可。資料庫再有新的資料更新會記錄在新的binlog(mysql-bin.000003)裡面。

3.6 準備第二份增量資料
1
2 mysql> use backup_increment;
mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');

3.7 將第二份增量資料進行備份
步驟如下:
a.備份前需要將資料庫加讀鎖,防止資料在備份時寫入。
1 mysql> flush tables with read lock;
b.通過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000003),在生成一個新的binlog(mysql-bin.000004)為下次增備做準備。
1 mysql> flush logs;
c.將binlog第一個增備檔案mysql-bin.000003直接複製儲存即可。 也可以將二進位制檔案匯出到文字檔案儲存,在linux命令列下執行
1 [root]mysqlbinlog mysql-bin.000003 > /tmp/increment2.txt
d.解除表鎖。
1 mysql> unlock tables;
至此第二個增量備份全部結束,將增量binlog檔案mysql-bin.000003或者有binlog檔案匯出的文字檔案/tmp/increment2.txt儲存即可。資料庫再有新的資料更新會記錄在新的binlog(mysql-bin.000004)裡面。

四、mysql還原例項分析(全備還原 基於binlog的增備還原)
模擬資料庫故障,即刪除全備資料及增備資料庫。
1
2 mysql> drop table backup_full.full;
mysql> drop database backup_increment;
此時資料庫資料被清空。

1
2
3
4
5
6 mysql> show databases;
mysql> select * from backup_full.full;
ERROR 1146 (42S02): Table 'backup_full.full' doesn't exist
mysql> select * from backup_increment.increment;
ERROR 1146 (42S02): Table 'backup_increment.increment' doesn't exist
4.1 還原全備資料
• 方法1:進入資料庫,通過source
1
2
3 mysql> use backup_full;
mysql> source /tmp/backup_full.sql;
mysql> select * from backup_full.full;
全量資料還原成功。
• 方法2:直接還原資料檔案。
1
2
3
4
5 mysql -u使用者名稱 -p密碼 -hIP地址 -P埠 資料庫名 < /tmp/buckup_full.sql
mysql -uroot -pjesse -h127.0.0.1 -P3355 backup_full < /tmp/buckup_full.sql
mysql> select * from backup_full.full;

4.2 還原第一個增備檔案
• 方法一:通過文字檔案還原

mysql> source /tmp/increment1.txt; 

mysql> select * from backup_increment.increment;

• 方法二:通過binlog直接還原
在linux命令列下執行:
1
2 [root]mysqlbinlog binlog檔名 | mysql -u使用者名稱 -p密碼 -hIP地址 -P埠
[root]mysqlbinlog mysql-bin.000002 | mysql -uroot -pjesse -h127.0.0.1 -P3355
檢視資料:
mysql> select * from backup_increment.increment;

第一份增量資料還原成功!
4.3 還原第二個增備檔案(方法同上)
在linux命令列下執行:
1
2 [root]mysqlbinlog binlog檔名 | mysql -u使用者名稱 -p密碼 -hIP地址 -P埠
[root]mysqlbinlog mysql-bin.000003 | mysql -uroot -pjesse -h127.0.0.1 -P3355
檢視資料:
mysql> select * from backup_increment.increment;
至此資料全部還原成功!
全量备份和增量备份 脚本 仅供参考
全量备份脚本(https://www.cnblogs.com/bulijojodibulido/p/11982393.html)

  1. @echo off
  2. rem ******MySQL backup start******
    
  3. forfiles /p "c:\mysql_backup" /m backup_*.sql -d -7 /c "cmd /c del /f @path"
    
  4. set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%"
    
  5. cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
    
  6.  C:
    
  7. mysqldump --opt --single-transaction=TRUE --user=root --password=123456 --host=127.0.0.1 --protocol=tcp --port=3306 --single-transaction=TRUE --routines --events "testdba" > c:\mysql_backup\backup_%Ymd%.sql
    
  8. rem ******MySQL backup end******
    
  9. @echo on

全量备份

  1. @echo "1、填写下载WINRAR的目录"
  2. set PATH=C:\Program Files\WINRAR;%PATH%
  3. @echo "2、填写mysql安装目录"
  4. set MYSQLPATH="D:\Program Files\MySQL\MySQL Server 5.6"
  5. @echo "3、填写备份目录"
  6. set BAKPATH=E:\backup
  7. @echo "4、如果您的mysql是5.6.x以下 填写(其它见博客)"
  8. set USERNAME=root
  9. set PASSWORD=123456
  10. @echo "5、设置my.ini文件位置(mysql高版本)"
  11. set MYINI="D:\ProgramData\MySQL\MySQL Server 5.6\my.ini"
  12. set DB=test
  13. set DT=%date:0,4%%date:5,2%%date:8,2%%time:0,2%%time:3,2%%time:6,2%
  14. set DT=%DT: =0%
  15. IF NOT EXIST "%BAKPATH%\bk-full" MD "%BAKPATH%\bk-full"
  16. IF NOT EXIST "%BAKPATH%\data" MD "%BAKPATH%\data"
  17. pause
  18. @echo "mysql 5.6.x以下,本人是其他版本所以将此行注释"
  19. @rem %MYSQLPATH%\bin\mysqldump -u%USERNAME% -p%PASSWORD% --single-transaction --default-character-set=utf8 --databases %DB% --flush-logs --master-data=2 --delete-master-logs > %BAKPATH%\data\dataset6c_%DT%.sql
  20. %MYSQLPATH%\bin\mysqldump --defaults-file=%MYINI% --single-transaction --default-character-set=utf8 --databases %DB% --flush-logs --master-data=2 --delete-master-logs > %BAKPATH%\data\dataset6c_%DT%.sql
  21. cd %BAKPATH%\data
  22. rar a -ag %BAKPATH%\bk-full\ *.sql
  23. cd %BAKPATH%\bk-inc
  24. rar a -ag ./ logbin.**
  25. del logbin.**
  26. rmdir /s /q %BAKPATH%\data\
  27. @echo %date% %time% full bakup finish today: %today% >> E:\backup\bk.log
  28. Pause
    全量备份
  29. !/bin/bash

  30. 在使用之前,请提前创建以下各个目录

  31. 获取当前时间

  32. date_now=$(date "+%Y%m%d-%H%M%S")
  33. backUpFolder=/home/db/backup/mysql
  34. username="root"
  35. password="123456"
  36. db_name="zone"
  37. 定义备份文件名

  38. fileName="{date_now}.sql"
  39. 定义备份文件目录

  40. backUpFileName="{fileName}"
  41. echo "starting backup mysql {date_now}."
  42. /usr/bin/mysqldump -u{password} --lock-all-tables --flush-logs {backUpFileName}
  43. 进入到备份文件目录

  44. cd ${backUpFolder}
  45. 压缩备份文件

  46. tar zcvf {fileName}
  47. use nodejs to upload backup file other place

  48. NODE_ENV=backUpFileName node /home/tasks/upload.js

  49. date_end=$(date "+%Y%m%d-%H%M%S")
  50. echo "finish backup mysql database {date_end}."

增量备份

  1. set PATH=C:\Program Files\WINRAR;%PATH%
  2. set MYSQLPATH="D:\Program Files\MySQL\MySQL Server 5.6"
  3. set BAKPATH=E:\backup
  4. set USERNAME=root
  5. set PASSWORD=123456
  6. IF NOT EXIST "%BAKPATH%\bk-inc" MD "%BAKPATH%\bk-inc"
  7. %MYSQLPATH%\bin\mysqladmin -u%USERNAME% -p%PASSWORD% flush-logs
  8. xcopy /c /h /y %BAKPATH%\logbin.0* %BAKPATH%\bk-inc
  9. @echo %date% %time% dIncremental bakup finish >> E:\backup\bk.log
  10. Pause

你可能感兴趣的:(mysql备份与还原)