質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

1451閲覧

PSQLでserial型のカラムを含んだ場合のバックアップ方法

python_heroku

総合スコア22

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2022/07/31 22:15

前提

PSQLをDBとして利用し、PythonでDBの中身を更新したり、削除したり、追加したりしています。

実現したいこと

障害発生時に早期復旧できるようにバックアップ設定を実施したく思っています。
方法としては別環境にPSQL DBを作成し、そこにミラーでデータを入れておき、いつでも復旧作業が可能なようにしたく思っています。

発生している問題

バックアップを利用したいPSQLのテーブルでserialの型を利用した列を入れています。この列を入れているが故にバックアップ作業を実施時に新規で作成し直したテーブルでserial型の列にデータが入れられません。
何か方法はないのか?と思って検討中となります。

ちなみにserial型の列については値は並び順であることを保証できないため、カウントアップを●から始める、などでは対応できないことは確認しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

方法としては別環境にPSQL DBを作成し、そこにミラーでデータを入れておき、いつでも復旧作業が可能なようにしたく思っています。

バックアップを利用したいPSQLのテーブルでserialの型を利用した列を入れています。この列を入れているが故にバックアップ作業を実施時に新規で作成し直したテーブルでserial型の列にデータが入れられません。

serial型でも値の代入は可能です。バックアップなのに新たに採番しているのしょうか?
質問内容的に、特定のテーブルの複製を作成されているような事でしたら、
トリガーで編修理履歴のテーブルを作成するようにした方が簡単だと思います。
※その際、履歴のテーブルではserial型に対比される項目はintegerとしておきます。

投稿2022/08/01 01:02

編集2022/08/01 04:13
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/08/01 01:11

バックアップって、そっちかぁ、、
python_heroku

2022/08/03 20:24

回答ありがとうございます。 トリガーで編集履歴のテーブルを作成する、という方法は全然知らなかったので学習してみたいと思います!
guest

0

ベストアンサー

ver.13のドキュメントから:
pg_dump
を使えばテーブルと、テーブルに関連するインデックスやシーケンスもまとめてバックアップが取れますけれど。
pg_dumpのオプションで、
-a を使うと「データのみをダンプし、スキーマ(データ定義)はダンプしません。 テーブルデータ、ラージオブジェクト、シーケンス値がダンプされます。」
このとき(でも)、シーケンス値の次回値も更新するようなSQL文でダンプしてくれます。

serial型って、
8.1. 数値データ型

CREATE TABLE tablename (
colname SERIAL
);

CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

が同じってくらい、シーケンスのオーナーがそのテーブルのカラムになっているだけのinteger型なので、
テーブルの値だけを例えばCOPY文などで復元しているのだとしたら、
最後に次回値を上書きすればいいです。
9.17. シーケンス操作関数
で紹介されている setval() を使って次回値を上書きできます。

投稿2022/08/01 00:13

編集2022/08/01 00:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python_heroku

2022/08/03 20:23

しばらくログインできず、返信遅れて失礼しました。 こちらありがとうございます。シーケンス操作関数があるのは全然知りませんでした。こちらを利用するか、大人しくpg_dumpで対応しようかなと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問