最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析mysql 定時(shí)備份任務(wù)

 更新時(shí)間:2020年07月06日 15:23:42   作者:返回主頁(yè)Johnson木木  
這篇文章主要介紹了mysql 定時(shí)備份任務(wù)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

簡(jiǎn)介

在生產(chǎn)環(huán)境上,為了避免數(shù)據(jù)的丟失,通常情況下都會(huì)定時(shí)的對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。而Linux的crontab指令則可以幫助我們實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)定時(shí)進(jìn)行備份。首先我們來(lái)簡(jiǎn)單了解crontab指令,如果你會(huì)了請(qǐng)?zhí)较乱粋€(gè)內(nèi)容mysql備份。
本文章的mysql數(shù)據(jù)庫(kù)是安裝在docker容器當(dāng)中,以此為例進(jìn)行講解。沒(méi)有安裝到docker容器當(dāng)中也可以參照參照。

contab定時(shí)任務(wù)

使用crontab -e來(lái)編寫(xiě)我們的定時(shí)任務(wù)。

0 5 * * 1 [command]

前面的5個(gè)數(shù)字分別代表分、時(shí)、日、月、周,后面的 command為你的執(zhí)行命令。
假如你需要在每天晚上8點(diǎn)整執(zhí)行定時(shí)任務(wù),那么可以這么寫(xiě)

0 8 * * * [command]

擴(kuò)展:

  • crontab -l 可以查看自己的定時(shí)任務(wù)
  • crontab -r 刪除當(dāng)前用戶的所有定時(shí)任務(wù)

mysql備份

快速上手

這里我的mysql數(shù)據(jù)庫(kù)是docker容器。假如你需要在每天晚上8點(diǎn)整執(zhí)行定時(shí)任務(wù),那么可以這么寫(xiě)。
首先執(zhí)行命令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 為你的數(shù)據(jù)庫(kù)容器名
mysqldump 是mysql數(shù)據(jù)庫(kù)導(dǎo)出數(shù)據(jù)的指令
-u 填寫(xiě)root賬號(hào)
-p 填寫(xiě)root密碼
database_name 需要備份的數(shù)據(jù)庫(kù)名
/var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql 備份文件,后面是文件名的格式

如果你沒(méi)什么要求,單純的只是想要備份,那么上面那個(gè)命令就可以幫你進(jìn)行定時(shí)備份。

小坑: mysql備份的時(shí)候我使用了docker exec -it mysqldump ... 這樣的命令去做bash腳本,因?yàn)?i參數(shù)是有互動(dòng)的意思,導(dǎo)致在crontab中執(zhí)行定時(shí)任務(wù)的時(shí)候,沒(méi)有輸出數(shù)據(jù)到sql文件當(dāng)中。所以使用crontab定時(shí)的對(duì)docker容器進(jìn)行備份命令的時(shí)候不要添加-i參數(shù)。

crontab優(yōu)化

我不建議直接在crontab -e里面寫(xiě)要執(zhí)行的命令,任務(wù)多了就把這個(gè)文件寫(xiě)的亂七八招了。
建議把數(shù)據(jù)庫(kù)備份的命令寫(xiě)成一個(gè)bash腳本。在crontab這里調(diào)用就好了
如:建立一個(gè)/var/backups/mysql/mysqldump.sh文件,內(nèi)容如下

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

然后把文件改為當(dāng)前用戶可執(zhí)行的:

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

執(zhí)行crontab -e命令修改成如下:

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

那么這樣就比較規(guī)范了。

mysql備份優(yōu)化

因?yàn)閟ql文件比較大,所以一般情況下都會(huì)對(duì)sql文件進(jìn)行壓縮,不然的話磁盤(pán)占用就太大了。
假設(shè)你做了上面這一步 crontab優(yōu)化,我們可以把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.sql
find /var/backups/mysql/ -name "*.sql" -mtime +15 -exec rm -f {} \;

export 在系統(tǒng)中自定義了個(gè)變量mysqldump_date,給備份和壓縮命令使用
gzip 為壓縮命令,默認(rèn)壓縮了之后會(huì)把源文件刪除,壓縮成.gz文件
find ... 這行命令的意思為,查詢/var/backups/mysql/目錄下,創(chuàng)建時(shí)間15天之前(-mtime +15),文件名后綴為.sql的所有文件 執(zhí)行刪除命令-exec rm -f {} \;。總的意思就是:mysql的備份文件只保留15天之內(nèi)的。15天之前的都刪除掉。

數(shù)據(jù)恢復(fù)

