我的站點(diǎn)最初是采用PHP驅(qū)動(dòng),由MySQL數(shù)據(jù)庫(kù)支持的方案,這在當(dāng)時(shí)是一個(gè)明智的方案。在2001年夏天,我將我的數(shù)據(jù)庫(kù)換成了PostgreSQL(有時(shí)也簡(jiǎn)稱為Postgres)。
這個(gè)教程分為兩部分,第一部分講述了我進(jìn)行這種轉(zhuǎn)換的動(dòng)機(jī),并一步步地解釋了如何將已存在有MySQL的數(shù)據(jù)轉(zhuǎn)換到Postgres中。第二部分將會(huì)解釋如何根據(jù)新的數(shù)據(jù)庫(kù)系統(tǒng)對(duì)PHP進(jìn)行相應(yīng)的調(diào)整。
轉(zhuǎn)換的動(dòng)機(jī)
我第一次了解Postgres是在PHPBuilder網(wǎng)站的一篇文章中。這篇文章將Postgres和MySQL進(jìn)行了比較,當(dāng)時(shí)我正在使用 MySQL。但是,當(dāng)我閱讀了這篇文章后,我對(duì)Postgres著了迷 -- 但是當(dāng)時(shí)我還沒(méi)有想到對(duì)我的網(wǎng)站進(jìn)行重新的設(shè)計(jì)。
我繼續(xù)使用MySQL,因?yàn)槲业闹鳈C(jī)提供商只能提供MySQL的支持,這是我所無(wú)法改變的。直到有一天,主機(jī)提供商的主機(jī)崩潰了。我立即換了一個(gè)主機(jī)提供商,與原來(lái)的那個(gè)相比,新的主機(jī)提供商有很多不同,他們?cè)诎踩院头€(wěn)定性方面對(duì)我作出了更多的承諾。新公司試圖說(shuō)服我使用Postgres,因?yàn)?Postgres要比MySQL來(lái)得更穩(wěn)定,但是我當(dāng)時(shí)沒(méi)有接受這個(gè)建議,因?yàn)槲业木W(wǎng)站已經(jīng)根據(jù)MySQL完成了全部的編碼工作。他們只好專門為我的站點(diǎn)安裝了MySQL。于是問(wèn)題開(kāi)始了。
我的第一個(gè)工作是將舊服務(wù)器上的MySQL的數(shù)據(jù)拷貝到新的主機(jī)上。首先,我將已有的數(shù)據(jù)dump到一個(gè)SQL文件中,然后在新的主機(jī)上導(dǎo)入這個(gè)SQL文件。在處理這個(gè)數(shù)千行的文件時(shí),MySQL迅速地崩潰了。重啟MySQL后,其中大概只有一半數(shù)據(jù)成功地導(dǎo)入了,而且MySQL只能間歇性地工作。最后,他們不得不刪除了已經(jīng)導(dǎo)入的信息讓我再試一次。MySQL再次崩潰。這種情況重復(fù)了好幾次,直到最終我決定將我的SQL文件分割成幾塊。我不得不又試了幾次,最后終于將絕大多數(shù)的數(shù)據(jù)都成功地導(dǎo)入到新的MySQL服務(wù)器中。一切都好了,我總算松了一口氣。
在下面的幾個(gè)月中,MySQL幾乎每?jī)芍芏家罎⒁淮危渲凶顟K痛的一次是在2001年6月底。這一次,存儲(chǔ)在MySQL中的數(shù)據(jù)完全被毀壞了。我有一個(gè) SQL的備份文件,但是因?yàn)樯洗蜗騇ySQL中導(dǎo)入大量數(shù)據(jù)的痛苦的經(jīng)歷,這一次我再也不想通過(guò)這個(gè)備份恢復(fù)數(shù)據(jù)了。這時(shí),公司再次建議我對(duì)我的網(wǎng)站進(jìn)行轉(zhuǎn)向,使用Postgres。由于MySQL的失敗,最終我接受了這個(gè)建議。
將數(shù)據(jù)從MySQL轉(zhuǎn)移到Postgres中
將數(shù)據(jù)從MySQL轉(zhuǎn)移到Postgres是一個(gè)不大的挑戰(zhàn),因?yàn)镻ostgres比MySQL支持了更多的SQL的標(biāo)準(zhǔn)格式,在POstgres中直接使用SQL的dump結(jié)果是不可能的。但是,SQL語(yǔ)法相當(dāng)相似,因此對(duì)于我來(lái)說(shuō),這并沒(méi)有花費(fèi)太多的時(shí)間。
對(duì)MySQL的Dump結(jié)果進(jìn)行轉(zhuǎn)換
首先,要求你的主機(jī)提供商為你的帳號(hào)建立一個(gè)數(shù)據(jù)庫(kù)。和MySQL數(shù)據(jù)庫(kù)一樣,Postgres的數(shù)據(jù)庫(kù)也由一系列包含實(shí)際數(shù)據(jù)的數(shù)據(jù)表組成。然后,使用mysqldump命令為你的MySQL數(shù)據(jù)庫(kù)做一個(gè)dump文件。
|
使用FTP將整個(gè)dump文件下載下來(lái)。現(xiàn)在在你的計(jì)算機(jī)上有了這個(gè)SQL文件,你可以將其轉(zhuǎn)換成Postgres可以導(dǎo)入的文件。
首先,從dump文件中剪切所有的MySQL的CREATE TABLE查詢,并將其粘貼到一個(gè)單獨(dú)的文本文件中。下一步是使用Postgres可以理解的語(yǔ)言重新對(duì)數(shù)據(jù)表進(jìn)行定義。
Postgres建立表的SQL和MySQL非常類似,但不完全一樣。下面是一個(gè)例子:
|
在一個(gè)Postgres的表定義中,字段名后面必須跟著字段類型。在上面的例子中我們給出了一些最普通的字段類型,你還可以在有關(guān)Postgres數(shù)據(jù)類型的文檔中找到全部的字段類型的列表。對(duì)于不同的任務(wù),Postgres在字段類型方面有多種選擇,并可以存儲(chǔ)各種類型的數(shù)據(jù),從Internet地址到貨幣信息到幾何對(duì)象的定義。這兒簡(jiǎn)要地介紹最常用的幾種數(shù)據(jù)類型。
新聞熱點(diǎn)
疑難解答
圖片精選