新聞中心
如何在兩臺(tái)服務(wù)器之間安全遷移MySQL數(shù)據(jù)庫(kù)
遷移MySQL數(shù)據(jù)庫(kù)通常只需要幾個(gè)簡(jiǎn)單的步驟,但是由于您要轉(zhuǎn)移的數(shù)據(jù)量可能比較龐大,因此一般耗時(shí)也會(huì)比較長(zhǎng)。
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)昭平免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
下面的步驟將指導(dǎo)您如何從舊的服務(wù)器上導(dǎo)出MySQL數(shù)據(jù)庫(kù),對(duì)它進(jìn)行安全加固;然后將其復(fù)制并導(dǎo)入到新的服務(wù)器上,以保證數(shù)據(jù)的完整。
將MySQL數(shù)據(jù)庫(kù)導(dǎo)出至轉(zhuǎn)儲(chǔ)文件(dump file)
Oracle提供了一個(gè)名為mysqldump的工具,允許您輕松地將數(shù)據(jù)庫(kù)結(jié)構(gòu)和其數(shù)據(jù)導(dǎo)出到一個(gè)SQL的轉(zhuǎn)儲(chǔ)文件。您可以使用如下的命令:
1.mysqldump -u root -p --opt [database name] [database name].sql?
不過(guò),請(qǐng)注意如下幾點(diǎn):
我們可以使用--single-transaction的標(biāo)志,以避免數(shù)據(jù)庫(kù)在導(dǎo)出數(shù)據(jù)的過(guò)程中被鎖死。這樣能夠在將數(shù)據(jù)導(dǎo)出到轉(zhuǎn)儲(chǔ)文件的同時(shí),您仍可繼續(xù)在舊的數(shù)據(jù)庫(kù)上更新數(shù)據(jù)。不過(guò)請(qǐng)注意,那些在導(dǎo)出進(jìn)程已經(jīng)開(kāi)始之后被更新的數(shù)據(jù),是不會(huì)被導(dǎo)入轉(zhuǎn)儲(chǔ)文件之中的。
在運(yùn)行該命令之前,請(qǐng)務(wù)必將[database name]替換成您的實(shí)際數(shù)據(jù)庫(kù)名稱(chēng)。
請(qǐng)輸入您自己的用戶(hù)名和相對(duì)應(yīng)的密碼,并確保該用戶(hù)具有備份數(shù)據(jù)庫(kù)所需的權(quán)限。
安全加固備份文件
在大多數(shù)情況下,數(shù)據(jù)是一家企業(yè)的最重要的資產(chǎn)。因此,我們不希望數(shù)據(jù)庫(kù)的各種備份被暴露在不受保護(hù)的服務(wù)器上,因?yàn)檫@樣有可能會(huì)造成錯(cuò)誤地泄露,甚至?xí)霈F(xiàn)被黑客竊取等更為糟糕的狀況。
因此,通常您可以嘗試的做法是:壓縮、加密文件,然后刪除原文件。在Linux操作系統(tǒng)上,請(qǐng)使用以下的命令對(duì)已壓縮文件進(jìn)行加密:
1.zip --encrypt dump.zip db.sql?
在壓縮開(kāi)始之前,系統(tǒng)將提示您輸入密碼。
傳輸備份文件
至此,我們已經(jīng)獲得了一個(gè)加密的轉(zhuǎn)儲(chǔ)文件。下面讓我們通過(guò)網(wǎng)絡(luò)使用SCP命令,將其傳輸?shù)叫碌姆?wù)器上:
1.scp /path/to/source-file user@host:/path/to/destination-folder/?
將MySQL轉(zhuǎn)儲(chǔ)導(dǎo)入新服務(wù)器
通過(guò)上面一步,我們已將備份文件傳到了新的服務(wù)器上,下面讓我們來(lái)進(jìn)行解密和提?。?/p>
1.unzip -P your-password dump.zip?
為了存儲(chǔ)空間和安全方面的原因,一旦文件導(dǎo)入成功,請(qǐng)記得刪除其對(duì)應(yīng)的轉(zhuǎn)儲(chǔ)文件。
您可以使用以下的命令來(lái)導(dǎo)入文件:
1.mysql -u root -p newdatabase /path/to/newdatabase.sql?
在新服務(wù)器上驗(yàn)證導(dǎo)入的數(shù)據(jù)
現(xiàn)在我們?cè)谛路?wù)器上已經(jīng)導(dǎo)入了數(shù)據(jù)庫(kù),那么我們就需要一種方法來(lái)驗(yàn)證數(shù)據(jù)的真實(shí)存在,并確保沒(méi)有任何遺漏。
我建議您同時(shí)在舊的和新的數(shù)據(jù)庫(kù)上運(yùn)行如下查詢(xún),并將獲得的結(jié)果進(jìn)行對(duì)比。
該查詢(xún)會(huì)在所有的表里計(jì)算行數(shù),以顯示出新、舊數(shù)據(jù)庫(kù)中的數(shù)據(jù)量。
1.SELECT ??
2.TABLE_NAME, ??
3.TABLE_ROWS ?
4.FROM ??
`
5.information_schema`.`tables` ?
6.WHERE ??
`
7.table_schema` = 'YOUR_DB_NAME';?
此外,我建議您檢查各個(gè)表中數(shù)字列的MIN和MAX記錄,以確保數(shù)據(jù)本身是有效的,而不僅僅是看數(shù)據(jù)的總量(雖然這是查詢(xún)所唯一能夠讀出的值)。另一種可供測(cè)試的選擇是將數(shù)據(jù)庫(kù)從新的服務(wù)器導(dǎo)出為SQL轉(zhuǎn)儲(chǔ)文件,并將其與舊服務(wù)器的SQL轉(zhuǎn)儲(chǔ)文件做比較。
此外,在應(yīng)用程序被遷移之前,我建議您先將一個(gè)應(yīng)用程序的實(shí)例重定向到新的數(shù)據(jù)庫(kù)上,以確認(rèn)一切運(yùn)行正常。
另一種導(dǎo)出和導(dǎo)入的選項(xiàng)
我們之所以把該選項(xiàng)放在最后,是因?yàn)槲覀兊拇_不建議您去使用它。
該方法實(shí)現(xiàn)起來(lái)非常的容易,因?yàn)樗鼉H使用一個(gè)命令,便能一次性將轉(zhuǎn)儲(chǔ)文件導(dǎo)出、傳輸、并將其數(shù)據(jù)導(dǎo)入到新的數(shù)據(jù)庫(kù)之中。
而它的不足之處在于,一旦其網(wǎng)絡(luò)鏈接斷掉,您就需要重新啟動(dòng)它了。
因此,我們認(rèn)為它并不值得被推薦,尤其是在大型數(shù)據(jù)庫(kù)中,可能會(huì)非常不適用。
當(dāng)然,如果您非要嘗試一下的話(huà),可以使用如下的命令:
1.mysqldump -u root -pPassword --all-databases | ssh user@new_host.host.com 'cat - | mysql -u root -pPassword'?
重要提示
請(qǐng)確保在新舊兩處,安裝有相同官方發(fā)行版本的MySQL服務(wù)器。否則,你需要按照MySQL網(wǎng)站上的升級(jí)說(shuō)明來(lái)進(jìn)行統(tǒng)一(請(qǐng)參見(jiàn)(https://dev.mysql.com/doc/refman/5.7/en/upgrading.html)。
請(qǐng)確保您在舊的服務(wù)器上擁有足夠的空間來(lái)保存轉(zhuǎn)儲(chǔ)文件和壓縮文件(應(yīng)該有db_size×2的空間)。
請(qǐng)確保您在新的服務(wù)器上擁有足夠的空間來(lái)保存加密的和解密的轉(zhuǎn)儲(chǔ)文件、并能導(dǎo)入數(shù)據(jù)庫(kù)(應(yīng)該有db_size×3的空間)。
如果您曾經(jīng)考慮過(guò)只是將datadir從一個(gè)數(shù)據(jù)庫(kù)轉(zhuǎn)移到另一個(gè)的話(huà),我建議您最好不要這樣做。否則,您會(huì)搞亂數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu),而且會(huì)給將來(lái)可能的問(wèn)題埋下隱患。
在新的服務(wù)器配置中,請(qǐng)不要忘了配置諸如innodb_log_file_size這樣的重要標(biāo)志。因?yàn)槿绻浟烁鶕?jù)新服務(wù)器的規(guī)格而更新配置的話(huà),很可能會(huì)導(dǎo)致嚴(yán)重的性能問(wèn)題。
在許多情況下,一般升級(jí)到新的數(shù)據(jù)庫(kù)服務(wù)器的初衷是為了提高查詢(xún)性能。而如果此類(lèi)升級(jí)沒(méi)有達(dá)到預(yù)期的改善,那么您就應(yīng)該考慮去優(yōu)化SQL查詢(xún),而不僅僅是升級(jí)硬件那么簡(jiǎn)單了
如何遷移MySQL數(shù)據(jù)庫(kù)
MySQL數(shù)據(jù)庫(kù)遷移
MySQL數(shù)據(jù)庫(kù)遷移(數(shù)據(jù)文件直接遷移)
在今年10月下旬的時(shí)候,公司的服務(wù)器需要遷移,其中涉及到了MySQL數(shù)據(jù)庫(kù)遷移。查看了一下MySQL數(shù)據(jù)文件的大小,接近60G的大小(實(shí)際數(shù)據(jù)并沒(méi)用那么多)。由于服務(wù)器上業(yè)務(wù)需要,要盡量減少服務(wù)器遷移時(shí)的損失。所以遷移時(shí)間選在了晚上零點(diǎn)開(kāi)始,而且要盡量減少遷移所用的時(shí)間。
在遷移之前有三種方案:
數(shù)據(jù)庫(kù)直接導(dǎo)出,拷貝文件到新服務(wù)器,在新服務(wù)器上導(dǎo)入。
使用【MySQL
GUI
Tools】中的
MySQLMigrationTool。
數(shù)據(jù)文件和庫(kù)表結(jié)構(gòu)文件直接拷貝到新服務(wù)器,掛載到同樣配置的MySQL服務(wù)下。
我在我的電腦上用虛擬機(jī)測(cè)試后,選中了占用時(shí)間最少的第三種方案。下面是三種方案的對(duì)比:
第一種方案的優(yōu)點(diǎn):會(huì)重建數(shù)據(jù)文件,減少數(shù)據(jù)文件的占用空間。
第一種方案的缺點(diǎn):時(shí)間占用長(zhǎng)。(導(dǎo)入導(dǎo)出都需要很長(zhǎng)的時(shí)間,并且導(dǎo)出后的文件還要經(jīng)過(guò)網(wǎng)絡(luò)傳輸,也要占用一定的時(shí)間。)
第二種方案的優(yōu)點(diǎn):設(shè)置完成后傳輸無(wú)人值守
第二種方案的缺點(diǎn):
設(shè)置繁瑣。
傳輸中網(wǎng)絡(luò)出現(xiàn)異常,不能及時(shí)的被發(fā)現(xiàn),并且會(huì)一直停留在數(shù)據(jù)傳輸?shù)臓顟B(tài)不能被停止,如不仔細(xì)觀(guān)察不會(huì)被發(fā)現(xiàn)異常。
傳輸相對(duì)其他fang時(shí)間長(zhǎng)。
異常后很難從異常的位置繼續(xù)傳輸。
第三種方案的優(yōu)點(diǎn):時(shí)間占用短,文件可斷點(diǎn)傳輸。操作步驟少。(絕大部分時(shí)間都是在文件的網(wǎng)絡(luò)傳輸)
第三種方案的缺點(diǎn):可能引起未知問(wèn)題,暫時(shí)未發(fā)現(xiàn)。
下面介紹一下第三種方案d遷移步驟:
保證Mysql版本一致,安裝配置基本一致(注意:這里的數(shù)據(jù)文件和庫(kù)表結(jié)構(gòu)文件都指定在同一目錄data下)
停止兩邊的Mysql服務(wù)(A服務(wù)器--遷移--B服務(wù)器)
刪除B服務(wù)器Mysql的data目錄下所有文件
拷貝A服務(wù)器Mysql的data目錄下除了ib_logfile和.err之外的文件到B服務(wù)器data下
啟動(dòng)B服務(wù)器的Mysql服務(wù),檢測(cè)是否發(fā)生異常
遷移完成后,服務(wù)啟動(dòng)正常,未發(fā)現(xiàn)其他異常問(wèn)題。
備注:經(jīng)測(cè)試,源mysql的安裝目錄及數(shù)據(jù)文件目錄
可以與
目標(biāo)Mysql的安裝目錄及數(shù)據(jù)文件目錄
不一致。
此時(shí),只需要拷貝您所需移動(dòng)的dbname(如上:pa、testdb)及'mysql'和'ibdata1',即可。
如何把sqlserver數(shù)據(jù)遷移到mysql數(shù)據(jù)庫(kù)及需要注意事項(xiàng)
以下有幾款遷移工具的對(duì)比,可以參考,比較推薦DB2DB.
軟件易用性主要是指軟件在導(dǎo)入前的配置是否容易。由于很多軟件設(shè)計(jì)是面向程序員而非一般的數(shù)據(jù)庫(kù)管理人員、甚至是普通的應(yīng)用程序?qū)嵤┤藛T,而這一類(lèi)人員很多時(shí)候并沒(méi)有數(shù)據(jù)源配置經(jīng)驗(yàn)。因?yàn)橐恍┦褂?ODBC 或者 ADO 進(jìn)行配置的程序往往會(huì)讓這類(lèi)用戶(hù)造成困擾(主要是不知道應(yīng)該選擇什么類(lèi)型的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序)。下面讓我們看看四個(gè)工具的設(shè)計(jì)界面:
1、SQLyog
SQLyog?使用的是古老的 ODBC 連接,但對(duì)于新一代的程序來(lái)說(shuō),這種方式的非常的不熟悉并且不容易使用,并且必須要求本機(jī)安裝好相應(yīng)的數(shù)據(jù)庫(kù)的 ODBC 驅(qū)動(dòng)程序(SQL Server 一般自帶好)。
2、Navicat?Premium
NavicatPremium是四個(gè)應(yīng)用工具中設(shè)計(jì)最不人性化的一個(gè):從上圖怎么也想像不到要點(diǎn)按那個(gè)小按鈕來(lái)添加一個(gè)新的連接,并且這個(gè)連接設(shè)置不會(huì)保存,每次導(dǎo)入時(shí)都必須重新設(shè)置。NavicatPremium使用的是比 ODBC 稍先進(jìn)的 ADO 設(shè)置方式(199X年代的產(chǎn)物),但使用上依然是針對(duì)老一代的程序員。
3、Mss2sql
Mss2sql?是最容易在百度上搜索出來(lái)的工具,原因之一是它出現(xiàn)的時(shí)間較早。
Mss2sql由于是很有針對(duì)性的從 SQLServer 遷移到 MySQL,因?yàn)榻缑媸褂昧瞬僮飨驅(qū)гO(shè)計(jì),使用非常容易。同時(shí)在設(shè)置的過(guò)程中,有非常多的選項(xiàng)進(jìn)行細(xì)節(jié)調(diào)整,可以感覺(jué)到軟件經(jīng)過(guò)了相當(dāng)長(zhǎng)一段時(shí)間的使用漸漸完善出來(lái)的。
4、DB2DB
DB2DB?由于是由國(guó)人開(kāi)發(fā),因此無(wú)論是界面還是提示信息,都是全程漢字。另外,由于 DB2DB 在功能上很有針對(duì)性,因?yàn)榻缑嬖O(shè)計(jì)一目了然和易使用。和 mss2sql 一樣, DB2DB 提供了非常多的選項(xiàng)供用戶(hù)進(jìn)行選擇和設(shè)置。
三、處理速度和內(nèi)存占用評(píng)測(cè)
在本評(píng)測(cè)前,本人的一位資深同事曾經(jīng)從網(wǎng)上下載了某款遷移軟件,把一個(gè)大約2500萬(wàn)記錄數(shù)的數(shù)據(jù)表轉(zhuǎn)送到阿里云 MySQL,結(jié)果經(jīng)過(guò)了三天三夜(好在其中兩天是星期六和星期日兩個(gè)休息日)都未能遷移過(guò)來(lái)。因此這一次需要對(duì)這四個(gè)工具的處理速度作一個(gè)詳細(xì)的測(cè)試。
考慮到從 SQL Server 遷移到 MySQL 會(huì)出現(xiàn)兩種不同的場(chǎng)景:
從 SQL Server 遷移到本地 MySQL 進(jìn)行代碼測(cè)試和修改;
從 SQL Server 遷移到云端 MySQL 數(shù)據(jù)庫(kù)正式上線(xiàn)使用;
以下為測(cè)試過(guò)程中的截圖:
1、SQLyog
請(qǐng)點(diǎn)擊輸入圖片描述
2、Navicat Premium
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
注意:我們?cè)跍y(cè)試 Navicat Premium 遷移到 ?MySQL 時(shí)發(fā)現(xiàn),對(duì)于 SQL Server 的 Money 類(lèi)型支持不好(不排除還有其它的數(shù)據(jù)類(lèi)型支持不好)。Money 類(lèi)型字段默認(rèn)的小數(shù)位長(zhǎng)度為 255,使得無(wú)法創(chuàng)建數(shù)據(jù)表導(dǎo)致整個(gè)測(cè)試無(wú)法成功,需要我們逐張表進(jìn)行表結(jié)構(gòu)修改才能完成測(cè)試過(guò)程。
Navicat Premium?的處理速度屬于中等,不算快也不算慢,但 CPU 占用還有內(nèi)存占用都處于高位水平。不過(guò)以現(xiàn)在的電腦硬件水平來(lái)說(shuō),還是可以接受。但 CPU 占用率太高,將使得數(shù)據(jù)在導(dǎo)入的過(guò)程中,服務(wù)器不能用于其它用途。
3、Mss2sql
Mss2sql?并沒(méi)有提供計(jì)時(shí)器,因此我們使用人工計(jì)時(shí)的方法,整個(gè)過(guò)程處理完畢大于是 726 秒。Mss2sql 的 CPU 占用率相對(duì)其它工具來(lái)說(shuō)較高,但仍屬于可以接受的范圍之內(nèi)。
4、DB2DB
請(qǐng)點(diǎn)擊輸入圖片描述
DB2DB?同樣遷移 300萬(wàn)數(shù)據(jù)時(shí),僅僅使用了 2 分 44 秒,這個(gè)速度相當(dāng)驚人。不過(guò)最后的結(jié)果出現(xiàn)一個(gè) BUG,就是提示了轉(zhuǎn)換成功,但后面的進(jìn)度條卻沒(méi)有走完(在后面的數(shù)據(jù)完整性評(píng)測(cè)中,我們驗(yàn)證了數(shù)據(jù)其實(shí)是已經(jīng)全部處理完畢了)。
mysql數(shù)據(jù)遷移
這個(gè)估計(jì)沒(méi)辦法簡(jiǎn)單的一條 sql 語(yǔ)句完成了。
你可能創(chuàng)建幾個(gè) 新舊id 關(guān)聯(lián)表, 來(lái)存儲(chǔ)數(shù)據(jù)。
還不能確定, 你的 id 是不是自動(dòng)增長(zhǎng)的.
例如
信息表a(id,name)
創(chuàng)建一個(gè)表 old_to_new_a ( oldid , newid)
以下處理邏輯, 是假設(shè)你的 id 是 自增長(zhǎng)的情況。
你舊庫(kù) a -- 新庫(kù) a 的時(shí)候。
如果 新舊 id 與 name 都一樣, 那么簡(jiǎn)單去 old_to_new_a 插入一行關(guān)聯(lián)數(shù)據(jù)。
舊系統(tǒng)的 id 與 新系統(tǒng)的id 是相同的。
如果 name 已存在, 那么去 old_to_new_a 插入一行關(guān)聯(lián)數(shù)據(jù)。
也就是 old_to_new_a ( 舊系統(tǒng)的 id , 新系統(tǒng)的id)
如果 name 不存在
那么先去 a 插入一行新的數(shù)據(jù)。 獲取新的 自增id.
然后再去 old_to_new_a 插入一行關(guān)聯(lián)數(shù)據(jù)。
舊庫(kù) b -- 新庫(kù) b 的 處理, 和 a 差不多一樣。
就是要去折騰個(gè) old_to_new_b ( oldid , newid)
----
最后就是折騰 關(guān)系表e。
一行一行判斷 aid 和 bid
用 aid 去 old_to_new_a 表, 查詢(xún)出 新系統(tǒng)的 aid
用 bid 去 old_to_new_b 表, 查詢(xún)出 新系統(tǒng)的 bid
然后去新系統(tǒng)的 e 表中查詢(xún)。數(shù)據(jù)是否已存在。
不存在就插入一行。
分享文章:遷移mysql怎么生效,MySQL 遷移
當(dāng)前URL:http://fisionsoft.com.cn/article/dsehcss.html