PostgreSQL, Qt, Портфолио

DBServerWizard — автоматизация работы с базами данных PostgreSQL

Сегодня хочу познакомить вас с утилитой DBServerWizard, написание которой закончила намедни. Если коротко, ее предназначение — самые базовые элементы управления базами данных PostgreSQL.

МенюУстановка сервераРезервное копирование/ восстановление из копииСоздание базы данных
Меню
Установка сервера
Бэкап/рестор
Создание БД

А если расписать немного подробнее, то перечень такой:

  • Установка сервера PostgreSQL (включает предварительную проверку наличия уже установленного сервера).
  • Создание и удаление баз данных. Есть некоторый обязательный набор баз данных; при подключении к серверу происходит проверка наличия этого минимального набора, если какие-либо БД из этого списка отсутствуют, то предлагается произвести создание БД и восстановление из бэкапа. Доступно принудительное удаление при наличии «застрявших» подключений, мешающих операции.
  • Резервное копирование и восстановление из копии. Перед восстановлением базы данных производится резервное копирование «на всякий случай».
  • Обновление баз данных из скриптов. Скрипт разделяется на отдельные инструкции, которые выполняются последовательно. Невыполненные инструкции записываются в отдельный файл.

Следующие сообщения были написаны в течение работы над утилитой:

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Принудительное удаление базы данных в PostgreSQL

Qt: Резервная копия pg_dump БД PostgreSQL в Windows

Файл паролей PostgreSQL pgpass в Windows

Путь к каталогу bin PostgreSQL Windows

Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.

Моё портфолио

Инфо обо мне

PostgreSQL, Qt, Базы данных

Qt: Резервная копия pg_dump БД PostgreSQL в Windows

Пример того, как можно реализовать резервное копирование базы данных PostgreSQL в Qt. Создается batch-файл, где вызывается утилита pg_dump.

//QString name - имя базы данных для создания копии
//file - "куда складывать" бэкап
bool myClass::backupDatabase(QString name, QString file)
{
    QString binDir = postgresBinDirectory();
    if (binDir.isEmpty()) {
        error(tr("Системный каталог bin сервера не найден. "
				 "Операция восстановления базы данных "
				 "%1 из резервной копии %2 прервана")
              .arg(name).arg(file));
        return false;
    }
    if (file.isEmpty()) {
        QDir dir(QCoreApplication::applicationDirPath()+
				 "/db_dumps/");
        if (!dir.exists())
            dir.mkpath(QCoreApplication::applicationDirPath()+
					   "/db_dumps/");
        file = QString("%1/%2-%3.dump")
                .arg(QCoreApplication::applicationDirPath()+
					 "/db_dumps")
                .arg(name)
                .arg(QDateTime::currentDateTime()
					 .toString("yyyyMMddhhmm"));
    }
    QString text = QString(
		"@ECHO OFF \n"
        "cd /d %1 \n"
        "pg_dump -Fc -U %4 -Z 9 -v %2 > \"%3\" \n"
        "set /p id=\"Press Enter to exit...\"\n")
            .arg(binDir)
            .arg(name)
            .arg(file)
            .arg(postgresUser);
    QString fileName = QString("%1-dump.bat")
            .arg(name);
	//запись Значения строки text в файл *.bat
    if (!writeBatFile(text, fileName, 
				 QCoreApplication::applicationDirPath()+"/temp"))
		return;
	//обновление файла паролей pgpass
    updatePgPassFile(QString("%1:%2:%3:%4:%5")
                     .arg(host,
                          ui->port->text(),
                          name,
                          postgresUser,
                          ui->password->text()));
	//вызов созданного batch файла
    system(qPrintable("cmd.exe /c \""+
                      QDir::toNativeSeparators(
                          QString("%1/%2")
                          .arg(QCoreApplication::applicationDirPath()+
							   "/temp")
                          .arg(fileName)+"\"")));
	//если файл бэкапа имеет ненулевой размер
    return QFileInfo(file).size() > 0;
}

Как узнать путь к каталогу bin сервера PostgreSQL, подробно написано здесь: Путь к каталогу bin PostgreSQL Windows. При условии известности имени пользователя и его пароля можно запустить утилиту pg_dump без необходимости авторизации пользователем при наличии соответствующей строки подключения в файле паролей pgpass, про что подробно писала в этой статье: Файл паролей PostgreSQL pgpass в Windows. В вышеприведенном коде используется функция updatePgPassFile(QString), код которой можно найти по обозначенной ссылке.

Более ранняя статья на схожую тему: Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL