PostgreSql 邊邊角角也能搞死你 之 小菜的一天

  • 2019 年 11 月 13 日
  • 筆記

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

我們看看小菜怎麼做的

在源庫

pg_dumpall -f databaseall.out

在目的

psql -f databaseall.out

繆牛看完後兌到,你問問你們組的老鳥行不行,別在瞎搞了, 小菜找到老鳥問,您說說我哪裡錯了,不就是複製整體的測試庫然後到生產不就完了,他們說我瞎搞。

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

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

那怎麼看資料庫裡面的extension呢,同時要注意PG裡面cluster 中每個庫的extension都可能不一樣,所以

select extname,extowner,extnamespace,extrelocatable,extversion from pg_extension;

如果發現測試庫裡面的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次,心情估計是好不了。

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

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

那你這樣不就行了

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

SELECT pg_terminate_backend(2269);

這樣不就能查看到到底誰在打開 templet1 不關閉了嗎?,看上面的圖,這個庫不就建立上了嗎?

老鳥有點生氣的說,下次不會多問問,別在那憋寶,弄得總監還以為我們排擠你了。

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

快到下班的時候,小菜再次被投訴,因為生產中發生了一個事故,雖然和小菜沒有直接的關係。

事情是新來了一個開發,在程式打包的時候,將一條 drop table 的語句誤打包到了執行文件中,而這個表已經在業務系統上運行了,並且還有不到300萬的數據。被投訴的理由,小菜分配的許可權不對,開發死死咬住,如果運維部不給出執行 DDL 的許可權,也不會發生這樣的事情,運維總監也很為難,的確當初的規範中明確的標識,在生產中的應用賬戶不能擁有DDL資料庫許可權。

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

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

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

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

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

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

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

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

檢查相關的許可權的賦予的情況。

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

故事純屬瞎編亂造,如有雷同,和我無關,另外最近一些事情給我的感觸是高大上的東西要懂,你手邊的活也不能差,否則西瓜,芝麻都沒有。