---
# System prepended metadata

title: '[Web Squad] Database Dump & Restore'
tags: [' web team', dev team]

---

---
tags: dev team, web team
---

# [Web Squad] Database Dump, Restore & Create

目前官網 backend 有一台 PostgreSQL ([GitHub Repo](https://github.com/pycontw/pycontw-postgresql)) 在跑，為了資料備份或是希望用 production data 做測試，網站組時常會需要執行 DB dump & restore。

此頁面紀錄了將 production DB data 倒進 staging DB 的步驟與對應指令。

**TODO**: DB dump & restore 的自動化方案

## DB Dump

1. ssh 到 production GCE 後，確認 postgres 有在運作
    ```sh
    $ docker ps
    CONTAINER ID   IMAGE            COMMAND                  CREATED       STATUS        PORTS                    NAMES
    ...
    a9b19a775cbb   postgres:11.1    "docker-entrypoint.s…"   6 weeks ago   Up 2 weeks    0.0.0.0:5432->5432/tcp   pycontw-postgresql
    ...
    ```
2. 執行指令將 db data dump 到 `/tmp` 底下
    ```sh
    $ docker exec -it pycontw-postgresql pg_dump -U pycontw pycontw2022 > /tmp/db.dump.`date +%Y%m%d`.sql
    ```
** pycontw2022是db內table name, 不是docker name.

3. 將 DB dump 用任何方式傳到 staging GCE 上，例如用 scp
    ```sh
    scp <username>@<production_host>:/tmp/db.dump.20220509.sql /your/path/db.dump.20220509.sql
    scp /your/path/db.dump.20220509.sql <username>@<staging_host>:/tmp/db.dump.20220509.sql
    ```
    
## DB Restore

1. 進到 postgres container 將當年度 database 資料清除（刪除 db 並重建）
    ```
    $ docker exec -it pycontw-postgresql psql -U <username>                                       
    psql (11.1 (Debian 11.1-3.pgdg90+1))
    Type "help" for help.

    pycontw=# drop database <db_name>;
    DROP DATABASE
    
    pycontw=# create database <db_name>;
    CREATE DATABASE
    
    pycontw=# \q
    ```
2. 將 data dump restore 進當年度 database
    ```sh
    $ docker exec -i pycontw-postgresql psql -U <username> <db_name> < /tmp/db.dump.20220603.sql
    ```
    
## DB Create

1. 執行指令將前年度 db data dump 到 `/tmp` 底下
    ```
    $ docker exec -it pycontw-postgresql pg_dump -U pycontw pycontw2023 > /tmp/db.dump.`date +%Y%m%d`.sql
    ```
2. 檢查db data是否dump成功, 並複製該db data 檔案名 (e.g db.dump.202401xx.sql)
    ```
    $ ls /tmp
    ```
3. 進到 postgres container 建立當年度 database 資料
    ```
    $ docker exec -it pycontw-postgresql psql -U pycontw
    psql (11.1 (Debian 11.1-3.pgdg90+1))
    Type "help" for help.
    
    pycontw=# create database <db_name>;
    CREATE DATABASE
    
    pycontw=# \q
    ```
4. 將前年度db data restore進當年度database
    ```
    $ docker exec -i pycontw-postgresql psql -U pycontw pycontw2024 < /tmp/db.dump.202401xx.sql
    ```

