PostgreSql的备份和升级

目录

版本概述:

跨大版本数据迁移

[QProcess 调用相关进程进行备份和恢复](#QProcess 调用相关进程进行备份和恢复)


版本概述:

该数据库版本主要分为主要版本和次要版本,大版本基本每年发布一次,小版本则每几个月即发布,更新较快。在10.0之前所使用的数据库版本由三个数字组成,如pms所使用9.5.2,主要版本为9.5,次要版本为2,即9.5版本第二次发布;在10.0之后版本由两位数字组成,如10.16,

10为主要版本,16为次要版本,同一个主版本由于数据的存储结构相同,且总是前后版本兼容,因此升级只需要将旧版本的data文件替换到新的data文件即可;而跨越主版本升级则会因为存储结构的改变而不能简单的进行data替换。

跨大版本数据迁移

通过pg_dump进行升级,该方法主要是将原有的数据库转存为文本,该文本主要包含数据库重新生成的sql语句,后续再新版本中配合pg_restore或pg_sql进行数据库重新生成。

pg_dump -h 127.0.0.1 -U dbusername -p 5432 -d dbname -f sqlfilename .sql

psql -h 127.0.0.1 -U dbusername -p 5432 -d dbname -f sqlfilename.sql

pg_dump -h 127.0.0.1 -U dbusername -p 5432 -d dbname -F c -f sqlfilename.backup

pg_restore -h 127.0.0.1 -U dbusername -p 5432 -d dbname -1 backup_file.backup

不指定输出格式则输出纯文本,即sql文件;恢复时需要psql程序执行sqlfilename 中sql语句恢复

指定自定义格式或其他格式,恢复时必须用pg_restore读取sqlfilename进行恢复

纯文本格式恢复效率一般比自定义格式低。

-h, --host=HOSTNAME:指定数据库服务器的主机名或 IP 地址。

-p, --port=PORT:指定数据库服务器的端口号。

-U, --username=NAME:指定连接数据库时使用的用户名。

-d, --dbname=NAME:指定要备份的数据库名称。

输出格式参数:

-F, --format=FORMAT:指定导出文件的格式。常见的格式有:

c:自定义格式(compressed),这是默认格式,支持压缩和并行恢复。

d:目录格式,将数据库导出为多个文件,存储在一个目录中。

t:纯文本格式(SQL 脚本),可读性强,但恢复时可能较慢。

C:自定义格式(不压缩)。

输出文件参数:

-f, --file=FILENAME:指定导出文件的路径和名称。

备份内容参数:

-n, --schema=SCHEMA:指定要导出的架构名称。

-t, --table=TABLE:指定要导出的表名称。

--exclude-table=TABLE:排除某张表不导出。

-a, --data-only:只导出数据,不导出结构(表定义)。

-s, --schema-only:只导出结构,不导出数据。

QProcess 调用相关进程进行备份和恢复

cpp 复制代码
int AsyBackUpFileObj::pg_dump_sqlfile(const QString&DbBinDirStr, const QString&sqlfilePath)
{
	cLogger("PG")->info(TR("开始执行pg_dump命令备份数据").toStdString().c_str());
	QProcess pgProcess;
	QStringList ArgumentsList;
	ArgumentsList << "-h" << "127.0.0.1" << "-U" << "username" << "-p" << "5432" << "-d" << "dbname" << "-f" << sqlfilePath;
	pgProcess.setProgram(QDir::cleanPath(DbBinDirStr + QDir::separator() + "pg_dump.exe"));
	pgProcess.setArguments(ArgumentsList);
	QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
	env.insert("PGPASSWORD", MyPassWord);//数据库密码写在进程的环境变量中
	pgProcess.setProcessEnvironment(env);
	pgProcess.start();
	QObject::connect(&pgProcess, &QProcess::readyReadStandardOutput, [&]() {
		QString msg = pgProcess.readAllStandardOutput();
		cLogger("PG")->info(msg.toStdString());
	});
	QObject::connect(&pgProcess, &QProcess::readyReadStandardError, [&]() {
		QString msg = pgProcess.readAllStandardError();
		cLogger("PG")->info(msg.toStdString());
	});
	if (!pgProcess.waitForStarted())
	{
		cLogger("PG")->error(TR("执行pg_dump命令失败").toStdString().c_str());
		return -1;
	}
	if (pgProcess.waitForFinished(-1))
	{
		cLogger("PG")->info(TR("执行pg_dump命令备份数据成功").toStdString().c_str());
		return 0;
	}
	else
	{
		return -1;
	}
}

int AsyBackUpFileObj::pg_restore_fromFile(const QString&DbBinDirStr, QString&sqlfilePath)
{
	cLogger("PG")->info(TR("开始执行psql命令执行数据备份sql进行恢复").toStdString().c_str());
	QProcess pgProcess;
	QStringList ArgumentsList;
	ArgumentsList << "-h" << "127.0.0.1" << "-U" << "pms_db_role" << "-p" << "5432" << "-d" << "pms_db_client" << "-f" << sqlfilePath;
	pgProcess.setProgram(QDir::cleanPath(DbBinDirStr + QDir::separator() + "psql.exe"));
	pgProcess.setArguments(ArgumentsList);
	pgProcess.start();
	if (!pgProcess.waitForStarted())
	{
		cLogger("PG")->error(TR("执行psql命令失败").toStdString().c_str());
		return -1;
	}
	if (pgProcess.waitForFinished(-1))
	{
		cLogger("PG")->info(TR("执行psql命令执行数据备份sql进行恢复成功").toStdString().c_str());
		return 0;
	}
	else
	{
		return -1;
	}
}

该程序除了用于备份和恢复,也适合用于数据跨版本迁移;在使用文本格式的备份文件时,备份文件是将数据以sql的形式存储在文件中,在高版本中调用psql实际是在将该sql执行一遍在恢复数据,相较于自定义格式效率较低。

相关推荐
cookqq12 分钟前
mongodb源码分析session异步接受asyncSourceMessage()客户端流变Message对象
数据库·sql·mongodb·nosql
呼拉拉呼拉23 分钟前
Redis故障转移
数据库·redis·缓存·高可用架构
什么都想学的阿超27 分钟前
【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
数据库·redis·架构
pp-周子晗(努力赶上课程进度版)1 小时前
【MySQL】视图、用户管理、MySQL使用C\C++连接
数据库·mysql
斯特凡今天也很帅1 小时前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
一加一等于二2 小时前
docker部署postgresql17,并且安装插件
docker·postgresql
超级小忍2 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税2 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy3 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之4 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle