Перенос postgresql на другой диск centos
Не простая операция, если вы не имели опыта настройки / работы с postgresql до сих пор. Расскажу поэтапно как выгрузить дамп базы, и как затем этот дамп загрузить в нужном месте.
Базы mySQL я иногда экспортирую не с помощью скрипта, а копирую файлы данных. В каталоге, где они хранятся, название подкаталогов — это имена баз, а каждая таблица состоит из 2-3 файлов, с именем как у самой таблицы. Копирование сработает, если основные версии серверов совпадает. В случае postgresql подобный фокус не работает. Вы можете подсмотреть папку с базами данных в конфигурации, вам поможет вот такая команда:
В примере папка с базами: -D /var/lib/postgresql/9.3/main. Названия таблиц и баз вы здесь не увидите в явном виде. Копирование файлов будет бесполезно.
Самый главный админ
Первое, что надо усвоить — операции с postgresql удобно выполнять с правами postgresql же суперадмина. На юзера root PSQL чихал и не признает его авторитета. По умолчанию, супер-юзер имеет имя postgres.
Переходим под эту учетку.
Посмотреть список баз данных
Чтобы узнать какие базы у вас есть в наличии можно использовать команду:
В консоль будет выведен список баз данных, информация о владельце каждой базы, привилегиях. Если вы и так знаете название базы данных, и вас есть реквизиты доступа к ней (взятые, к примеру, в настройках подключения вашего сайта или программы), то знакомство со списком баз можно пропустить.
Получение дампа базы postgresql
Для создания дампа базы служит команда pg_dump. Мы направим её вывод в файл через gzip.
Здесь:
myDBname — это название базы данных, а myDB-filedump.gz — название файла, куда будет сохранен дамп.
Расшифровка ключей:
-h [host] : явное указание хоста, значение по умолчанию localhost или значение из переменной окружения PGHOST.
-О : пропускает команды для установки владельца таблиц, видов и т.д.
-F — формат вывода данных custom, tar, plane text.
-U [username] — пользователь, чьими правами доступа нужно воспользоваться при запросе данных. По умолчанию берется текущий пользователь. При необходимости программа запросит пароль.
-C, —create — добавляет команду для создания БД, я покажу как создать её вручную.
-c — добавляет команды для удаления (drop) объектов (таблиц, видов и т.д.).
Есть и более мощная команда, которая выгружает сразу все базы:
Есть 2 диска sda и sdb.
Всё лежит на sda.
Каталог /var/lib/pgsql/10/data я хочу оставить как есть. Каталог /var/lib/pgsql/10/backups я хочу перенести на диск sdb.
Создаете на /dev/sdb раздел, файловую систему вот это все.
после монтируете временyо скажем в /mnt/transfer , переносите туда свои бэкапы (содержимое /var/lib/pgsql/10/backups). После переноса исходную папку очищаете.
Отмонтируете /mnt/transfer и монтируете к /var/lib/pgsql/10/backups. Прописываете эту точку монтирования в /etc/fstsb , проверяете права доступа, должны соответствовать тому что было.
Дмитрий,
Мне не понятно почему у меня каталог /var/lib/pgsql/10/backups лезет в /home и обратно.
То есть я сделал mount:
sudo mount /dev/sdb1 /var/lib/pgsql/10/backup
Далее blkid для добавления в /etc/fstab:
далее cat /etc/fstab:
Затем в конце nano добавил в /etc/fstab:
Поменял права с root на postgres:
Далее делаю бэкап:
pg_dump -U postgres -F c -f test.backup testbase
Результат почему-то нахожу в каталоге /home/user, test.backup создается в этом каталоге.
Пробую тогда:
Да теперь результат в /var/lib/pgsql/10/backups
Далее смотрю каталог backups:
sudo ls -la /var/lib/pgsql/10/backups
Результат у меня почему-то кроме бэкапа есть каталоги из /home, вывод:
Работаю я из под user.
То есть у меня два момента проблемных:
- Почему у меня test.backup ложится в нужный каталог /var/lib/pgsql/10/backups только если указать полный путь, иначе ложится в /home/user из под которого проверяю?
- Почему у меня данные из /home и из /var/lib/pgsql/10/backups дублируются или они вложены как-то друг в друга? Тут у меня возможно сломанное мышление, так как виндовый админ. Я предпологаю что /dev/sdb1 это аналогичный D:\ на винде, а /home и /var/lib/pgsql/10/backups каталоги на нем.
Почему у вас /home и /dev/sdb1 имеют одинаковый id ?
Получается что вас уже home расположен на этом устройстве? верно?
В первоначальном сценарии про это не было ни слова.
Тогда проблему надо решать иначе.
Например в /home сделать каталог backup и тогда самый простой способ сделать симлинк с
/var/lib/pgsql/10/backups в /home/backups , либо , красивее -
Не понял?
UUID это же к устройству sdb1 относится? То есть насколько я понял в /etc/fstab запись говорит что /home лежит на диске /dev/sdb1 правильно? По аналогии сделал для /var/lib/pgsql/10/backups, то есть на раздел диска с UUID от /dev/sdb1 указал положить /var/lib/pgsql/10/backups. Или я не допонимаю чего-то?
Получается что вас уже home расположен на этом устройстве? верно?
В первоначальном сценарии про это не было ни слова.
Например в /home сделать каталог backup и тогда самый простой способ сделать симлинк с
/var/lib/pgsql/10/backups в /home/backups , либо , красивее -
mount --bind /home/backup /var/lib/pgsql/10/backups
Дмитрий,
А как сделать тогда отдельный раздел? sdb1 у меня занимает весь объем на sdb, я хочу тогда отщипнуть от него 500GB и ложить бэкапы на него. Проблема в том что на sdb1 уже /home и при попытке umount /home: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
через lsof /dev/sdb1 вижу много чего занятого:
Службу 1c я то могу выключить, но себя /home/user я не смогу потушить я на удаленном сервере выполняю всё это.
присоединяюсь к ответу Дмитрия, с уточнением по поводу SELinux, ибо если он включен, то выставите правильные права, иначе пользователь postgres не сможет записать в указанный каталог данные.
Подскажите может кто сталкивался.
Как перенести рабочие каталоги базы postgres на новый сервер с установленной точно таком железе и версией postgres 9.4
Бекапов к сожалению нет
Вариант подмены каталога /base не работает.
Вариант создать базу с этим же именем и заменить файлы старой базой, не работает.
Бекапы к сожалению делались с ошибкой.. поэтому только рабочие каталоги postgres-а
/base
/logs
Крутится все на Linux Centos
Благодарю за любую наводку, еще лучше решение, возможно на платной основе. Срочно нужно решить вопрос.
Если версии и расположение СУБД одинаковые - переноса каталога $PGDATA и всех tablespace`ов должно быть достаточно. Что в логах при попытке запуска?
Да. Одинаковые
Скорей всего я что то делаю не так:
Переносил только один каталог самой базы, так как при инициализации постгрес создал свои базы (постгре патченый от 1С)
Инициализацию делал вот так
/usr/pgsql-9.4/bin/initdb -D /var/lib/pgsql/9.4/data --locale=uk_UA.UTF-8
Дале в каталог $PGDATA добавил еще одну директорию с нужной базой
Проверяю список
psql -l
базы в списке нет..
Forever777, не нужно ничего инициализировать. Ставите постгрес той же версии и с теми же патчами, удаляете каталог $PGDATA, копируете вместо него старый, раздаёте нужные права. Если отличается путь к каталогам, в которых всё это лежит - правите postmaster.opts. Всё.
Разумеется, это неправильный подход и по-хорошему лучший вариант - бэкап/рестор или basebackup.
Благодарю. Ушел пробовать!
Если вдруг чего можно вас подключить на платной основе ?
Как с вами связаться?
Да. уже написал. только нет ответа от него.. ладно еще раз попробую
Только что накинул все заново, дело в том что у меня остались каталоги с $PGDATA - /base /pg_xlog,clog,log поэтому инициализацию я так понимаю нужно делать.. а дальше то что не понятно
Forever777, вам нужно заменить на новом сервере /var/lib/pgsql/9.4/data на $PGDATA со старого. Не PGDATA/base .
Всем привет.
В этот раз, я опишу способ миграции базы данных из старой версии PostgresSQL в новую, в феврале состоялся релиз PostgresSQL 9.4 и после тестирования, мы решили переехать на ее, до этого стояла PostgresSQL 9.3, дынных в ней было довольно много + статистика Zabbix за 1,5 года, которую было жалко терять т.к. в разговоре с руководством это сильно помогало аргументировать свою точку зрения.
Все это было сделано на ОС CentOS 6.6, но также будет работать на CentOS 7, в статье постараюсь описать оба варианта.
Предполагается что у вас есть сервер на котором установлен PostgresSQL 9.3.
Для начала нам необходимо установить PostgresSQL 9.4, добавим репозиторий и установим пакет.
Для CentOS 6
Для CentOS 7
теперь установим новый Postgres
нам необходимо заставить новый сервер временно работать на другом порту, стандартный порт 5432 мы переведем Postgres 9.4 на порт 5433
Осталось инициализировать базу на новом сервере
Для CentOS 6
Для CentOS 7
Останавливаем старый сервер PostgresSQL
Для CentOS 6
Для CentOS 7
нам остается запустить pg_upgrade данная тулза принимает значения ключей
-b — Директория со старыми бинарниками postgresql
-B — Директория с новыми бинарниками postgresql
-d — Расположения старых баз postgresql
-D — Расположения новых баз postgresql
Тогда команда принимает вид:
Ждем когда все операции завершатся, а это зависит от размера баз.
Если у вас были прописаны доступы, то их необходимо перенести в новый сервер PostgresSQL
если требуется еще и конфиг то:
Запускаем PostgresSQL 9.4
Для CentOS 6
Для CentOS 7
Нам необходимо проанализировать данные и устранить возможные ошибки с помощью analyze_new_cluster.sh
После завершения, запустим удаление старых данных
Нам остается только удалить старый сервер 9.3
Если вы переносили конфиг от старой версии, в новую, и все работает, то остается добавить PostgresSQL 9.4 в автозагрузку системы, если вы решили остановить конфиг от новой версии, то необходимо вернуть стандартный порт:
Жил был сервис, и была у него база, и жила она в /var/lib/postgresql на основном диске. И стала база занимать почти весь диск.
Ну и мы не лыком шиты, перенесем ее на отдельный диск.
План такой:
- Добавляем новый диск
- Монтируем его в какую-то папку
- Переносим туда БД
- Тут, возможно, мы захотим жить в новой директории - тогда поменяем конфиг.
- Прячем текущую папку /var/lib/postgresql
- Монтируем наш диск вместо старой папки
Монтируем диск
Сначала создадим левую папку, куда мы примонтируем новый раздел и будем перекидывать базу mkdir /tempdb .
Дальше посмотрим UUID нашего раздела. Даем команду blkid :
Вот же он: /dev/sdb1: UUID="fe561baa-f4de-4c52-bdff-cc496353a0a9"
Теперь добавляем строку в файл /etc/fstab , можно руками через vi/nano, можно echo-м:
После этого делаем mount -a . Раздел примонтирован в новую папку.
Проверяем
Как проверить? Ну например netstat -tulpn | grep 5432 , и если у вас постгрес на стандартном порту, должен быть вывод, вроде:
Готовим диск
Представим, что мы уже добавили диск в гипервизоре и видим его в выводе lsblk :
Теперь разметим его с помощью parted :
Отформатируем раздел в ext4:
Перенос базы
Сначала остановим сервис systemctl stop postgresql , чтобы во время копирования не записывались свежие данные.
Начинаем копировать данные:
и ждем. У меня база на 500Гб копировалась два часа, но всё зависит от железа, самой базы, фазы луны и дня недели.
На этом этапе мы можем изменить путь к базе в конфигурационном файле postgresql и запустить сервис, всё будет работать. Для этого редактируем файл /etc/postgres/10/main/postgresql.conf и меняем пусть к директории в строке:
Но если мы не хотим менять папку в конфиге Постгреса, то нужно спрятать старую базу, ведь мы не хотим ее сразу удалять, вдруг понадобится.
Теперь проверим, что мы не напутали с папками и /var/lib/postgresql на месте. Если нет - mkdir /var/lib/postgresql .
Размонтируем диск umount /tembdb , а затем заходим в nano /etc/fstab и редактируем строку с подключением. Нам нужно изменить точку монтирования. Должно получиться так:
Делаем mount -a и пробуем запустить сервис systemctl start postgresql .
Читайте также: