共享主機的mysql備份策略

不使用mysqldump的備份方式,你會用什麼方法?要怎麼備份msql,專家都說,用mysqldump,當然這也是憨人蝸牛會用的方法,一般的主機這麼用,不會有問題,但是共享主機,你拿不到root的權限,要怎麼備份資料咧!是的!沒有想像中的簡單,主機商只會叫你花更多的錢,買更專屬的方案。

一般的備份指令可以寫成script放在cron table中執行。

三段指令下法(先倒,再壓,刪檔)
mysqldump -uXXX -pXXX dbname > path/`date +%d%m%Y_%H%M`_dump.sql
#備份資料庫,輸入帳號密碼、指定的資料庫和目標

tar czvf path/`date +%d%m%Y_%H%M`_dump.tar.gz path/`date +%d%m%Y_%H%M`_dump.sql
#壓縮起來省空間

rm -f path/`date +%d%m%Y_%H%M`_dump.sql
#移除原檔,保留tar.gz的檔案,ftp回來就好

有簡化的作法把dump出來的SQL資料直接餵給tar,我在這裡就不談,基本上只要第一個指令可以執行,資料就可以備份了,但是如果mysqldump沒有辦法執行,不能寫成script或是comman,就無法在crontabl中執行,就不能自動產生備份,也就沒有辦法自動下載。

有沒有解法啊?有啊!工程師說,後台有一個Backup Wizard,備份精靈可以用,每次要備份的時候,進去執行,就會可以下載回來了,要不然就要買更高階的方案。

這篇文章講了10個自動備份mysql的方法

1.自動備份去Amazon S3
為了備份,再多買一個Amazon S3的方案超贊,如果想要亞馬遜雲端,利用S3來做備分,相當有說服力哦!被老闆扒頭不要怪我。
2.用mysqldump方法,配合crontabl,和我們已知道做法一樣。
沒有root的權限~阿就無解啊!
3.利用AutoMySQLBackup來備份
Sourceforge裡面有的下載,應該是不用錢,這是我的菜。實測的結果,阿不就是把指令備份變成問答式備份,換湯不換葯,還是會用到mysqldump來備份。
4.Mysqldump不加上crontabl的備份法
5.用mysqldump備份成xml
mysqldump不能用,所以這系列的解法通通不能用
6.使用PHP備份mysql
酷,這個方法我喜歡,而且簡單名瞭,但是一個表備份成一個sql,還原時則反向,一個sql還原到一個資料表中,老實說,這個方法是呆了一點,細了一點,但是有些資料表根本就是萬年不變,不需要每次都備份,用這個方法,可以建立自己的備份策略,但是如果你有1百多個資料表(或者更多)要備份,你被老闆扒頭時,不要罵我。
7.透過SSH來備份,我的老天啊!這跟ROOT的權限還是有關啊!要有權限才能下mysqldump的指令啊!
8.用Email把備份資料寄出備份(PHP)
這個方法我之前用過,不錯用,資料小的時候可以用,如果資料很大,你的資料超過10MB,不止備份慢,收件慢,就會越來越不方便。
9.在Ubuntu下面備份mysql
條件是如果你有專屬主機的話
10.備份mysql資料庫,並且自動上傳到到FTP上
前題是有要mysqldump的執行權限,不只可以上傳到FTP,還可以用SSH(SFTP)備份以及RSYNC異地備份。
11.Phpmyadmin的備份方法
只能透過手動,不能自動

總的來說,只有6跟8兩個方案可以達成自動備份的目的,我可能會自己來改寫一下php,調整成自己適用的作法。

在改寫方法6之後,我發現根本不能執行,因為方法6的精神在於利用mysql查詢,把資料塞到sql檔中,不論是在Windows平台上的Appserv還是在虛擬主機上,都不能執行,而且還有檔案寫入權限的問題,OMG,非mysqldump的路怎麼那麼難走啊!方法8因為會有email容量上限的問題,所以我也暫不考慮。

永遠的Linux網站上也有講透過php 備份XML格式的資料表,我沒有實測,我找到別的方法拿到類似mysqldump的sql statement 備份檔的方法。在這邊才要跟大家分享一下吧!希望能幫到這些寄存的主人,不要被hosting公司給弄到了,程式碼小調一下就可以用了,但是dump出來的檔案很大,反正空間大,可以用就好。

<?php
// 備份資料庫
$host = “localhost”;
$user = “root”; //資料庫賬號
$password = “”; //資料庫密碼
$dbname = “mysql”; //資料庫名稱

if (!mysql_connect($host, $user, $password)) // 連接mysql資料庫
{
echo ‘資料庫連連失敗,請確認帳密後再試’;
exit;
}
if (!mysql_select_db($dbname)) // 是否存在該資料庫
{
echo ‘資料庫不存在:’ . $dbname . ‘,請核對後再試’;
exit;
}
mysql_query(“set names ‘utf8′”);
$mysql = “set charset utf8;\r\n”;
$q1 = mysql_query(“show tables”);
while ($t = mysql_fetch_array($q1))
{
$table = $t[0];
$q2 = mysql_query(“show create table `$table`”);
$sql = mysql_fetch_array($q2);
$mysql .= $sql[‘Create Table’] . “;\r\n”;
$q3 = mysql_query(“select * from `$table`”);
while ($data = mysql_fetch_assoc($q3))
{
$keys = array_keys($data);
$keys = array_map(‘addslashes’, $keys);
$keys = join(‘`,`’, $keys);
$keys = “`” . $keys . “`”;
$vals = array_values($data);
$vals = array_map(‘addslashes’, $vals);
$vals = join(“‘,'”, $vals);
$vals = “‘” . $vals . “‘”;
$mysql .= “insert into `$table`($keys) values($vals);\r\n”;
}
}

$filename = $dbname . date(‘Ymjgi’) . “.sql”;
//存放路徑,可依自己的規劃存放檔案
//我自己修改的程式,還加上亂碼檔名,畢竟共用主機.sql還是可以列出來的
//有太多的風險
$fp = fopen($filename, ‘w’);
fputs($fp, $mysql);
fclose($fp);
echo “資料庫備份成功”;
?>

 

20141111 光棍節的今天,還是在當攻城獅,把上面的代碼整個翻新一下,再把註解弄好
哈….寫筆記真的還是很重要的。

2 thoughts on “共享主機的mysql備份策略

發佈回覆給「link」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *