PostgreSQL - Как перенести табличное пространство

PostgreSQL - Как перенести табличное пространство

Коллеги всем привет.

В сегодняшней статье мы поговорим о том как можно перенести табличные пространства в другой раздел на сервере в PostgreSQL.

Перенос табличных пространств в другие места может потребоваться по нескольким причинам. Первая причина это то что у вас может закончиться место на диске, и получится так что текущий раздел где у вас лежит табличное пространство расширить средствами Linux не выходит и прийдется временно и на постоянной основе перенести табличное пространство в другой раздел. Вторая причина связана с оптимизацией бизнес процессов самой базы данных. К примеру вы на сервер подключили быстрый SSD диск, и нужно на этот диск перенести табличное пространство в котором находятся таблицы к которым нужен быстрый доступ на чтения и запись.

 

В сегодняшнем примере мы будем переносить табличные пространства по имени inzhener_1 и inzhener_2 из директории /u01/pg_tablespace в /u02/pg_tablespace.

sql> SELECT oid, spcname, pg_tablespace_location(oid) FROM pg_tablespace;

postgresql moving tablespace

Этим запросом мы узнаем где у нас лежат табличные пространства.

 

Содержимое статьи:

  1. Создаем директории.
  2. Назначаем владельца директорий.
  3. Останавливаем базу данных.
  4. Смотрим ссылки.
  5. Перенос табличных пространств.
  6. Удаляем старые ссылки.
  7. Создаем новые ссылки.
  8. Запускам базу данных.
  9. Проверка.
  10. Итоги.

 

1. Создаем директории.

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

$. mkdir -p /u02/pg_tablespace/inzhener_1

$. mkdir -p /u02/pg_tablespace/inzhener_2


 

2. Назначаем владельца директорий.

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

$. chown -R postgres:postgres /u02/pg_tablespace/inzhener_1

$. chown -R postgres:postgres /u02/pg_tablespace/inzhener_2


 

3. Останавливаем базу данных.

Перед переносом табличных пространств обязательно нужно остановить базу данных.

$. pg_ctl stop


 

4. Смотрим ссылки.

Все ссылки в базе данных PostgreSQL которые связаны с табличными пространствами находятся в директории $PGDATA/pg_tblspc, в моем случаи полный путь /app/postgresql/15/pg_dbcluster_1/data/pg_tblspc.

$. ls -l /app/postgresql/15/pg_dbcluster_1/data/pg_tblspc

postgresql moving tablespace

Ссылки 16405 и 16406 и пути до директорий нам нужно запомнить или записать куда-нибудь, так как после переноса табличных пространств мы будем их переназначать с такими же именами. ЭТО ВАЖНО!


 

5. Перенос табличных пространств.

Теперь настала очередь на перенос наших табличных пространств в наши новые директории. Для того чтобы это сделать мы будем использовать команду Linux - cp.

$. cp -r /u01/pg_tablespace/inzhener_1/* /u02/pg_tablespace/inzhener_1

$. cp -r /u01/pg_tablespace/inzhener_2/* /u02/pg_tablespace/inzhener_2


 

6. Удаляем старые ссылки.

Теперь нам нужно удалить старые ссылки.

$. rm 16405

$. rm 16406


 

7. Создаем новые ссылки.

Теперь вместо старых ссылок нам нужно создать новые с указанием на новые директории которые мы создали и туда перенесли табличные пространства.

$. ln -s /u02/pg_tablespace/inzhener_1 16405

$. ln -s /u02/pg_tablespace/inzhener_2 16406

Проверка.

$. ls -l /app/postgresql/15/pg_dbcluster_1/data/pg_tblspc

postgresql moving tablespace


 

8. Запускаем базу данных.

$. pg_ctl start


 

9. Проверка.

После того как мы все сделали, подключаемся к базе данных и выполним запрос на просмотр всех табличных пространств.

sql> SELECT oid, spcname, pg_tablespace_location(oid) FROM pg_tablespace;

postgresql moving tablespace

Как видим на скриншоте в результате директория с /u01 успешно поменялась на /u02, а значить мы все сделали правильно.


 

10. Итоги.

В итоги коллеги мы сегодня успешно проделали такую операцию как перенос табличных пространств в другую директорию, и после того как мы все сделали и проверили, то теперь можно старую директорию с табличными пространствами удалять.


 

Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.

 

ПОХОЖИЕ СТАТЬИ

PostgreSQL Ошибка: requested wal segment has already been removed
PostgreSQL Ошибка: requested wal segment has already been removed
POSTGRESQL
PostgreSQL: Как включить контрольные суммы данных - pg_checksums
PostgreSQL: Как включить контрольные суммы данных - pg_checksums
POSTGRESQL
Postgresql - Список пользователей
Postgresql - Список пользователей
POSTGRESQL