淺析mysql 定時備份任務_Mysql

來源:腳本之家  責任編輯:小易  

研究下mysqldump命令行,然后寫bat文件,最后把bat放到服務的任務計劃里定時執行。先cd到你的mysql安裝目錄的bin文件夾下然后執行mysqldump-u wcnc-p smgp_apps_wcnc>wcnc.sqlmysql導出整個數據庫:mysqldump-u 用戶名-p 數據庫名>導出的文件名www.anxorj.tw防采集請勿采集本網。

簡介

在生產環境上,為了避免數據的丟失,通常情況下都會定時的對數據庫進行備份。而Linux的crontab指令則可以幫助我們實現對數據庫定時進行備份。首先我們來簡單了解crontab指令,如果你會了請跳到下一個內容mysql備份。

在后臺做備份操作,定時調用cmd命令,網上類似的例子很多,能導出指定數據庫的數據到指定位置

本文章的mysql數據庫是安裝在docker容器當中,以此為例進行講解。沒有安裝到docker容器當中也可以參照參照。

第三種:利用WinRAR對MySQL數據庫進行定時備份。對于MySQL的備份,好的方法是直接備份MySQL數據庫的Data目錄。下面提供了一個利用WinRAR來對Data目錄進行定時備份的方法。首先當然要把WinRAR安裝到計算機

contab定時任務

使用腳本每天定期執行數據庫備份操作,對每個使用mysql數據庫的人來說都很有必要,這樣的腳本網上有很多,這里摘抄一個朋友的腳本 dbbackup: 這個腳本每天最多只執行一次,而且只保留最近五天的

使用crontab -e來編寫我們的定時任務。

for循環,mysqldump備份數據庫cdn、cdn_view,而且指定了用戶名、主機、密碼,壓縮為$backup_dir/$time.$db.gz delete the oldest backup 30 days ago find$backup_dir-name\"*.gz\"-mtime+30|xargs rm-rf

0 5 * * 1 [command]

默認一般是在兩個地方 第一個 我的文檔里,有個Navicat的文件夾 另一個 Navicat的安裝目錄下 不同版本不一樣,可以修改.自己去找找吧.好像它的備份文件的格式是psc吧,好久沒用過MySQL了.

前面的5個數字分別代表分、時、日、月、周,后面的 command為你的執行命令。

假如你需要在每天晚上8點整執行定時任務,那么可以這么寫

0 8 * * * [command]

擴展: crontab -l 可以查看自己的定時任務 crontab -r 刪除當前用戶的所有定時任務

mysql備份

快速上手

這里我的mysql數據庫是docker容器。假如你需要在每天晚上8點整執行定時任務,那么可以這么寫。

首先執行命令crontab -e。

0 8 * * * docker exec mysql_container mysqldump -uroot -proot_password database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

mysql_container 為你的數據庫容器名

mysqldump 是mysql數據庫導出數據的指令

-u 填寫root賬號

-p 填寫root密碼

database_name 需要備份的數據庫名

/var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql 備份文件,后面是文件名的格式

如果你沒什么要求,單純的只是想要備份,那么上面那個命令就可以幫你進行定時備份。

小坑: mysql備份的時候我使用了docker exec -it mysqldump ... 這樣的命令去做bash腳本,因為-i參數是有互動的意思,導致在crontab中執行定時任務的時候,沒有輸出數據到sql文件當中。所以使用crontab定時的對docker容器進行備份命令的時候不要添加-i參數。

crontab優化

我不建議直接在crontab -e里面寫要執行的命令,任務多了就把這個文件寫的亂七八招了。

建議把數據庫備份的命令寫成一個bash腳本。在crontab這里調用就好了

如:建立一個/var/backups/mysql/mysqldump.sh文件,內容如下

docker exec mysql_container mysqldump -uroot -pmypassword database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

然后把文件改為當前用戶可執行的:

chmod 711 /var/backups/mysql/mysqldump.sh

執行crontab -e命令修改成如下:

0 20 * * * /var/backups/mysql/mysqldump.sh

那么這樣就比較規范了。

mysql備份優化

因為sql文件比較大,所以一般情況下都會對sql文件進行壓縮,不然的話磁盤占用就太大了。

假設你做了上面這一步 crontab優化,我們可以把mysqldump.sh腳本改成下面這樣:

export mysqldump_date=$(date +%Y%m%d_%H%M%S) && \docker exec mysql_container mysqldump -uroot -pmypassword database_name> /var/backups/mysql/$mysqldump_date.sql && \gzip /var/backups/mysql/$mysqldump_date.sqlfind /var/backups/mysql/ -name "*.sql" -mtime +15 -exec rm -f {} \;

export 在系統中自定義了個變量mysqldump_date,給備份和壓縮命令使用

gzip 為壓縮命令,默認壓縮了之后會把源文件刪除,壓縮成.gz文件

