在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

mysql定時備份任務

馬哥Linux運維 ? 來源:博客園Johnson木木 ? 2024-10-31 10:07 ? 次閱讀

簡介#

在生產環境上,為了避免數據的丟失,通常情況下都會定時的對數據庫進行備份。而Linuxcrontab指令則可以幫助我們實現對數據庫定時進行備份。首先我們來簡單了解crontab指令,如果你會了請跳到下一個內容mysql備份。
本文章的mysql數據庫是安裝在docker容器當中,以此為例進行講解。沒有安裝到docker容器當中也可以參照參照。

contab定時任務#

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


	
Copy
0 5 * * 1 [command]

前面的5個數字分別代表分、時、日、月、周,后面的command為你的執行命令。 假如你需要在每天晚上8點整執行定時任務,那么可以這么寫


	
Copy
0 8 * * * [command]

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

mysql備份#

快速上手#

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


	
Copy
mkdir -p /var/backups/mysql

然后先嘗試執行數據庫備份命令


	
Copy
docker exec mysql_container mysqldump --single-transaction -uroot -proot_password database_name > /var/backups/mysql/test.sql

如果你看到了/var/backups/mysql/test.sql文件,那么應該就沒啥問題了(最好還是看看文件大小,文件太小可能說明會有問題)。 mysql_container為你的數據庫容器名 --single-transaction不會鎖表,也確保數據的一致性 mysqldump是mysql數據庫導出數據的指令 -u填寫mysql的root賬號 -p填寫mysql的root密碼 database_name需要備份的數據庫名

最后執行命令crontab -e,把mysql的備份命令寫到定時任務中。


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

/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文件,內容如下


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

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


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

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


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

那么這樣就比較規范了。

mysql備份優化#

因為sql文件比較大,所以一般情況下都會對sql文件進行壓縮,不然的話磁盤占用就太大了。 假設你做了上面這一步crontab優化,我們可以把mysqldump.sh腳本改成下面這樣:


	
Copy
export mysqldump_date=$(date +%Y%m%d_%H%M%S) && docker exec mysql_container mysqldump --single-transaction -uroot -pmypassword database_name> /var/backups/mysql/$mysqldump_date.sql && gzip /var/backups/mysql/$mysqldump_date.sql find /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 {} ;。總的意思就是:mysql的備份文件只保留15天之內的。15天之前的都刪除掉。

數據恢復#

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


	
Copy
>mysql create database database_name;

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


	
Copy
docker exec -i mysql_container mysql --single-transaction -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文件:


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

查看當前正在寫入的binlog


	
Copy
mysql> show master statusG;

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


	
Copy
mysql> flush logs

查看binlog日志


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

小知識點:初始化mysql容器時,添加參數--binlog-rows-query-log-events=ON?;蛘叩饺萜鳟斨行薷?code style="margin-right:3px;margin-left:3px;line-height:1;vertical-align:middle;padding:.2em .3em;font-family:consolas;font-size:14px;background:rgb(251,251,251);border-width:1px;border-style:solid;border-color:rgb(238,238,238);">/etc/mysql/my.cnf文件,添加參數binlog_rows_query_log_events=ON,然后重啟mysql容器。這樣可以把原始的SQL添加到binlog文件當中。

恢復數據#

拿回上面例子的這段話。

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

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


	
Copy
cd /var/lib/mysql ls -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命令時間前的數據。

恢復命令格式:


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

mysqlbinlog常用參數:

--start-datetime 開始時間,格式 2020-06-19 1800 --stop-datetime 結束時間,格式同上 --start-positon 開始位置,(需要查看binlog文件) --stop-position 結束位置,同上 ...

恢復備份數據和binlog數據前建議先登錄mysql后執行flush logs生成新的binlog日志,這樣可以專注需要恢復數據的binlog文件。 首先我們需要查看binlog日志,在哪個位置進行了drop database操作:


	
Copy
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 2000- 660 的位置。為什么是660?因為drop database的上一個事務的提交是660的位置,命令如下:


	
Copy
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前啦!開不開心,激不激動!

鏈接:https://www.cnblogs.com/Johnson-lin/p/13178028.html


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11399

    瀏覽量

    212035
  • 指令
    +關注

    關注

    1

    文章

    614

    瀏覽量

    36082
  • 容器
    +關注

    關注

    0

    文章

    503

    瀏覽量

    22297
  • 日志
    +關注

    關注

    0

    文章

    140

    瀏覽量

    10779

