PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了


PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了


小菜今天第一天上班,開發的繆牛要小菜將開發的庫導入到生產,晚上應用要上線。之前小菜也是有用過的PG的,但基本上都是在自己的測試機上做一些“高大上”的東西。導庫這樣的事情,其實小菜是不大願意幹的,換句話沒有技術含量。

很快小菜將測試庫的表都弄到了生產庫,但是繆牛馬上就打電話,告訴小菜不對,問小菜怎麼做的,小菜說就 dump restore 呀,繆牛問怎麼在生產上看到了其他測試庫,怎麼搞得。

我們看看小菜怎麼做的

在源庫

pg_dumpall -f databaseall.out

在目的

psql -f databaseall.out

繆牛看完後怒懟,你問問你們組的老鳥行不行,瞎搞。

小菜找到老鳥問,您說說我哪裡錯了,不就是複製整體的測試庫然後到生產不就完了。

老鳥答道:你看,首先開發要的是dvdrental庫,你卻把所有的庫都備份了,另外PG的庫中大多都有一些extension,而你看下面你恢復庫時的報錯,部分插件在生產中是沒有被設置的,你就直接做,人家那樣懟你已經很客氣了。

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

老鳥繼續說道,下次你先問清楚,到底要那個庫,並且看看你的測試庫和生產庫之間的extension 有什麼區別,並且不要隨意用 pg_dumpall 這個命令來進行測試到生產的操作,測試裡面的庫太多,都複製到單個項目的生產庫,這樣可不行。

那怎麼看數據庫裡面的extension呢,同時要注意PG裡面cluster 中每個庫的extension都可能不一樣,所以 select extname,extowner,extnamespace,extrelocatable,extversion from pg_extension;

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

如果發現測試庫裡面的extension 在生產庫沒有,首先你先要將這兩方的extension 對齊再說後面的。

再說備份,你備份其實使用pg_dump就可以了

你按照我的這個命令來備份

pg_dump -Fc -f dvdrental.out --no-tablespace --encoding=utf8 --clean --no-owner --dbname=dvdrental --disable-triggers

在目的庫上恢復

pg_restore dvdrental.out --dbname='dvdrental' --no-owner -c --if-exists -Fc

當然如果是生產庫上已經存在了這個數據庫,就不能這樣做了,這樣做也是要惹禍的。

為什麼要去掉 owner呢,小菜問。“你能確認開發庫商的用戶在生產上存在嗎?並且生產還要使用這個用戶”老鳥已經開始不高興了。

所以僅僅恢復最純淨的東西就可以了,至於用戶的賬戶怎麼做,看開發的執行文檔,根據需要建立就可以了。

過了有半個小時,繆牛又來了,直接問老鳥,現在更糟糕了,生產數據都亂了。

原來是,在老鳥告訴他怎麼做以後,已經正常了,後來由於部分調試原因,測試的表的字段有相關的改變,開發要求,更新原來的表結構,但小菜又將上面的命令做了一遍,現在已經有生產數據進去了,開發很不高興。

因為業務部門投訴說,系統裡面有亂數據,責問這是怎麼回事?


其實最簡單的操作方法

1 將原來的生產庫導入的庫整體刪除

2 創建新的生產庫

3 將表結構備份在導入就可以了

pg_dump -Fc -f dvdrental.out --no-tablespace --encoding=utf8 --clean --no-owner --dbname=dvdrental --disable-triggers --schema-only

pg_restore dvdrental.out --dbname='dvdrental' --no-owner -c --if-exists -Fc

小菜一上午被投訴了2次,心情估計是好不了。

下午開發又投訴小菜,說讓他建立一個數據庫一個多小時建不出來,嚴重影響他們的開發任務,已經被投訴到運維總監哪裡。

老鳥問,到底怎麼回事,小菜委屈給老鳥看,你看不是我不建,建不上呀。

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了


那你這樣不就行了,如圖效果:

select datname,usename,application_name,client_addr,client_hostname,backend_start from pg_stat_activity where datname = 'template1';

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

SELECT pg_terminate_backend(2269);

“”這樣不就能查看到到底誰在打開 templet1 不關閉了嗎?”老鳥有點生氣的說,“下次不會多問問,別在那憋寶,弄得總監還以為我們排擠你了。”

小菜不好意思,好好下次一定問哈

快到下班的時候,小菜再次被投訴,因為生產中發生了一個事故,雖然和小菜沒有直接的關係,但是也有間接關係。事情是新來了一個開發,在程序打包的時候,將一條 drop table 的語句誤打包到了執行文件中,而這個表已經在業務系統上運行了,並且還有不到300萬的數據。被投訴的理由,小菜分配的權限不對,開發死死咬住,如果運維部不給出執行 DDL 的權限,也不會發生這樣的事情,運維總監也很為難,的確當規範中明確的標識,在生產中的應用賬戶不能擁有DDL數據庫權限。

小菜是怎麼給賬戶賦予權限的呢?

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

老鳥無奈的說,你怎麼不問問呢,公司有規定的(小菜小聲的說給了權限能用不就好了),賦予應用賬戶的權限,只能賦予DML 權限和存儲過程,或函數的運行權限賦予,其他的都不能做。

當然你也要確認應用所處的schema

grant select,update,delete,insert on all tables IN schema public to app_financial;


PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

在建立這些權限後,需要核實相關的權限

select * from information_schema.table_privileges where grantee= 'app_financial';

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

select * from information_schema.routine_privileges where grantee= 'app_financial';

PostgreSql 邊邊角角搞死你,步步操作都引起業務投訴,醉了

select * from information_schema.usage_privileges where grantee='app_financial';

檢查相關的權限的賦予的情況。

小菜無奈的說,哎早知道問問了,一會HR 吧小菜叫到辦公室。轉天就再也沒有看到小菜的身影。

以上內容,是否對你有幫助呢?工作久了,遇到的事情多了,不僅感觸,高大上的東西要懂,你手邊的活也不能差,否則西瓜,芝麻都沒有。

以上內容由東方瑞通“深藏功與名的劉老師”供稿,13年專業DBA經驗,曾任互聯網金融公司Senior DBA、500強制藥企業Senior DBA,精通Mysql、PostgreSQL、Mongo DB、SQLServer。


分享到:


相關文章: