2012-02-28 84 views
6

嗨,我有mysql數據庫移動到另一臺服務器,如何移動mysql數據庫最簡單和最快的方式?

這是近5 GB

我可以在兩個服務器的root訪問權限?

+0

我想這樣的問題屬於上http://dba.stackexchange.com/我希望移居遷移,但我沒有代表:P或可能http://www.Superuser.com但我會懷疑前者,因爲它是數據庫特定的。 – Jordan 2012-02-28 21:17:33

回答

22

通常你運行的mysqldump創建一個數據庫複製和備份如下:使用SFTP/SSH遠程MySQL服務器

$ mysqldump -u user -p db-name > db-name.out 

複製DB-name.out文件:

$ scp db-name.out [email protected]:/backup 

還原數據庫在遠程服務器(通過ssh登錄):

$ mysql -u user -p db-name < db-name.out 

OR

$ mysql -u user -p 'password' db-name < db-name.out 

如何將MySQL數據庫從一臺計算機/服務器複製到另一臺計算機/服務器?

簡而言之,您可以使用ssh或mysql客戶端將數據庫從一臺計算機/服務器複製到另一臺計算機/服務器。

您可以運行在一個通用mysqldump和mysql命令所有上述3個命令(不安全的方法,只使用,如果您使用VPN或信任網絡):

$ mysqldump db-name | mysql -h remote.box.com db-name 

使用SSH,如果你不」噸有遠程MySQL服務器(安全法)直接訪問:

$ mysqldump db-name | ssh [email protected] mysql db-name 

OR

$ mysqldump -u username -p'password' db-name | ssh [email protected] mysql -u username -p'password db-name 

你ç一個只是複製稱爲酒吧使用相同的語法表名爲foo到遠程數據庫(和遠程MySQL服務器remote.box.com):

$ mysqldump db-name foo | ssh [email protected] mysql bar 

OR

$ mysqldump -u user -p'password' db-name foo | ssh [email protected] mysql -u user -p'password' db-name foo 

幾乎所有的命令都可以通過下水管運行UNIX/Linux oses。

更多來自Reference

問候,

+3

請確保您在轉儲中使用擴展插入選項(我認爲它可能默認啓用,但不是肯定的),否則恢復速度將顯着下降。 – 2012-02-28 21:20:50

+2

*從這裏取:http://www.cyberciti.biz/tips/howto-copy-mysql-database-remote-server。html – 2013-09-16 22:08:30

13

如果你有根,你可能會發現它更快避免mysqldump。您可以在目標服務器上創建數據庫,並直接複製數據庫文件。假設user訪問目標服務器的mysql目錄:

這裏
[[email protected]]# /etc/init.d/mysqld stop 
[[email protected]]# cd /var/lib/mysql/[databasename] 
[[email protected]]# scp * [email protected]:/var/lib/mysql/[databasename] 
[[email protected]]# /etc/init.d/mysqld start 

重要的事情是:複製DB文件之前停止這兩個服務器上的mysqld,確保文件的所有權和權限在目標正確的啓動mysqld前目標服務器。

[[email protected]]# chown mysql:mysql /var/lib/mysql/[databasename]/* 
[[email protected]]# chmod 660 /var/lib/mysql/[databasename]/* 
[[email protected]]# /etc/init.d/mysqld start 

隨着時間的推移在這兒你的優先級,壓縮的使用將取決於時間是否失去了等待的壓縮/解壓縮(喜歡的東西gzip)會比浪費傳輸未壓縮數據的時間更大;也就是連接的速度。

+0

這是迄今爲止最簡單的方法。不知道爲什麼這不是更高。然後,MySQL服務器就是原件的複印件。我在5分鐘內將整個網絡服務器克隆到了一臺獨特的服務器上。 – David 2013-09-27 15:12:13

+0

我做了上述步驟,但我得到「錯誤1146(42S02):表'sample.user'不存在」,當我嘗試打印用戶表。任何想法 ?? – Bathakarai 2013-11-06 08:39:08

+0

想法:錯誤路徑下用戶表的文件,錯誤的文件權限或配置不同的服務器。 – Umbrella 2013-11-08 15:48:18

2

對於一個自動化的方式來備份你的MySQL數據庫:

的先決條件做任何形式的備份是找到一天的理想的時間來完成任務,而不妨礙運行系統的性能或用戶造成干擾。在這個筆記中,必須考慮數據庫的大小以及驅動器的I/O速度 - 隨着數據庫的增長,數據庫的規模變得越來越重要(想到的另一個因素是驅動器的數量,因爲有一個由於磁頭不執行讀寫操作,數據庫不存儲的備用驅動器會提高速度。)爲了保持這種可讀性,我假設數據庫具有可管理的大小(100MB),並且工作環境是上午9點至下午5點的工作,沒有真正的壓力或其他非工作時間系統。

第一步是使用root權限登錄到本地計算機。一旦在根shell中,MySQL用戶將需要創建具有隻讀權限。要做到這一點,使用以下命令輸入MySQL的外殼:

mysql -uroot -ppassword 

