PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA
本次以故事的形式講述一名不緊跟時代步伐、不主動積極學習的員工在不瞭解最新特性的情況下,如何失去了“老員工”的優勢和領導的信任。
在一個風和日麗,沒有霧霾的早上,技術部領導把小明叫到了辦公室,問:“兄弟,我想在新的系統上查詢一下在用的生產系統的資料,有沒有比較快速、方便的方法?新的用的PG的資料庫有這種方案嗎?”
小明:“領導,把資料從生產系統中匯出,然後匯入到新系統不就OK?”
領導:“比較快速、方便的方法有沒有?”
小明:“領導,把資料從生產系統中匯出,然後匯入到新系統就很快。”
領導:“更快速、方便的方法有沒有?”
小明:“領導,把資料從生產系統中匯出,然後匯入新系統就已經很快了!”
領導對於小明複讀機似的回答有些惱火,按耐住心中的不耐煩,問了一句:“匯入外部表格需要做什麼準備工作嗎?”
小明胸有成竹的講:“領導,就是實現建立好ddl就行。”
領導認真的問到:“一共多少張表?”
小明有些不確定:“200張?”
領導有些驚訝:“這麼多?!”
小明突然又想起了些什麼,小聲的說:“領導......我剛想起來...還有一個使用者,裡面大概有300張表...”(-__-|||)(聲音小的連他自己都快聽不到了)
領導有點沉不住氣了:“滾出去!”
小明紅著臉說:“領導!你聽我說...”
領導這次徹底的被點燃了:“滾出去!!!”
小明默默的在外面幫領導關上了門......
領導已經氣的不行,此時老闆的電話已打過來:“怎麼樣?搞定沒?”
領導:“沒問題,老闆,稍等片刻!”
老闆:“好的,搞好了說一聲,好跟客戶介紹咱們新開發的系統,起碼有個查詢體驗,等你訊息!抓緊。”
領導此時想起了公司新來的同事小強,雖然小強平時看起來比較逗逼和活潑,但是小強已經是公司為數不多做資料庫的員工了。領導想好了如何跟老闆解釋系統開發進度慢,拖延體驗時間的解釋。抱著試試看的心態,傳召了小強,表達了在此情景下的需求。
小強:“領導,這個問題,我不敢保證能做好,我儘力。”
領導:“平時看你活潑誇張,今天說話有所保留;說說看,你有什麼思路?”
小強:“領導,不動資料庫什麼玩笑我都敢開,真刀真槍幹事兒了,不來那些沒用的話。我前段時間看到PostgreSQL9.5有個新特性,可以簡單的匯入外部表格,按模式匯入,我覺得可以嘗試一下。”
領導:“好,去做吧,注意操作謹慎,別粗心。”
小強:“知道了,半個小時內給您回訊息,不論成功還是失敗,都即時彙報給您。”
小強出門後,領導點了一顆煙,靜待平時看起來“不靠譜”的小強。
同時,領導也在想,小強說的方法理論上聽起來確實不錯,不知道放在實踐中如何,他對比了一下兩位員工的方案:
小明的方案:
小強的方案:
小強回到工位上,倒了杯水,心理有一些壓力,儘管自己剛測試過新功能(匯入外部模式),但是心理還是很緊張,因為他覺得要對領導的信任負責任,要對生產系統的穩定運行負責任,這絕對不是平時打打鬧鬧、說說笑笑之類的胡鬧。
他開啟筆記本,深吸了一口氣,謹慎的進行了操作:
1.確定一下新環境的資料庫版本:
-bash-3.2$psql
psql(9.5beta2)
輸入"help"來擷取協助資訊.
postgres=#selectversion();
version
-------------------------------------------------------------------------------------------------------------
PostgreSQL9.5beta2onx86_64-pc-linux-gnu,compiledbygcc(GCC)4.1.220080704(RedHat4.1.2-55),64-bit
(1行記錄)
2.建立基於使用者的模式:
postgres=#\cmusic
您現在已經串連到資料庫"music",使用者"postgres".
postgres=#createschemaericauthorizationeric;
CREATESCHEMA
3.安裝postgres_fdw外掛程式:
music=#createextensionpostgres_fdw;
CREATEEXTENSION
4.建立外部伺服器對象:
music=#createservermusic_fdw_serverforeigndatawrapperpostgres_fdwoptions(host'192.168.1.143',dbname'music',port'5432');
CREATESERVER
5.建立使用者映射對象:
music=#createusermappingforericservermusic_fdw_serveroptions(user'eric',password'gao');
CREATEUSERMAPPING
串連到生產庫看一下生產庫的表資訊:
music=#\cmusiceric
Youarenowconnectedtodatabase"music"asuser"eric".
music=>\d
Listofrelations
Schema|Name|Type|Owner
--------+---------+---------------+----------
eric|summary|table|eric
...
(200rows)
6.遠程匯入整個schema:
music=#importforeignschemaericfromservermusic_fdw_serverintoeric;
IMPORTFOREIGNSCHEMA
7.查看新系統資料表狀態:
music=>\dsummary;
引用的外部表格"eric.summary"
欄位|類型|修飾詞|FDW選項
------+------------------------+--------+----------------------
id|integer||(column_name'id')
info|charactervarying(128)||(column_name'info')
Server:music_fdw_server
FDWOptions:(schema_name'eric',table_name'summary')
8.調整屬主和許可權:
music=#grantselectoneric.summarytoeric;
GRANT
music=#altertableeric.summaryownertoeric;
ALTERTABLE
9.驗證資料量:
music=>selectcount(*)fromsummary;
count
-------
8
(1行記錄)
資料已經匯入到了新的系統中,小強立刻給領導打電話通報。
領導:“不錯,小強,如果上面要求屏蔽掉某些敏感的表或者是只提供基礎資料好實現嗎?”
小強:“沒問題,我給你我的測試報告吧,最近剛做的。”
測試報告:
在源端建立2個新的表:
music=>createtableericgaoIasselect*fromsummary;
SELECT8
music=>createtableericgaoIIasselect*fromsummary;
SELECT8
music=>\d
Listofrelations
Schema|Name|Type|Owner
--------+-----------+---------------+----------
eric|ericgaoi|table|eric
eric|ericgaoii|table|eric
eric|summary|table|eric
(5rows)
排除某個表:
music=>\cmusicpostgres
您現在已經串連到資料庫"music",使用者"postgres".
music=#IMPORTFOREIGNSCHEMAericEXCEPT(summary)FROMSERVERmusic_fdw_serverINTOeric;
IMPORTFOREIGNSCHEMA
查看一下匯入效果:
music=>\d
關聯列表
架構模式|名稱|類型|擁有者
----------+-----------+--------------+----------
eric|ericgaoi|所引用的外表|postgres
eric|ericgaoii|所引用的外表|postgres
(2行記錄)
已經排除表summary。
刪掉目標庫的表,再測試一下包含某個表的用法:
music=>dropforeigntableericgaoi;
DROPFOREIGNTABLE
music=>dropforeigntableericgaoii;
DROPFOREIGNTABLE
這一次僅匯入某些指定的表:
music=#importforeignschemaericlimitto(summary)fromservermusic_fdw_serverintoeric;
IMPORTFOREIGNSCHEMA
music=>\d
關聯列表
架構模式|名稱|類型|擁有者
----------+---------+--------------+----------
eric|summary|所引用的外表|postgres
(1行記錄)
領導:“謝謝你,小強,回去工作吧”
說著,領導撥通了小明的電話,心想還是要維繫好同事關係,多一份人脈,多很多機會,再說小明也是老員工了,剛才對他發火也有些衝動。
小明進了辦公司,領導微笑著,說:“小明,剛才事出緊急,有些急躁,抱歉。”
小明:“領導,沒關係,確實是我技術不精,以後多多學習!”
領導:“剛才小強把表都整過來了,我看查詢有些慢,你給看一下原因。”
小明:“好的領導,我收集一下資訊,完事兒立刻給你彙報!”
小明回到工位執行了幾條命令,收集了一下效能方面的資訊:
在新系統上:
music=>analyzeeric.summary;
ANALYZE
music=>explainanalyzeselect*fromsummary;
QUERYPLAN
----------------------------------------------------------------------------------------------------------
ForeignScanonsummary(cost=100.00..101.24rows=8width=28)(actualtime=4.308..4.319rows=8loops=1)
Planningtime:0.076ms
Executiontime:8.308ms
(3行記錄)
在生產系統的伺服器看:
music=>analyzeeric.summary;
ANALYZE
music=>explainanalyzeselect*fromsummary;
QUERYPLAN
--------------------------------------------------------------------------------------------------
SeqScanonsummary(cost=0.00..1.08rows=8width=28)(actualtime=0.003..0.004rows=8loops=1)
Planningtime:0.108ms
Executiontime:0.023ms
(3rows)
小明把以上資訊提交給了領導,解釋說:”領導,你看收集到的資訊顯示,遠端表查詢起來就是慢,看來這功能還是不靠譜啊,我建議還是用我的方案,導資料,或者可以買第三方軟體進行同步資料,把資料即時同步到本地。”
領導:”小明...老師...公司花錢請你來是讓你給個報告然後告訴老闆要花錢買新產品的嗎?那還用你做啥?同步資料可以用HotStandby,還用第三方軟體?你一個導資料的方案想通吃所有項目?!目前這查詢速度客戶是可以接受的,並不是相對速度慢就是不可以好嗎?!!想要查遠端資料並且提升一下效能可以用物化視圖好嗎?!!!“
小明:”領導,不好意思...物化視圖是...什嗎?“
領導:”滾出去!!!“
外部表格在查詢速度上還是有一定的延遲的,如果在項目中可以接受實際的查詢速度就OK。如果接受不了,可以嘗試使用物化視圖,當然還有很多方案,方法總比困難多~~~
物化視圖在此就不多浪費篇幅了,如果感興趣的話,可參考如下文章,裡面有對物化視圖的效能測試:
http://gaoqiangdba.blog.163.com/blog/static/245970045201510171821363/