1.前言
這周公司交給我一個任務,負責項目Mysql數據庫的備份,因為項目上線后數據是一個大問題,出了什么問題數據才是最大的問題,備份這時候就顯得尤為重要,
公司項目的思路是:在項目系統設置內可以勾選完整備份和增量備份,選擇指定的時間內進行備份,也可以選擇手動備份
我的思路:把mysql 需要的備份命令寫到bat批處理文件里面,按照Java后端定時器去調用方法,方法調用bat批處理文件!
2.完整備份
完整備份相對於增量備份要簡單的多,因為生成的是SQL文件,直接導入即可,主要的采坑還是增量備份
1.項目人數日漸龐大,數據越來越多,如果只是單純的全局備份,又是占用磁盤又是耗費時間
2.可以考慮每周備份一次完整備份,每天備份一次增量
如何備份多個表?
答:mysqldump -u用戶 -p 數據庫 表1 表2 …… 表N > 備份文件路徑
如何備份1個數據庫?
答:mysqldump -u用戶 -p -B 數據庫 > 備份文件路徑
如何備份多個數據庫?
答:mysqldump -u用戶 -p -B 庫1 庫2 …… 庫N >備份文件路徑
如何備份所有數據?
答:mysqldump -u用戶 -p -A >備份文件路徑
備份好之后的SQL文件
3.SQL 文件的導入
source sql文件路徑
4.采坑之路 增量備份
4.1 版本問題(坑)
我之前使用的mysql是phpStyle自帶的,它的版本在5.56的樣子,自帶的命令里面沒有可以生成日志文件的mysqlbinlog命令
錯誤嘗試:去網上下載了一個mysqlbinlog 然而沒考慮版本問題,雖然可以生成二進制文件,但是導不進去!!!失敗
4.2 安裝了一個mysql 8.0版本后找不到my.ini配置文件!
嘗試:百度后發現,mysql 8.0那個版本已經開啟了日志的處理,我們不需要修改mysql 配置文件
參考:https://blog.csdn.net/zone_/article/details/81321431
4.3 導出的二進制日志文件mysql不識別 說不是一個二進制文件(你TM在逗我????)
1.首先找出最新的日志文件名稱
2.使用命令導出!(我這里的二進制目錄已經改變過,沒有改變過的日志文件存放在:C:\ProgramData\MySQL\MySQL Server 8.0\Data)(隱藏目錄!!!!!!)
嘗試:使用命令導出:mysqlbinlog -uroot -proot --read-from-remote-server binlog.000003 > e:\backup\binlog.000003
1.導出后的文件居然打開不亂碼!!驚奇
2.嘗試導入,別想了 導不進去
嘗試把二進制文件弄成SQL文件,試着導入!
1.嘗試導出 mysqlbinlog --no-defaults --base64-output=decode-rows -v binlog.000004 --result-file=e:\backup\123.sql
2.嘗試導入:source e:/backup/123.sql
失敗!!!!心態炸裂
5.最終奧義!
1.思路:使用bat批處理把那個二進制文件復制出來,然后導入呢?
2.嘗試 發現日志文件存在的地方是一個隱藏目錄,cmd窗口根本就中不到,於是乎!!!!
修改mysql配置文件,讓它把生成的二進制文件存到別的地方 我好復制
參考:https://blog.csdn.net/The_Beetles/article/details/89553653
下面貢獻兩個腳本bat批處理文件,方便使用
::--------------全量備份mysql數據庫--------------- ::服務器數據庫ip 用戶名 密碼 申明需要備份的數據庫 set suser=root set suserpwd=root set backdatabase=test ::當前系統日期 20160309 set now=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% ::備份文件夾 set backup=backup if not exist %backup% md %backup% ::以日期命名的文件夾 set nowfile=%backup%\%now% if not exist %nowfile% md %nowfile% ::開始備份 mysqldump -u%suser% -p%suserpwd% --single-transaction --skip-triggers --skip-lock-tables --master-data=2 --force -B %backdatabase%>%nowfile%\%backdatabase%.sql exit
@echo off ::服務器數據庫ip 用戶名 密碼 set suser=root set suserpwd=root
::mysql 二進制日志文件存放的位置 set filePath= E:\mysql\Data ::當前系統日期 20160309 set now=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% ::備份文件夾 set backup=backup if not exist %backup% md %backup% ::以日期命名的文件夾 set nowfile=%backup%\%now%-Increase if not exist %nowfile% md %nowfile% ::前一次日志文件名 set binlog=%nowfile%\binlog.txt mysql -u%suser% -p%suserpwd% -e "show master status"|findstr -B binlog.>%binlog% ::處理日志文件名 只取binlog.001365 復制到目標文件夾 FOR /F "delims= " %%i in (%binlog%) do copy %filePath%\%%i %nowfile% ::刷新日志產生新的日志 mysqladmin -u%suser% -p%suserpwd% flush-logs exit
長路漫漫!采坑為伴