Управление внешними ключами при использовании pg_restore с несколькими дампами - PullRequest
0 голосов
/ 17 января 2019

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

Моя идея для этого состояла в том, чтобы запустить команду для сброса базы данных всякий раз, когда мы запускаем миграцию или решаем, что для локальной разработки необходим новый аккаунт. Проблема в том, что дамп базы данных составляет около 17 МБ. Я пытаюсь избежать необходимости добавлять 17-мегабайтный файл в GitHub при каждом обновлении базы данных.

Таким образом, лучшее решение, которое я мог придумать, - это настроить скрипт для выгрузки каждой отдельной таблицы в базу данных. Таким образом, если обновляется отдельная таблица, мы будем отправлять эту резервную копию только на GitHub, и она будет больше в файле ~ 200 КБ, а не в 17 МБ.

Основная проблема, с которой я сталкиваюсь, это попытка восстановить базу данных. С полным дампом обработка внешних ключей является относительно простой, поскольку все это делается одной командой восстановления. Но с многократным восстановлением все становится немного сложнее.

Я ищу способ восстановить все таблицы в базе данных, игнорируя триггеры и ограничения, а затем снова включая их после заполнения данных. (или найдите способ экспортировать таблицы на основе порядка определения внешних ключей). Есть много таблиц, с которыми можно работать, поэтому выполнение этого вручную было бы сложной задачей.

Меня также беспокоит реляционная целостность базы данных, если я отключил / повторно включил ограничения. Любая помощь или совет будут оценены.

Сейчас я запускаю следующее для каждой таблицы:

pg_dump postgres://user:password@pg:5432/database -t table_name -Fc -Z9 -f /data/www/database/data/table_name.bak

А затем эта команда для восстановления всех резервных копий в БД.

$data_command = "pg_restore --disable-triggers -d $dbUrl -Fc \"%s\"";
$backups = glob("$directory*.bak");
    foreach($backups as $data_file){
        if($data_file != 'data_roles.bak') {
            exec(sprintf($data_command, $data_file));
        }
    }

Это явно не работает, так как я столкнулся с кучей ошибок "Отношения не существует". Я думаю, я просто ищу лучший способ сделать это.

1 Ответ

0 голосов
/ 17 января 2019

Я бы разделил данные таблицы и метаданные базы данных.

Создайте фрагмент до и после данных с помощью

pg_dump --section=pre-data -f pre.sql mydb
pg_dump --section=post-data -f post.sql mydb

Затем выведите только данные для каждой таблицы:

pg_dump --section=data --table=tab1 -f tab1.sql mydb

Чтобы восстановить базу данных, сначала восстановите pre.sql, затем все данные таблицы, затем post.sql.

Предварительные и последующие данные часто меняются, но они невелики, так что это не должно быть проблемой.

...