find ... 這行命令的意思為,查詢/var/backups/mysql/目錄下,創建時間15天之前(-mtime +15),文件名后綴為.sql的所有文件 執行刪除命令-exec rm -f {} \;?偟囊馑季褪牵簃ysql的備份文件只保留15天之內的。15天之前的都刪除掉。

數據恢復

若一不小心你執行drop database,穩住,淡定。我們首先要創建數據庫被刪除的數據庫。

>mysql create database database_name;

然后恢復最近備份的數據;謴蛡浞莸拿睿

docker exec -i mysql_container mysql -uroot -proot_password database_name < /var/backups/mysql/20200619_120012.sql

雖然恢復了備份文件的數據,但是備份時間點之后的數據我們卻沒有恢復回來。

如:晚上8點進行定時備份,但是卻在晚上9點drop database,那么晚上8點到晚上9點這一個小時之內的數據卻沒有備份到。這時候就要使用binlog日志了。

binlog日志

binlog 是mysql的一個歸檔日志,記錄的數據修改的邏輯,如:給 ID = 3 的這一行的 money 字段 + 1。

首先登錄mysql后查詢當前有多少個binlog文件:

> mysql show binary logs;+---------------+-----------+-----------+| Log_name | File_size | Encrypted |+---------------+-----------+-----------+| binlog.000001 | 729 | No || binlog.000002 | 1749 | No || binlog.000003 | 1087 | No |+---------------+-----------+-----------+

查看當前正在寫入的binlog

mysql> show master status\G;

生成新的binlog文件,mysql的后續操作都會寫入到新的binlog文件當中,一般在恢復數據都時候都會先執行這個命令。

mysql> flush logs

查看binlog日志

mysql> show binlog events in 'binlog.000003';

小知識點:初始化mysql容器時,添加參數--binlog-rows-query-log-events=ON;蛘叩饺萜鳟斨行薷/etc/mysql/my.cnf文件,添加參數binlog_rows_query_log_events=ON,然后重啟mysql容器。這樣可以把原始的SQL添加到binlog文件當中。

恢復數據

拿回上面例子的這段話。

晚上8點進行定時備份,但是卻在晚上9點drop database,那么晚上8點到晚上9點這一個小時之內的數據卻沒有備份到。。

首先進入到mysql容器后,切換到/var/lib/mysql目錄下,查看binlog文件的創建日期

cd /var/lib/mysqlls -l...-rw-r----- 1 mysql mysql 729 Jun 19 15:54 binlog.000001-rw-r----- 1 mysql mysql 1749 Jun 19 18:45 binlog.000002-rw-r----- 1 mysql mysql 1087 Jun 19 20:58 binlog.000003...

從文件日期可以看出:當天時間為2020-06-21,binlog.000002文件的最后更新時間是 18:45 分,那么晚上8點的備份肯定包含了binlog.000002的數據;

binlog.000003的最后更新日期為 20:58 分,那么我們需要恢復的數據 = 晚上8點的全量備份 + binlog.000003的 20:00 - 執行drop database命令時間前的數據。

恢復命令格式:

mysqlbinlog [options] file | mysql -uroot -proot_password database_name

mysqlbinlog常用參數:

--start-datetime 開始時間,格式 2020-06-19 18:00:00

--stop-datetime 結束時間,格式同上

--start-positon 開始位置,(需要查看binlog文件)

--stop-position 結束位置,同上

...

恢復備份數據和binlog數據前建議先登錄mysql后執行flush logs生成新的binlog日志,這樣可以專注需要恢復數據的binlog文件。

首先我們需要查看binlog日志,在哪個位置進行了drop database操作:

mysql> show binlog events in 'binlog.000003';+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------+| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------+| binlog.000003 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.20, Binlog ver: 4 || binlog.000003 | 125 | Previous_gtids | 1 | 156 | || binlog.000003 | 156 | Anonymous_Gtid | 1 | 235 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' || binlog.000003 | 235 | Query | 1 | 318 | BEGIN || binlog.000003 | 318 | Rows_query | 1 | 479 | # INSERT INTO `product_category` SET `name` = '床上用品' , `create_time` = 1592707634 , `update_time` = 1592707634 , `lock_version` = 0 || binlog.000003 | 479 | Table_map | 1 | 559 | table_id: 139 (hotel_server.product_category) || binlog.000003 | 559 | Write_rows | 1 | 629 | table_id: 139 flags: STMT_END_F || binlog.000003 | 629 | Xid | 1 | 660 | COMMIT /* xid=2021 */ || binlog.000004 | 660 | Anonymous_Gtid | 1 | 739 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' || binlog.000004 | 739 | Query | 1 | 822 | drop database hotel_server /* xid=26 */ |+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------

根據上面的日志,我們可以看到,在End_log_pos= 822 的位置執行了drop database操作,那么使用binlog恢復的范圍就在2020-06-19 20:00:00 - 660 的位置。為什么是660?因為drop database的上一個事務的提交是660的位置,命令如下:

