在這個人人都是駭客的年代,隨便問問ChatGPT、Gemini之類的,就可以輕易地破解別人的電腦!想偷別人的資料?隨便都可以來個SQL Injection。想搞破壞?就直接連進去別人的店腦把資料庫給砍了就對了!這是我前幾天發生的故事,就讓我來娓娓道來⋯⋯
在這個什麼都很簡單的年代,對,我不小心把我電腦資料庫弄爆了。
其實這是可憐蟲浪費了一整天的血汗紀錄。
前情提要一下:
我自己電腦上安裝的PostgreSQL是透過homebrew安裝的,homebrew滿有趣的是,他是可以同時安裝很多版本的PostgreSQL。但我永遠都會忘記到底要打什麼指令才把資料庫打開來,所以常常都是看history翻翻看才想起來。就當我忘記我到底用哪一版、以及指令時,就會一直在那邊切來切去⋯⋯就在這個moment,我不知在耍什麼北爛,我想說把homebrew的postgresql@10刪掉看看好了(?),然後重裝的時候發現homebrew已經把它給disabled掉了,無法直接安裝。
以下嘗試了各種方式:
- 重新透過homebrew安裝postgresql10,因為已經disabled無解。
- 用postgresql@11跑10的資料庫,無解!因為
postgresql/data資料夾內有一個檔案叫做PG_VERSION,檔案內寫得大大的 10,也就是限制了主程式的版本。 - 透過非API的方式安裝:
HOMEBREW_NO_INSTALL_FROM_API=1 brew install postgresql@10,後續一樣跳disabled無法安裝。 - 透過docker執行postgresql:10並將現有的資料夾掛載上去,會跳出權限問題
docker run -d \
--name some-postgres \
-e POSTGRES_PASSWORD=password \
-v /opt/homebrew/var/postgresql@10:/var/lib/postgresql/data \
postgres
- 4.2 修改權限,因為docker預設會建立postgres,跟我本機user不同,所以要改。但改還是不行
- 4.3 修改image成
postgres:10-alpine還是無法執行
sudo chown -R postgres:postgres /opt/homebrew/var/postgresql@10
sudo chmod -R 777 /opt/homebrew/var/postgresql@10
- 5. PostgreSQL官網直接安裝mac dmg,連裝都不能裝。
- 6. PostgreSQL官網直接下載CLI,會一直跳非驗證developer,要一直去Preference同意,但仍然無法執行
pg_ctl指令。 - 6.2. 透過pg_upgrade更新,完全卡死沒在動,出去吃個午餐回來還沒跑完,應該無效
pg_upgrade -d /opt/homebrew/var/postgresql@10 -D /opt/homebrew/var/postgresql -b /Users/kellly/Downloads/pgsql/bin -B /opt/homebrew/opt/postgresql@11/bin
- 6.3 透過
pg_dumpall會出,一樣無法執行。
做到這邊,已經耗費我一整天的時間了⋯⋯最後是怎麼解決的呢?
最終解法是搭配方法4.3以及方法6.3做出:
docker run -d \
--name my-postgres \
-e POSTGRES_HOST_AUTH_METHOD=trust \
-v /opt/homebrew/var/postgresql@10:/var/lib/postgresql10/data \
-p 5432:5432 \
-p 5431:5431 \
postgres:10-alpine
docker exec -it -u postgres my-postgres bash
這邊要注意的是,我並沒有修改docker container預設的data路徑,而是新增了一個postgresql10/data,而且增加了一個5431port,要讓這個postgresql container開啟兩個database server。連入之後要修改設定檔並開啟伺服器:
vi /var/lib/postgresql10/data/postgresql.conf # 修改port = 5431,預設是5432
pg_ctl -D /var/lib/postgresql10/data start # 開啟伺服器
pg_dumpall -h 127.0.0.1 -p 5431 > /var/lib/postgresql10/backup.sql # 把東西倒出來
exit # 離開container
這邊為止,在電腦上 /opt/homebrew/var/postgresql@10 已經有 backup.sql 了,接下來就直接在其他沒資料的的postgresql版本執行以下腳本即可匯入:
psql -f backup.sql postgres
恭喜,恭喜我自己。