PostgreSQL: покращення продуктивності pg_dump, pg_restore


80

На початку я використовував pg_dumpзвичайний формат за замовчуванням. Я був непросвітлений.

Дослідження показали мені покращення часу та розміру файлу за допомогою pg_dump -Fc | gzip -9 -c > dumpfile.gz. Я був просвітлений.

Коли прийшов час створювати базу даних заново,

# create tablespace dbname location '/SAN/dbname';
# create database dbname tablespace dbname;
# alter database dbname set temp_tablespaces = dbname;

% gunzip dumpfile.gz              # to evaluate restore time without a piped uncompression
% pg_restore -d dbname dumpfile   # into a new, empty database defined above

Я відчував себе непросвітленим: відновлення зайняло 12 годин, щоб створити базу даних, яка є лише часткою того, чим вона стане:

# select pg_size_pretty(pg_database_size('dbname'));
47 GB

Оскільки передбачається, що ця база даних складатиме кілька терабайт, мені зараз потрібно поглянути на підвищення продуктивності.

Будь ласка, просвіти мене.

Відповіді:


59

Спочатку перевірте, чи отримуєте ви розумну продуктивність вводу-виводу за допомогою налаштування диска. Потім переконайтесь, що установка PostgreSQL налаштована належним чином. Зокрема, shared_buffersслід правильно встановити, maintenance_work_memзбільшити під час відновлення, full_page_writesвимкнути під час відновлення, wal_buffersзбільшити до 16 МБ під час відновлення, checkpoint_segmentsзбільшити до приблизно 16 під час відновлення, у вас не повинно бути необгрунтованого входу (як реєстрація кожного виконаного оператора), auto_vacuumслід відключити під час відновлення.

Якщо ви використовуєте 8.4, а також експериментуйте з паралельним відновленням, параметр --jobs для pg_restore.


Якщо у вас підключений ведений пристрій, і навантаження на ведучий вже є значним, тоді ви можете замість цього просто зробити резервну копію на підпорядкованому пристрої. Тим більше, що підлеглий пристрій доступний лише для читання, я думаю, це також може допомогти певною мірою. У великому кластері може допомогти наявність одного або декількох ведених, призначених для розподілених резервних копій, якщо резервне копіювання займає багато часу. Щоб ви нічого не пропустили, ви хотіли б, щоб ці режими очікування були підключені за допомогою потокової реплікації, щоб вони записувались із WAL на майстер.
StartupGuy

13
shared_buffers should be set correctlyщо це означає?
Хуан Карлос Оропеза

1
@JuanCarlosOropeza - Я натрапив на такий документ, shared_buffersякий може бути корисним.
Дарра Енрайт,

25

Покращити дамп та відновлення pg

PG_DUMP | завжди використовуйте каталог-формат і -jпараметри

time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external

PG_RESTORE | завжди використовуйте налаштування для postgres.conf і format-directory і -joptions

work_mem = 32MB
shared_buffers = 4GB
maintenance_work_mem = 2GB
full_page_writes = off
autovacuum = off
wal_buffers = -1

time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/

1
використовувані тут параметри конфігурації значно покращили продуктивність
ramnar

3
Посилання розірвано
Хамед

Оце Так! Це мені так допомогло! Дякую!
stasdeep

14

Два питання / ідеї:

  1. Вказавши -Fc, вихід pg_dump вже стискається. Стиснення не є максимальним, тому ви можете знайти певну економію місця за допомогою "gzip -9", але я б поклався на пари, що цього недостатньо, щоб гарантувати додатковий час (і введення / виведення), який використовується для стиснення та розтискання версії резервної копії -Fc .

  2. Якщо ви використовуєте PostgreSQL 8.4.x, ви можете потенційно прискорити відновлення за допомогою резервної копії -Fc за допомогою нової опції командного рядка pg_restore "-j n", де n = кількість паралельних з'єднань для відновлення. Це дозволить pg_restore завантажувати більше даних однієї таблиці або генерувати більше одного індексу одночасно.


На даний момент ми на 8.3; нова причина оновлення.
Джо Крейтон,

Ви можете використовувати версію 8.4 pg_restore з версією 8.3 сервера. Просто переконайтеся, що ви використовуєте pg_dump з 8.3.
Magnus Hagander

Бах. Ми застрягли на 8.3, оскільки використовуємо встановлення Postgres із пакетом Solaris10, і "на даний момент не планується інтегрувати PG8.4 у S10". [Посилання mail-archive.com/pgsql-general@postgresql.org/msg136829.html] Мені довелося б взяти на себе завдання встановлення та обслуговування postgres з відкритим кодом. Не впевнений, чи зможемо ми це зробити тут ... Фе.
Джо Крейтон,

10

Припускаю, вам потрібна резервна копія, а не серйозне оновлення бази даних.

Для резервного копіювання великих баз даних замість цього слід налаштувати безперервне архівуванняpg_dump .

  1. Налаштуйте архівування WAL .

  2. Робіть базові резервні копії, наприклад, щодня, використовуючи
    psql template1 -c "select pg_start_backup('`date +% F-% T``))" rsync -a --delete / var / lib / pgsql / data / / var / backups / pgsql / base / psql template1 - c "виберіть pg_stop_backup ()" `

Відновлення було б таким же простим, як відновлення журналів бази даних та WAL, не старших за pg_start_backupчас, з місця резервного копіювання та запуску Postgres. І це буде набагато швидше.


1
Ми не розглядали PITR (архівування WAL), оскільки система не дуже важка для транзакцій, але замість неї буде зберігати багато історичних записів. Однак тепер, коли я замислююся над цим, більш "додаткове" резервне копіювання може допомогти питанням. Я розслідую. Дякую.
Джо Крейтон,

7
zcat dumpfile.gz | pg_restore -d db_name

Видаляє повний запис нестиснених даних на диск, який на сьогодні є вашим вузьким місцем.


3

Як ви, можливо, здогадалися просто з того факту, що стиснення резервної копії призводить до швидшої продуктивності, ваша резервна копія пов’язана з операціями вводу-виводу. Це не повинно дивувати, оскільки резервне копіювання майже завжди буде пов'язане з введенням / виведенням. Стискання даних обмінює навантаження вводу-виводу для завантаження процесора, а оскільки більшість процесорів простоюють під час передачі даних монстра, стиснення виходить як чистий виграш.

Отже, щоб пришвидшити час резервного копіювання / відновлення, вам потрібно швидше введення-виведення. Окрім реорганізації бази даних, щоб вона не була єдиним величезним екземпляром, це майже все, що ви можете зробити.


Якщо оптимізувати лише час pg_dump, паралельний дамп починаючи з версії 9.3, стиснення> 0 може сильно зашкодити! Це пов’язано з тим, що процеси pg_dump та postmaster вже досить затягують центральний процесор, що додавання стиснення> = 1 робить загальне завдання суттєво прив’язаним до процесора замість зв’язку вводу-виводу. В основному, старше припущення про те, що центральні процесори простоюють без стиснення, є недійсним при паралельному дампінгу.
Проникність
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.