接下來,用戶需要具有隻讀的權限需要進行備份的數據庫中創建。在這種情況下,如果稍​​後使用腳本或進程,則不需要將特定數據庫分配給用戶。要在MySQL外殼創建擁有完全的讀取權限的用戶,輸入以下命令:

grant SELECT on *.* TO [email protected] IDENTIFIED BY ' backuppassword'; 
FLUSH PRIVILEGES; 

隨着創建的MySQL用戶,就可以安全退出MySQL的外殼,並使用出口回落到root的shell。從這裏開始,我們需要創建我們想要運行備份命令的腳本,這很容易使用BASH完成。該腳本可以在任何地方進行存儲,因爲我們將使用一個cron作業每晚運行腳本,這個例子的目的,我們將放置腳本在新目錄中,我們創建了一個名爲「backupscripts。」要創建該目錄,在root shell中使用這個命令:

mkdir /backupscripts 

我們還需要創建一個目錄來存放我們的本地備份。我們將這個目錄命名爲「backuplogs」。在root shell中發出以下命令來創建目錄:

mkdir /backuplogs 

下一個步驟將是登錄到遠程機器的根證書,並創建一個「備份用戶」使用以下命令:

useradd -c "backup user" -p backuppassword backupuser 

爲備份創建一個目錄:

mkdir /backuplogs/ 

您註銷之前,使用命令抓取遠程主機的IP地址,以供將來參考:

ifconfig -a 

eth0是有線網絡連接的標準接口。注意這個IP_ADDR。

最後,註銷遠程服務器,並返回到原來的主機。

下一步,我們將創建一個是我們的主機本地機器,而不是在遙控器上我們的腳本文件。我們將使用VIM(如果你是一個納米或Emacs風扇不記仇我 - 但我不會列出如何使用VIM編輯在這裏一個文件,)首先創建文件,並使用mysqldump ,備份你的數據庫。我們也將使用scp來創建數據庫後,壓縮文件以進行存儲。將文件讀取到STDOUT以滿足說明。最後,檢查7天以前的文件。刪除它們。要做到這一點,你的腳本將是這樣的:

vim /backupscripts/mysqldbbackup.sh 

#!/bin/sh 

# create a temporary file for the schema to be stored 
BACKUPDIR = /backuplogs/ 
TMPFILE = tmpout.sql 
CURRTIME = $(date +%Y%m%d).tgz 

#backup your database 
mysqldump -ubackupdbuser -pbackuppassword databasename > $BACKUPDIR$TMPFILE 

#compress this file and store it locally with the current date 
tar -zvcf /backuplogs/backupdb-$CURRTIME $BACKUPDIR$TMPFILE 

#per instructions - cat the contents of the SQL file to STDOUT 
cat $BACKUPDIR$TMPFILE 

#cleanup script 
# remove files older than 7 days old 
find $BACKUPDIR -atime +7 -name 'backup-db-*.tgz' -exec rm {} \; 

#remove the old backupdirectory from the remote server 
ssh [email protected] find /backuplogs/ -name 'backup-db-*.tgz' -exec rm {} \; 

#copy the current backup directory to the remote server using scp 
scp -r /backuplogs/ [email protected]:/backuplogs/ 

################# 
# End script 
################# 

有了這個腳本的地方,我們需要安裝SSH密鑰,所以,我們不是提示我們每個腳本運行時輸入密碼。我們將使用SSH-keygen和命令執行此操作:

ssh-keygen -t rsa 

在提示時輸入密碼 - 這會創建您的私鑰。不要分享這個。

你需要分享的是你的公鑰,它被存儲在文件current_home /的.ssh/id_rsa.pub文件。下一步是將此公鑰傳輸到遠程主機。要獲得密鑰,請使用以下命令:

cat current_home/.ssh/id_rsa.pub 

複製文件中的字符串。接下來使用以下命令進入遠程服務器ssh:

ssh [email protected] 

輸入您的密碼,然後編輯文件/.ssh/authorized_keys。將從id_rsa.pub文件中獲取的字符串粘貼到authorized_keys文件中。使用編輯器將更改寫入文件,然後退出編輯器。註銷遠程服務器並通過使用先前的ssh命令嘗試再次登錄到遠程服務器來測試RSA密鑰的工作情況。如果沒有要求密碼,它工作正常。再次註銷遠程服務器。

我們需要做的最後一件事是建立一個cron作業的用戶已註銷後,每天晚上運行此。使用crontab,我們將編輯當前用戶文件(root)以避免所有權限問題。 *注 - 這可能產生嚴重的影響,如果有在腳本中包括刪除數據,安全漏洞等錯誤 - 仔細檢查所有的工作,並確保你信任你自己的系統,如果這是不可能的,那麼備用的用戶和應該在當前服務器*上設置權限。要修改當前的crontab,我們將發出命令:

crontab -e 

雖然在crontab編輯器(它會在您的默認文本編輯器打開),我們要設置我們的腳本在運行12每晚:30AM。輸入一個新行到編輯器:

30 0 * * *慶典/backupscripts/mysqldbbackup.sh

保存此文件並退出編輯器。爲了讓你的cronjob正常運行,我們需要重新啓動crond服務。要做到這一點,發出命令:

/etc/init.d/crond restart