Пгсинх
Синхронизация данных из одной базы данных Postgres в другую (подобно pg_dump
/pg_restore
). Разработана для:
Проверено в бою на Instacart.
pgsync — это инструмент командной строки. Для установки выполните:
gem install pgsync
Это даст вам команду pgsync
. Если установка не удалась, возможно, потребуется установить зависимости.
Вы также можете установить его с помощью Homebrew:
brew install pgsync
В каталоге вашего проекта выполните:
pgsync --init
Будет создан файл .pgsync.yml
, который вы можете настроить. Рекомендуется проверить его в системе контроля версий (если он не содержит конфиденциальной информации). Команды pgsync
можно запускать из этого каталога или любого подкаталога.
Сначала убедитесь, что ваша схема настроена в обеих базах данных. Мы рекомендуем использовать инструмент миграции схемы, но pgsync также предоставляет несколько удобных методов. Как только это будет сделано, вы готовы синхронизировать данные.
Синхронизировать таблицы
pgsync
Синхронизировать конкретные таблицы
pgsync table1,table2
Также работает с подстановочными знаками.
pgsync "table*"
Синхронизировать определённые строки (существующие строки перезаписываются)
pgsync products "where store_id = 1"
Можно также сохранить существующие строки.
pgsync products "where store_id = 1" --preserve
Или обрезать их.
pgsync products "where store_id = 1" --truncate
Исключить конкретные таблицы.
pgsync --exclude table1,table2
Добавьте в .pgsync.yml
для исключения по умолчанию.
exclude:
- table1
- table2
Синхронизируйте таблицы из всех схем или конкретных схем (по умолчанию синхронизируется только путь поиска).
pgsync --all-schemas
# или
pgsync --schemas public,other
# или
pgsync public.table1,other.table2
Определите группы в .pgsync.yml
:
groups:
group1:
- table1
- table2
И запустите:
pgsync group1
Группы также можно использовать для синхронизации конкретной записи и связанных записей в других таблицах.
Чтобы получить продукт 123 с его отзывами, последними 10 купонами и магазином, используйте:
groups:
product:
products: "where id = {1}"
reviews: "where product_id = {1}"
coupons: "where product_id = {1} order by created_at desc limit 10"
stores: "where id in (select store_id from products where id = {1})"
Запустите:
pgsync product:123
Синхронизируйте схему перед данными (это уничтожает существующие данные).
pgsync --schema-first
Укажите таблицы.
pgsync table1,table2 --schema-first
Синхронно синхронизируйте схему без данных (это уничтожает существующие данные).
pgsync --schema-only
pgsync не пытается синхронизировать расширения Postgres.
Предотвратите утечку конфиденциальных данных, таких как адреса электронной почты, с удалённого сервера.
Определите правила в .pgsync.yml
:
data_rules:
email: unique_email
last_name: random_letter
birthday: random_date
users.auth_token:
value: secret
visits_count:
statement: "(RANDOM() * 10)::int"
encrypted_*: null
last_name
соответствует всем столбцам с именем last_name
, а users.last_name
— только таблице пользователей. Поддерживаются подстановочные знаки, и применяется первое подходящее правило.
Варианты замены:
unique_email
;unique_phone
;unique_secret
;random_letter
;random_int
;random_date
;random_time
;random_ip
;value
;statement
;null
;untouched
.Правила, начинающиеся с unique_
, требуют, чтобы таблица имела первичный ключ с одним столбцом. unique_phone
требует числовой первичный ключ.
Внешние ключи могут затруднить синхронизацию данных. Три варианта:
Отложить ограничения. Синхронизация данных PostgreSQL: использование pgsync
Вручную укажите порядок таблиц.
Отключите триггеры внешнего ключа, что может незаметно нарушить ссылочную целостность (не рекомендуется).
Чтобы отложить ограничения, используйте:
pgsync --defer-constraints
Чтобы вручную указать порядок таблиц, используйте --jobs 1
, чтобы таблицы синхронизировались по одной.
pgsync table1,table2,table3 --jobs 1
Чтобы отключить триггеры внешних ключей и потенциально нарушить ссылочную целостность, используйте:
pgsync --disable-integrity
Это требует привилегий суперпользователя в базе данных to
. Если вы синхронизируетесь с Amazon RDS (а не от него), используйте роль rds_superuser
. Если синхронизируетесь с Heroku (а не от него), похоже, нет способа отключить целостность.
Отключите пользовательские триггеры с помощью:
pgsync --disable-user-triggers
Пропустите синхронизацию последовательностей с:
pgsync --no-sequences
Для очень больших таблиц только для добавления синхронизируйте их партиями.
pgsync large_table --in-batches
Примечание: для этого требуется, чтобы таблица имела числовой первичный ключ, который увеличивается.
Скрипт возобновит работу с того места, где остановился при повторном запуске, что отлично подходит для заполнения данных.
Всегда проверяйте безопасность вашего соединения при подключении к базе данных через сеть, которой вы не полностью доверяете. Лучший вариант — подключиться через SSH или VPN. Другой вариант — использовать sslmode=verify-full
. Если этого не сделать, ваши учётные данные базы данных могут быть скомпрометированы.
Чтобы случайно не перезаписать производственные данные, по умолчанию местом назначения является localhost
или 127.0.0.1
.
Чтобы использовать другой хост, добавьте to_safe: true
в ваш .pgsync.yml
.
Чтобы работать с несколькими базами данных, выполните:
pgsync --init db2
Это создаст файл .pgsync-db2.yml
, который вы сможете отредактировать. Укажите базу данных в командах с помощью:
pgsync --db db2
Если вы запустите pgsync --init
в проекте Django, миграции будут исключены в .pgsync.yml
.
exclude:
- django_migrations
Если вы запустите pgsync --init
в Heroku-проекте, база данных from
будет установлена в .pgsync.yml
.
from: $(heroku config:get DATABASE_URL)?sslmode=require
Если вы запустите pgsync --init
в Laravel-проекте, миграции будут исключены в .pgsync.yml
.
exclude:
- migrations
Если вы запустите pgsync --init
в Rails-проекте, метаданные Active Record и миграции схемы будут исключены в .pgsync.yml
.
exclude:
- ar_internal_metadata
- schema_migrations
Чтобы просмотреть выполняемый SQL, используйте:
pgsync --debug
Справка
pgsync --help
Версия
pgsync --version
Список таблиц
pgsync --list
Используйте группы, когда это возможно, чтобы воспользоваться преимуществами параллелизма.
Для Ruby-скриптов вам может потребоваться выполнить:
Bundler.with_unbundled_env do
system "pgsync ..."
end
Получите образ Docker с помощью:
docker pull ankane/pgsync
alias pgsync="docker run -ti ankane/pgsync"
Это даст вам команду pgsync
.
При сбое установки ваша система может не иметь Ruby или libpq.
На Mac выполните:
brew install libpq
В Ubuntu выполните:
sudo apt-get install ruby-dev libpq-dev build-essential
Выполните:
gem install pgsync
Чтобы использовать мастер, выполните:
gem install specific_install
gem specific_install https://github.com/ankane/pgsync.git
С Homebrew выполните:
brew upgrade pgsync
С Docker выполните:
docker pull ankane/pgsync
Также ознакомьтесь:
Вдохновлено...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )