關於 PHP, Linux, Open Source 及個人生活記載的網誌。
RSS icon
  • MySQL 備份 shell script

    Posted on March 21st, 2006 Sam Tang 33 comments

    這個是我日常用作備份 MySQL database 的 shell script,因為以前是直接將所有資料庫匯出成一個 sql 檔,當其中一個資料庫有問題時,因為沒問題的資料庫不想有改動,要復原資料很麻煩。今天改了一下,它會用 mysqldump 將所有資料庫匯出成獨立 sql 備份檔,然後用 gzip 壓縮成 .gz 檔案。程式會儲存 5 天的備份,當有新備份時,最舊的備份會自動刪除。

    使用方法:
    修改 db_user, db_passwd 及 db_host 修改成你的 mysql 登入資料,所使用的用戶權限需要與 mysql root 相同。backup_dir 修改成你希望儲存備份的目錄。

    最後只要把程式加入 crontab 排程自動執行即可。

    檔案下載: mysql_backup.sh


     

    33 responses to “MySQL 備份 shell script”

    1. 站大,您的下載網址有誤。

      正確應為:

      http://www.real-blog.com/wp-content/uploads/mysql_backup.sh

    2. 謝謝提醒!

    3. [...] MySQL 備份 shell script (tags: Tech Script Backup MySQL) [...]

    4. 這個 shell script 很實用感謝站大的分享 ~~

    5. 不好意思 請問一下 為什麼
      我將 script 加到 排序時 可以建出 資料夾跟 排序過
      但資料夾都是空的 備不出資料

      但直接執行script 時 可以備出來呀
      謝謝

    6. 試試將 $MYSQLDUMP 及 $MYSQL 改成你主機上面 mysqldump 及 mysql 的絕對路徑。

    7. 可以了 哇 真是高手
      謝謝你的指點 和 無私的分享

    8. 您好:請問要怎麼把備份出來的資料還原呀!?
      謝謝囉!

    9. 再補充一下,我要一次全部把資料還原哦!

      ps.站長,我把它加入收藏囉!

    10. sidney, 如果要全部還原,可以下:
      mysql your_db -uroot -p

    11. sorry, 上一則”

    12. mysql your_db -uroot -p < your_db.sql

    13. 請問這支程式只能在Linux使用嗎?如果是Windows有程式可以像這樣排程備份嗎?謝謝

    14. 請問站長大大,我想延續第六個問題。
      就是您不是使用which mysql來當做mysql絕對路徑嗎,我在console下的確可以抓的到mysql絕對路徑,
      可是為何放到crontab就不行呢?

      感謝站長的熱心

    15. try:

      chmod 755 mysql_backup.sh

    16. 你好,我將你的程式改寫,結果可以使用,很方便~但是有天我重慣FC4,結果同樣的程式執行,他卻說
      『:bad interpreter:沒有此一檔案或目錄』,但是我可以很確定有該檔案,不知道是那邊出問題,希望你能解答~

    17. 這個 shell script 的第一行是:

      #!/bin/sh

      這一行告訴系統 /bin/sh 用作解譯 shell script 內的指令,所以要確定你的系統是否有安裝 sh 這個 shell。

    18. 很棒的shell script,
      對我有很大的幫助^^
      超感謝!

    19. 如何把備份 5 天 改成更多天,謝謝大大!

    20. 將以下一行的 5 改成想要備份的日數:

      test -d "$backup_dir/backup.5/" && $RM -rf "$backup_dir/backup.5"

      例如 7 天便改成:

      test -d "$backup_dir/backup.7/" && $RM -rf "$backup_dir/backup.7"

      以及將以下一行修改,例如 7 天,便這樣:

      for int in 6 5 4 3 2 1 0

      以上改動我沒有測試過,記得測試一下才拿來用喔。

    21. 大大謝謝你的回答,我用你的程式執行,出現以下訊息,不知該如何解決,壓縮有成功 information_schema 資料是空白,再次謝謝!

      mysqldump: Got error: 1044: Access denied for user ‘user’@'localhost’ to database ‘information_schema’ when using LOCK TABLES

    22. resolved

      1.我試過備份30天,it works
      2.using single transaction could handle this problem
      3.thanks

    23. 1.本以為都OK了,結果用crontab 還是不行,原因應該還是一樣,因為我找不到 mysql log 所以也無法確定,

      2.直接RUN不用crontab 到是可以

      3.Access denied for user ‘user’@’localhost’ to database ‘information_schema’ when using LOCK TABLES

    24. 看上面的回應:

      試試將 $MYSQLDUMP 及 $MYSQL 改成你主機上面 mysqldump 及 mysql 的絕對路徑。

      另外,Access denied for use 是 mysql 用戶的權限問題。

    25. 我的問題跟 14 gary 一樣

      請問站長大大,我想延續第六個問題。
      就是您不是使用which mysql來當做mysql絕對路徑嗎,我在console下的確可以抓的到mysql絕對路徑,
      可是為何放到crontab就不行呢?

      感謝站長的熱心

      Comment by Gary — December 3, 2006 @ 10:58 am

    26. 想請教一下,關於10樓和12樓討論到備份的問題,可不可以說的再詳細一點,我還是不太懂要如何做,可否用站長所提供sh備份後的資料來做說明,謝謝

    27. 假如你的資料庫名稱為 my_database,以下是還原方法:

      1. 用 gzip 解壓備份檔,例如 gzip -d my_database.gz
      2. 輸入以下指令:

      mysql my_database -uroot -p < my_database.sql

      然後輸入 mysql 的 root 密碼。

    28. crontab 執行這個 shell script時
      當您用一般使用者打入
      ps -aux
      您的密碼就被看光光了

      請參考官方的密碼安全設定修改
      http://dev.mysql.com/doc/refman/5.1/en/password-security.html

    29. 例如在 /root 底下
      > vi .my.cnf
      加入
      [client]
      host=localhost
      user=root
      password=password

      然後
      > chmod 600 .my.cnf
      (限制只有 root 能存取)

      然後把 mysql_backup.sh 裡面的

      db_user=”root”
      db_passwd=”"
      db_host=”localhost”

      這三行移除

      all_db=”$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse ‘show databases’)”
      改成
      all_db=”$($MYSQL -Bse ‘show databases’)”

      $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > “$backup_dir/backup.0/$time.$db.gz”
      改成
      $MYSQLDUMP $db | $GZIP -9 > “$backup_dir/backup.0/$time.$db.gz”

      這樣就預設就會去讀取 /root/.my.cnf 裡面的host、user、passwd 了

    30. 我把程式抓下來直接在 Linux 上執行, 卻發生 common not found 之類的錯誤訊息, 後來我用筆記本開啟原檔案然後再開 vi 貼上, 就可以執行了 …

    31. 這個shell 救了我一命,在此感謝大德!

    32. 實際測試後有些疑問請指教, 解gz後的檔案並沒有.sql的延申檔名, 請問我是否操作有誤?

      其次,用Uedit 同時開啟該解壓檔比對使用 phpmyadmin 輸出的.sql檔,發現兩個檔案的內容並不一樣,請問這是否正常? 我使用Linux平台CentOS 5.x,感謝指教.

      Jack.

    33. 我原本21樓一樣, 出現mysqldump: Got error: 1044: Access denied for user ‘user’@’localhost’ to database ‘information_schema’ when using LOCK TABLES

      看到下面這篇,就增加–single-transaction 此指令就ok了
      http://forthescience.org/blog/2008/11/08/error-1044-in-mysql-access-denied-when-using-lock-tables/

      更改的指令如下:
      $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db –single-transaction | $GZIP -9 > “$backup_dir/backup.0/$time.$db.gz”

      雖可以備份了,但我又看到這篇,我應該加入他所說的 –flush-logs 及 –master-data嗎???
      http://www.neo.com.tw/archives/1122

    Leave a reply

    *
    To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
    Click to hear an audio file of the anti-spam word