Создание дампа базы данных для конкретных таблиц и записей Postgres

94

У меня есть база данных с сотнями таблиц, и мне нужно экспортировать указанные таблицы и вставить операторы для данных в один файл sql.

Единственное, что я знаю, может достичь этого:

pg_dump -D -a -t zones_seq interway > /tmp/zones_seq.sql

Должен ли я запускать этот оператор для каждой таблицы или есть способ запустить аналогичный оператор для экспорта всех выбранных таблиц в один большой sql big. Приведенный выше pg_dump не экспортирует только вставки схемы таблицы, мне нужны оба

Любая помощь будет оценена по достоинству.

Элитмиар
источник

Ответы:

160

Прямо из руководства : « Несколько таблиц можно выбрать, написав несколько ключей -t »

Итак, вам нужно перечислить все свои таблицы

pg_dump --column-inserts -a -t zones_seq -t interway -t table_3 ... > /tmp/zones_seq.sql  

Обратите внимание, что если у вас есть несколько таблиц с одинаковым префиксом (или суффиксом), вы также можете использовать подстановочные знаки, чтобы выбрать их с помощью -tпараметра:

" Кроме того, параметр таблицы интерпретируется как шаблон в соответствии с теми же правилами, которые используются командами psql \ d "

a_horse_with_no_name
источник
20
ключ -T такой же, но используется для исключения таблиц. Может быть полезно, если вам нужны все, кроме одного или двух столов и т. Д.
Скотт Марлоу
4
Эта -Dопция, кажется, исчезла в PG 9.1 и
новее
5
-DВариант был удален в версии 8.4 . --column-insertsВместо этого вы должны использовать сейчас.
mlovic
1
Попробуйте pg_dump --host 127.0.0.1 --port 5432 --username "<username>" --column-Insert --verbose --file "/ tmp / <filename.sql>" --table "^ <regex> * "" <tablename> "
Таринду Джаясурия
22

Если эти конкретные таблицы соответствуют определенному регулярному выражению, вы можете использовать параметр регулярного выражения в -t в pg_dump.

pg_dump -D -a -t zones_seq -t interway -t "<regex>" -f /tmp/zones_seq.sql <DBNAME>

Например, чтобы вывести таблицы, которые начинались с "test", вы можете использовать

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>
Йотикант
источник
3
если это было регулярное выражение, разве не должно быть ^test.*вместо ^test*?
msrd0
5
Это не регулярное выражение, оно использует "шаблоны" postgres, так что это действительно должно быть "test*": postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
elliotcm
Нетривиально использовать регулярное выражение, генерирующее недопустимое регулярное выражение: недопустимая ошибка операнда квантификатора . Но регулярное выражение правильное ... Действительны только очень простые регулярные выражения
Питер Краусс