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;
Этим запросом мы узнаем где у нас лежат табличные пространства.
Содержимое статьи:
- Создаем директории.
- Назначаем владельца директорий.
- Останавливаем базу данных.
- Смотрим ссылки.
- Перенос табличных пространств.
- Удаляем старые ссылки.
- Создаем новые ссылки.
- Запускам базу данных.
- Проверка.
- Итоги.
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
Ссылки 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
8. Запускаем базу данных.
$. pg_ctl start
9. Проверка.
После того как мы все сделали, подключаемся к базе данных и выполним запрос на просмотр всех табличных пространств.
sql> SELECT oid, spcname, pg_tablespace_location(oid) FROM pg_tablespace;
Как видим на скриншоте в результате директория с /u01 успешно поменялась на /u02, а значить мы все сделали правильно.
10. Итоги.
В итоги коллеги мы сегодня успешно проделали такую операцию как перенос табличных пространств в другую директорию, и после того как мы все сделали и проверили, то теперь можно старую директорию с табличными пространствами удалять.
Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.