1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-pgsync

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Пгсинх

Синхронизация данных из одной базы данных 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 требует числовой первичный ключ.

Внешние ключи

Внешние ключи могут затруднить синхронизацию данных. Три варианта:

  1. Отложить ограничения. Синхронизация данных PostgreSQL: использование pgsync

  2. Вручную укажите порядок таблиц.

  3. Отключите триггеры внешнего ключа, что может незаметно нарушить ссылочную целостность (не рекомендуется).

Чтобы отложить ограничения, используйте:

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

Интеграции

Django

Если вы запустите pgsync --init в проекте Django, миграции будут исключены в .pgsync.yml.

exclude:
  - django_migrations

Heroku

Если вы запустите pgsync --init в Heroku-проекте, база данных from будет установлена в .pgsync.yml.

from: $(heroku config:get DATABASE_URL)?sslmode=require

Laravel

Если вы запустите pgsync --init в Laravel-проекте, миграции будут исключены в .pgsync.yml.

exclude:
  - migrations

Rails

Если вы запустите 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 с помощью:

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

Связанные проекты

Также ознакомьтесь:

  • Dexter — автоматический индексатор для Postgres.
  • PgHero — панель мониторинга производительности для Postgres.
  • pgslice — разделение Postgres стало проще простого.

Спасибо

Вдохновлено...

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

pgsync — инструмент для синхронизации данных в базах данных PostgreSQL. Преимущество: скорость — в четыре раза быстрее, чем у традиционных инструментов на 4-ядерном компьютере. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-pgsync.git
git@api.gitlife.ru:oschina-mirror/mirrors-pgsync.git
oschina-mirror
mirrors-pgsync
mirrors-pgsync
master