若一不小心你執(zhí)行drop database,穩(wěn)住,淡定。我們首先要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)被刪除的數(shù)據(jù)庫(kù)。

>mysql create database database_name;

然后恢復(fù)最近備份的數(shù)據(jù)?;謴?fù)備份的命令:

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

雖然恢復(fù)了備份文件的數(shù)據(jù),但是備份時(shí)間點(diǎn)之后的數(shù)據(jù)我們卻沒(méi)有恢復(fù)回來(lái)。
如:晚上8點(diǎn)進(jìn)行定時(shí)備份,但是卻在晚上9點(diǎn)drop database,那么晚上8點(diǎn)到晚上9點(diǎn)這一個(gè)小時(shí)之內(nèi)的數(shù)據(jù)卻沒(méi)有備份到。這時(shí)候就要使用binlog日志了。

binlog日志

binlog 是mysql的一個(gè)歸檔日志,記錄的數(shù)據(jù)修改的邏輯,如:給 ID = 3 的這一行的 money 字段 + 1。
首先登錄mysql后查詢當(dāng)前有多少個(gè)binlog文件:

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

查看當(dāng)前正在寫(xiě)入的binlog

mysql> show master status\G;

生成新的binlog文件,mysql的后續(xù)操作都會(huì)寫(xiě)入到新的binlog文件當(dāng)中,一般在恢復(fù)數(shù)據(jù)都時(shí)候都會(huì)先執(zhí)行這個(gè)命令。

mysql> flush logs

查看binlog日志

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

小知識(shí)點(diǎn):初始化mysql容器時(shí),添加參數(shù)--binlog-rows-query-log-events=ON?;蛘叩饺萜鳟?dāng)中修改/etc/mysql/my.cnf文件,添加參數(shù)binlog_rows_query_log_events=ON,然后重啟mysql容器。這樣可以把原始的SQL添加到binlog文件當(dāng)中。

恢復(fù)數(shù)據(jù)

拿回上面例子的這段話。

晚上8點(diǎn)進(jìn)行定時(shí)備份,但是卻在晚上9點(diǎn)drop database,那么晚上8點(diǎn)到晚上9點(diǎn)這一個(gè)小時(shí)之內(nèi)的數(shù)據(jù)卻沒(méi)有備份到。。

首先進(jìn)入到mysql容器后,切換到/var/lib/mysql目錄下,查看binlog文件的創(chuàng)建日期

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
...

從文件日期可以看出:當(dāng)天時(shí)間為2020-06-21,binlog.000002文件的最后更新時(shí)間是 18:45 分,那么晚上8點(diǎn)的備份肯定包含了binlog.000002的數(shù)據(jù);
binlog.000003的最后更新日期為 20:58 分,那么我們需要恢復(fù)的數(shù)據(jù) = 晚上8點(diǎn)的全量備份 + binlog.000003的 20:00 - 執(zhí)行drop database命令時(shí)間前的數(shù)據(jù)。

恢復(fù)命令格式:

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

mysqlbinlog常用參數(shù):

--start-datetime 開(kāi)始時(shí)間,格式 2020-06-19 18:00:00
--stop-datetime 結(jié)束時(shí)間,格式同上
--start-positon 開(kāi)始位置,(需要查看binlog文件)
--stop-position 結(jié)束位置,同上
...

恢復(fù)備份數(shù)據(jù)和binlog數(shù)據(jù)前建議先登錄mysql后執(zhí)行flush logs生成新的binlog日志,這樣可以專注需要恢復(fù)數(shù)據(jù)的binlog文件。
首先我們需要查看binlog日志,在哪個(gè)位置進(jìn)行了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 */                                                   |
+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------

根據(jù)上面的日志,我們可以看到,在End_log_pos= 822 的位置執(zhí)行了drop database操作,那么使用binlog恢復(fù)的范圍就在2020-06-19 20:00:00 - 660 的位置。為什么是660?因?yàn)?code>drop database的上一個(gè)事務(wù)的提交是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的位置,那么就會(huì)幫你執(zhí)行drop database命令了。不信你試試?
執(zhí)行完上面的命令,你的數(shù)據(jù)就會(huì)恢復(fù)到drop database前啦!開(kāi)不開(kāi)心,激不激動(dòng)!

總結(jié)

因?yàn)閙ysql定時(shí)備份是在生產(chǎn)環(huán)境上必須的任務(wù)。是很常用的。所以我就迫不及待的寫(xiě)博客。當(dāng)然也很感謝我同事的幫助。這篇文章已經(jīng)寫(xiě)了三天了,因?yàn)槲乙彩窃诓粩嗟卦囧e(cuò),不斷的更新文章。避免把錯(cuò)誤的知識(shí)點(diǎn)寫(xiě)出來(lái)。如果幫到你了,關(guān)注我一波唄!謝謝。

以上就是淺析mysql 定時(shí)備份任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于mysql 定時(shí)備份任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Mysql環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的操作方法

    在Mysql環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的操作方法

    本文介紹了在MySQL環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的基本操作,包括插入數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)、數(shù)據(jù)查詢(基本查詢、連接查詢、聚合函數(shù)查詢、子查詢)等,并舉例說(shuō)明了每種操作的具體用法,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • 你知道m(xù)ysql哪些查詢情況不走索引嗎

    你知道m(xù)ysql哪些查詢情況不走索引嗎

    索引的種類眾所周知,索引類似于字典的目錄,可以提高查詢的效率,下面這篇文章主要給大家介紹了關(guān)于mysql哪些查詢情況不走索引的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • MySQL8.0之CTE(公用表表達(dá)式)的使用

    MySQL8.0之CTE(公用表表達(dá)式)的使用

    本文主要介紹了MySQL8.0之CTE(公用表表達(dá)式)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別詳解

    MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別詳解

    in和exists是兩種常用的條件查詢關(guān)鍵字,兩種常用于子查詢,它們?cè)谀承┣闆r下可以互換使用,但它們的工作方式和效率可能會(huì)有所不同,這篇文章主要給大家介紹了關(guān)于MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Mysql獲取當(dāng)前日期的前幾天日期的方法

    Mysql獲取當(dāng)前日期的前幾天日期的方法

    這篇文章主要介紹了Mysql獲取當(dāng)前日期的前幾天日期的方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • MySql使用skip-name-resolve解決外網(wǎng)鏈接客戶端過(guò)慢問(wèn)題

    MySql使用skip-name-resolve解決外網(wǎng)鏈接客戶端過(guò)慢問(wèn)題

    在騰訊云上面搭建的mysql使用開(kāi)發(fā)的電腦上navicat進(jìn)行訪問(wèn)時(shí)總是特別的慢,原來(lái)是Mysql會(huì)對(duì)請(qǐng)求的地址進(jìn)行域名解析,開(kāi)發(fā)的電腦并沒(méi)有域名,所以會(huì)導(dǎo)致特別的慢,下面通過(guò)本文給大家分享MySql使用skip-name-resolve解決外網(wǎng)鏈接客戶端過(guò)慢問(wèn)題
    2017-07-07
  • MLSQL編譯時(shí)權(quán)限控制示例詳解

    MLSQL編譯時(shí)權(quán)限控制示例詳解

    這篇文章主要給大家介紹了關(guān)于MLSQL編譯時(shí)權(quán)限控制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 修改MySQL字符集的實(shí)現(xiàn)

    修改MySQL字符集的實(shí)現(xiàn)

    為確保MySQL客戶端默認(rèn)使用utf8或utf8mb4字符集,需要修改客戶端啟動(dòng)命令或客戶端配置文件,本文就來(lái)介紹一下修改MySQL字符集的實(shí)現(xiàn),感興趣的可以了解一下
    2024-10-10
  • MySQL之dense_rank()分組排序函數(shù)的使用

    MySQL之dense_rank()分組排序函數(shù)的使用

    DENSE_RANK()是一種窗口函數(shù),用于在數(shù)據(jù)庫(kù)中計(jì)算密集等級(jí),本文就來(lái)介紹一下MySQL之dense_rank()分組排序函數(shù)的使用,感興趣的可以了解一下
    2024-11-11
  • 淺析mysql 語(yǔ)句的調(diào)度優(yōu)先級(jí)及改變

    淺析mysql 語(yǔ)句的調(diào)度優(yōu)先級(jí)及改變

    本篇文章是對(duì)mysql語(yǔ)句的調(diào)度優(yōu)先級(jí)及改變進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評(píng)論

合山市| 新干县| 望都县| 高碑店市| 酒泉市| 西峡县| 大石桥市| 兴城市| 隆德县| 荆州市| 庐江县| 阿瓦提县| 北京市| 景泰县| 丰台区| 利川市| 丰都县| 长春市| 遂川县| 彭山县| 黔西县| 东城区| 邹城市| 益阳市| 勃利县| 肇庆市| 万荣县| 盐亭县| 旅游| 盖州市| 莱阳市| 陆良县| 论坛| 灵石县| 吉林市| 江陵县| 南投市| 修水县| 巴东县| 福清市| 延长县|