mysqlbinlog --start-datetime=2020-06-19 20:00:00 --stop-position=660 /var/lib/mysql/binlog.000003 | mysql -uroot -proot_password datbase_name

如果你的范圍包括了822的位置,那么就會幫你執行drop database命令了。不信你試試?

執行完上面的命令,你的數據就會恢復到drop database前啦!開不開心,激不激動!

總結

因為mysql定時備份是在生產環境上必須的任務。是很常用的。所以我就迫不及待的寫博客。當然也很感謝我同事的幫助。這篇文章已經寫了三天了,因為我也是在不斷地試錯,不斷的更新文章。避免把錯誤的知識點寫出來。如果幫到你了,關注我一波唄!謝謝。

以上就是淺析mysql 定時備份任務的詳細內容,更多關于mysql 定時備份任務的資料請關注真格學網其它相關文章!

數據庫的自動備份,可以減輕維護者的工作量也便于系統恢復,對于比較重要的數據庫,最好還是設置下自動備份。工具/原料navicat for mysqlmysql 5.5方法/步驟打開navicat客戶端,連上mysql后,雙擊左邊你想要備份的數據庫。點擊“計劃”,再點擊“新建批處理作業”。雙擊上面的可用任務,它就會到下面的列表里去,代表你選擇了這個任務。點擊保存,彈出個命名對話框,給這個任務取個名字,點擊“確定”點擊“設置”計劃任務。彈出的對話框,選擇“計劃”,再點擊“新建”。這里設置為從2014年1月24號起每天早上九點備份該數據庫。如果想提高備份頻率、或者設置備份截止日期,請點擊“高級”。高級選項可以把備份設置的更精細,比如這里設置的是在24小時內每隔2小時就備份一次。加上前面的基本設置,任務計劃就是:從2014年1月24號開始,每天九點,每隔2小時備份一次,每天的備份都持續24小時。最后,輸入電腦密碼就大功告成內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • linux下mysql定時任務備份數據的實現方法
  • mysql定時備份數據庫操作示例
  • linux實現定時備份mysql數據庫并刪除30天前的備份文件
  • linux定時備份mysql數據庫并刪除以前的備份文件(推薦)
  • centos7下 mysql定時自動備份的實現方法
  • shell腳本實現mysql定時備份、刪除、恢復功能
  • mysql case when group by 實例詳解
  • mysql join之完全用法
  • 清空mysql 查詢緩存的可行方法
  • mysql使用集合函數進行查詢操作實例詳解
  • mysql source 命令導入大的sql文件的方法
  • mysql事件的開啟和調用
  • mysql無法啟動1067錯誤的又一種解決方法(機房斷電)
  • windows下實現mysql自動備份的批處理(復制目錄或mysqldump備份)
  • mysql下mysqladmin日常管理命令總結(必看篇)
  • mysql select語句設置默認值的方法
  • 如何定時備份Mysql數據庫
  • mysql數據庫定時備份 怎么實現 您會嗎
  • 如何實現Mysql數據庫每天自動備份定時備份?
  • mysql數據庫定時備份怎么做
  • 如何實現mysql數據庫定時備份
  • 如何讓定時備份mysql數據庫
  • mysql定時備份數據庫的方法及代碼?
  • mysql定時備份數據庫的方法及代碼?
  • 我這個定時備份Mysql哪里出問題了,怎么就是
  • 實例講解如何利用crontab定時備份MySQL
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁linux下mysql定時任務備份數據的實現方法mysql定時備份數據庫操作示例linux實現定時備份mysql數據庫并刪除30天前的備份文件linux定時備份mysql數據庫并刪除以前的備份文件(推薦)centos7下 mysql定時自動備份的實現方法shell腳本實現mysql定時備份、刪除、恢復功能mysql case when group by 實例詳解mysql join之完全用法清空mysql 查詢緩存的可行方法mysql使用集合函數進行查詢操作實例詳解mysql source 命令導入大的sql文件的方法mysql事件的開啟和調用mysql無法啟動1067錯誤的又一種解決方法(機房斷電)windows下實現mysql自動備份的批處理(復制目錄或mysqldump備份)mysql下mysqladmin日常管理命令總結(必看篇)mysql select語句設置默認值的方法mysql安裝圖解 mysql圖文安裝教程can""""t connect to mysql servwindows下mysql5.6版本安裝及配置mysql字符串截取函數substring的mysql創建用戶與授權方法mysql提示:the server quit withmysql——修改root密碼的4種方法mysql日期數據類型、時間類型使用mysql update語句的用法詳解mysql 的case when 語句使用說明ubuntu 18.04安裝mysql 5.7.23mysql執行狀態的查看與分析mysql優化之如何查找sql效率低的原因mysql啟動與數據庫的創建方法[圖文]c3p0連接池+mysql的配置及wait_timeout問mysql中sql模式的特點總結jdbc連接mysql5.7的方法windows 10 與 mysql 5.5 安裝使用及免安mysql的校對規則引起的問題分析解決啟動mongodb錯誤:error while loadi
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载