原文標題:binlog日志#

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MySQL零基礎入門教程!

    和DCL第6節 SQL語句課堂實踐精確授權優先第7節 復習MySQL基礎第8節 破解MariaDB 5.5 root密碼第9節 MySQL備份的分類和備份的兩大要素第10節 Innod
    發表于 06-17 14:54

    0基礎學Mysql:mysql入門視頻教程!

    DDL語句第5節 SQL語句之DML語句和DCL第6節 SQL語句課堂實踐精確授權優先第7節 復習MySQL基礎第8節 破解MariaDB 5.5 root密碼第9節 MySQL備份的分類和
    發表于 07-08 10:51

    基于linux的mysql數據庫每天自動備份定時備份的實現

    linux下如何實現mysql數據庫每天自動備份定時備份
    發表于 05-10 17:10

    如何用labview對數據庫進行備份/如何在MySql中使用命令的方式進行數據庫備份(非cmd窗口非手動保存)

    ,不能登錄到 MySQL 服務中執行。2:手動點擊鼠標保存。想在不想用打開cmd窗口的方式去備份有沒有一種語句,可以在MySQL 服務中執行,輸入語句,進行備份
    發表于 07-15 16:48

    MySQL基礎架構自動化測試分析

    MySQL對于GitHub的重要性不言而喻,本文作者從MySQL備份、自動測試能否成功從備份恢復數據、模擬各種 master 可能掛掉的情況、自動測試 failover 是否正常、自
    發表于 09-28 16:47 ?0次下載
    <b class='flag-5'>MySQL</b>基礎架構自動化測試分析

    Linux教程之linux下如何備份還原mysql數據庫

    本文介紹了linux下如何備份與恢復mysql數據庫。數據庫備份是非常重要的。如果定期做好備份,這樣就可以在發生系統崩潰時恢復數據到最后一次正常的狀態,把損失減小到最少。
    發表于 10-19 17:18 ?4次下載

    如何完成Mysql主從復制的在線配置

    Percona XtraBackup(簡稱PXB)是 Percona 公司開發的一個用于 MySQL 數據庫物理熱備的備份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部開源,可
    的頭像 發表于 07-29 18:27 ?2225次閱讀
    如何完成<b class='flag-5'>Mysql</b>主從復制的在線配置

    PHP的Mysql數據庫備份腳本詳細資料免費下載

    本文檔的主要內容詳細介紹的是PHP的Mysql數據庫備份腳本詳細資料免費下載。
    發表于 06-19 17:15 ?5次下載

    PHP的Mysql數據庫備份腳本的程序免費下載

    本文檔的主要內容詳細介紹的是PHP的Mysql數據庫備份腳本的程序免費下載。
    發表于 06-28 15:37 ?2次下載

    為什么MySQL備份很重要?MySQL備份類型有哪些?

    隨著企業和應用程序越來越依賴 MySQL 數據庫來管理其關鍵數據,確保數據可靠性和可用性變得至關重要。在這個數字信息時代,強大的備份和恢復策略是應用程序穩定性的支柱。 本文中,我們將回顧所有常用
    的頭像 發表于 11-14 10:20 ?828次閱讀

    mysql數據庫備份與還原

    MySQL是一種常見的關系型數據庫管理系統,用于存儲和管理數據。備份和還原數據庫是非常重要的操作,可以保護數據免受丟失或損壞的影響。本文將詳細介紹MySQL數據庫的備份和還原過程,包括
    的頭像 發表于 11-23 14:32 ?1381次閱讀

    mysql備份還原哪些方法

    MySQL是一個開源的關系型數據庫管理系統,備份和還原是保證數據安全性和可恢復性的重要措施。本文將詳細介紹MySQL備份和還原的方法,包括物理備份
    的頭像 發表于 11-23 14:35 ?1119次閱讀

    mysql中表分區的備份與恢復

    MySQL的表分區是一種將大型表分成更小段的技術,這樣可以提高查詢效率、降低維護成本和減少數據備份恢復時間。在進行表分區的過程中,我們也需要了解如何備份和恢復這些分區,以確保數據的安全性。 一、表
    的頭像 發表于 11-23 14:39 ?1533次閱讀

    Linux計劃任務介紹

    定時備份數據。比如:11點開啟網站搶購接口,12點關閉網站搶購接口。 3.計劃任務主要分為以下兩種使用情況: 1.系統級別的定時任務: 臨時文件清理、系統信息采集、日志文件切割?2.
    的頭像 發表于 11-24 15:49 ?589次閱讀

    windows服務器備份mysql腳本

    osimport reimport datetimeimport subprocess## 需要備份數據庫的登錄信息mysql_host = { 'test': '10.10.3.207'}db_user
    的頭像 發表于 01-02 09:14 ?254次閱讀
    主站蜘蛛池模板: 色窝网 | 四虎国产精品免费入口 | 福利一区二区在线观看 | 青草网址 | 五月婷婷丁香六月 | 国产伦精品一区二区三区在线观看 | 三级在线免费观看 | 久久六月丁香婷婷婷 | 在线播放ww | 国产色视频在线 | 亚洲精品久久久久午夜 | 四虎永久在线精品国产免费 | 男人的视频网站 | 久青草国产手机视频免费观看 | 一级毛片免费全部播放完整 | 亚洲a视频 | 最新在线视频 | 久久综合亚洲 | 免费看久久 | 老司机深夜影院入口aaaa | 男人视频网 | 免费一级毛片视频 | 亚洲丝袜一区二区 | 久久夜色精品国产亚洲 | 亚洲欧美成人在线 | 日韩高清在线日韩大片观看网址 | 日韩国产片| 特黄视频 | 天天天天做夜夜夜夜 | 国产理论精品 | 伊人91在线 | 视频一区视频二区在线观看 | 亚洲色图20p | 性欧美极品 | 欧美1314www伊人久久香网 | 37pao强力打造免费高速高清 | 九九re热| 二级黄绝大片中国免费视频0 | 国产午夜在线观看视频 | 久久精品久噜噜噜久久 | 天天色综合6|