线上版本升级 — — pg数据库备份

news2024/11/18 1:42:14

线上版本升级 — — pg数据库备份

在版本升级之前,我们通常为了保险都需要将数据库里的数据结构备份一份,防止升级失败之后数据丢失。(根据业务而来,并非所有业务都需要备份)

1 备份

1.1 pg_dump:备份指定数据

只能备份单个数据库,不会导出角色和表空间相关的信息。因此恢复数据库或者表之前,需要保证之前的数据库已经被创建。否则会报数据库not exist.

①参数解析
Usage:
  pg_dump [OPTION]... [DBNAME] 数据库名放最后,不指定默认是系统变量PGDATABASE指定的数据库。


General options:(一般选项)

  -f, --file=FILENAME          导出后保存的文件名

  -F, --format=c|d|t|p         导出文件的格式(custom, directory, tar, plain, text(default))

  -j, --jobs=NUM               并行任务数

  -v, --verbose                详细信息

  -V, --version                版本信息

  -Z, --compress=0-9           压缩格式的压缩级别

  --lock-wait-timeout=TIMEOUT  在等待表锁超时后操作失败

  -?, --help                   帮助信息


Options controlling the output content:(控制输出的选项)

  -a, --data-only              只导出数据,不包括模式

  -b, --blobs                  在转储中包括大对象

  -c, --clean                  在重新创建之前,先清除(删除)数据库对象

  -C, --create                 在转储中包括命令,以便创建数据库(包括建库语句,无需在导入之前先建数据库)

  -E, --encoding=ENCODING      转储以ENCODING形式编码的数据

  -n, --schema=SCHEMA          只转储指定名称的模式

  -N, --exclude-schema=SCHEMA  不转储已命名的模式

  -o, --oids                   在转储中包括 OID

  -O, --no-owner               在明文格式中, 忽略恢复对象所属者

  -s, --schema-only            只转储模式, 不包括数据(不导出数据)

  -S, --superuser=NAME         在转储中, 指定的超级用户名

  -t, --table=TABLE            只转储指定名称的表

  -T, --exclude-table=TABLE    不转储指定名称的表

  -x, --no-privileges          不转储权限 (grant/revoke)

  --binary-upgrade             只能由升级工具使用

  --column-inserts             以带有列名的insert命令形式转储数据

  --disable-dollar-quoting     取消美元 (符号) 引号, 使用 SQL 标准引号

  --disable-triggers           在恢复数据的过程中禁用触发器

  --exclude-table-data=TABLE   不转储指定表的数据

  --inserts                    将数据转储为insert命令,而不是copy命令

  --no-security-labels         不分配安全标签进行转储

  --no-synchronized-snapshots  不在并行任务中使用同步快照

  --no-tablespaces             不转储表空间分配信息

  --no-unlogged-table-data     不转储未标记的表数据

  --quote-all-identifiers      引用所有标识符( 不是关键字 )

  --section=SECTION            转储命名部分(pre-data, data, or post-data)

  --serializable-deferrable    等待没有异常的情况下进行转储

  --use-set-session-authorization  使用SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来设置所有权


Connection options:(控制连接的选项)

  -d, --dbname=DBNAME      转储的数据库名

  -h, --host=HOSTNAME      数据库服务器的主机名或IP

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

  -U, --username=NAME      指定数据库的用户联接

  -w, --no-password        不显示密码提示输入口令

  -W, --password           强制口令提示 (自动)

  --role=ROLENAME          转储前设置角色


如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量的数值.
②使用
1 备份指定表:pg_dump -U xxx -f xxx.sql -t tableName
  • 数据准备
-- 创建account表
create table account(id int primary key,name varchar(20), description varchar(100));

-- 手动插入数据
insert into account(id,name,description) values (1,'a1',''),(2,'a2',''),(3,'a2','');

在这里插入图片描述

  1. 备份account表
-- 备份指定表
pg_dump -U postgres -f /postgres_account.sql -t account postgres; -- (数据库名)

在这里插入图片描述

  1. 清空表并通过psql进行数据恢复
-- 模拟线上升级故障:手动drop table
drop table account;


 -- psql 恢复数据
psql -U postgres -f /postgres_account.sql postgres 

在这里插入图片描述

在这里插入图片描述

2 备份整个数据库:pg_dump -U postgres -f /postgres.sql postgres(数据库名)
  1. 数据准备:创建多张表并插入数据
-- 创建account、goods表
create table account(id int primary key,name varchar(20), description varchar(100));

create table goods(id int primary key,name varchar(20), price float);


-- 手动插入数据
insert into account(id,name,description) values (1,'a1',''),(2,'a2',''),(3,'a2','');

insert into goods(id,name,price) values (1,'banana',20.0),(2,'apple',15.0),(3,'tomato',7.0);

在这里插入图片描述

  1. 备份整个数据库
-- -U ziyi指定用户名
-- -f指定存储文件格式以及存储位置
-- testdb指定数据库
pg_dump -U ziyi -f /testdb.sql  testdb

在这里插入图片描述

  1. 删除数据库并尝试恢复
-- 删除数据库
drop database testdb;

-- 查看数据库列表
\list

-- 恢复数据库,需要我们手动创建testdb
CREATE DATABASE testdb OWNER ziyi;
psql -U ziyi -f /testdb.sql testdb 

在这里插入图片描述
重新创建数据库,执行恢复脚本:

在这里插入图片描述

进入数据库查看数据是否恢复:

在这里插入图片描述

远程备份:pg_dump -U ziyi -h localhost -p 5432 -f /testdb.sql testdb
-- 1. 备份数据
pg_dump -U ziyi -h localhost -p 5432  -f /testdb.sql testdb
#-d 数据库名称
#-h ip地址
#-p 端口号
#-U 用户
#-f 保存路径
#testdb  数据库名称


-- 2. 恢复数据
psql -U ziyi -h localhost -d testdb -p 5432 -f /testdb.sql

#-d 数据库名称
#-h ip地址
#-p 端口号
#-U 用户
#-f sql文件路径

1.2 pg_dumpall:备份所有

-- 备份
pg_dumpall > pg_all.sql

-- 恢复
psql -f pg_all.sql

2 恢复

2.1 psql:psql -U postgres -f /postgres_account.sql postgres

-- 以postgres的角色在postgres数据库下执行/postgres_account.sql文件
psql -U postgres -f /postgres_account.sql postgres 

2.2 pg_restore:从非文本格式(例:xxx.tar)中恢复数据

pg_restore 是一个用来从 pg_dump 创建的非文本格式文件中恢复 PostgreSQL 数据库的工具。
部分参数:
-v : 输出详细信息
-F : 指定备份文件的格式,例如 -Ft 表示以 tar 形式备份的文件
-c : 在还原之前清空数据库
-O : 不还原对象所有者
-j : 并行执行的进程数
-n : 单独指定还原的模式
-t : 单独指定还原的表

--备份数据库,-F t:指定归档格式为tar,注意:默认情况下,pg将忽略备份
--过程中发生的任何错误,这可能导致备份不完整。可以使用-1选项运
-- 行pg_dump,这将会让整个备份过程编程单个事务。

-- pg_dump的备份格式有几种选择
			-- *.bak 压缩二进制格式
			-- *.sql 明文转储
			-- *.tar tarball

pg_dump testdb -c -Ft -f testdb.tar 

-- 删除数据库
drop database testdb

-- 恢复数据到testdb数据库(需要先保证testdb已创建好)
pg_restore -d testdb -c testdb.tar

在这里插入图片描述

在这里插入图片描述

3 实战

3.1 docker搭建pg

docker run -d \
-p 5432:5432 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-v /Users/ziyi2/docker-home/pg:/var/lib/postgresql/data \
--name pg \
--restart always \
docker.io/postgres:9.6-alpine


# -p port 映射端口,可以通过宿主机的端口访问到容器内的服务
# -d 是detach 保持程序后台运行的意思
# -e environment 设置环境变量
# -v volume 文件或者文件夹的挂载

3.2 数据准备:创建数据库、创建表

  1. 进入pg容器并创建数据库
# 过滤出容器并以postgres角色进入postgres数据库
docker ps | grep pg
docker exec -it container_id /bin/bash
psql -U postgres postgres

# 创建用户并为用户创建数据库
CREATE USER ziyi WITH PASSWORD 'postgres';
create database testdb owner ziyi;

在这里插入图片描述
在这里插入图片描述

  1. 创建表
-- 以ziyi用户切换到testdb数据库
\c testdb ziyi

-- 创建account、goods表
create table account(id int primary key,name varchar(20), description varchar(100));

create table goods(id int primary key,name varchar(20), price float);

在这里插入图片描述

  1. 插入数据
-- 手动插入数据
insert into account(id,name,description) values (1,'a1',''),(2,'a2',''),(3,'a2','');

insert into goods(id,name,price) values (1,'banana',20.0),(2,'apple',15.0),(3,'tomato',7.0);

在这里插入图片描述

3.3 pg_dump:升级前备份数据库

-- 退出pg,来到容器的bash控制台
\q

-- -U ziyi指定数据库owner
-- -f /testdb.sql:指定转储文件路径
-- testdb指定要备份的数据库名
pg_dump -U ziyi -f /testdb.sql  testdb

在这里插入图片描述

3.4 删除数据库:模拟数据库异常、数据丢失等

-- 回到容器内部删除数据库
psql -U postgres postgres

drop database testdb;

在这里插入图片描述

3.5 psql:通过备份的文件恢复数据库数据

-- 恢复数据之前需要手动创建数据库
CREATE DATABASE testdb owner ziyi;

-- 在docker bash执行恢复命令
psql -U postgres -f /testdb.sql testdb 

执行恢复过程中可能出现一些报错,比如:数据库中已经存在部分func函数等,那么在执行恢复脚本之前,需要我们手动先把对应函数删除

  • 数据恢复前:testdb数据库下还没有对应的表

在这里插入图片描述

  • 数据恢复后:

在这里插入图片描述

如果是通过k8搭建的pg,可以直接通过如下命令备份:

source /etc/profile && mkdir -p /ziyi/backup && cd /ziyi/backup && kubectl exec -it pod_name -- pg_dumpall -U postgres > pro_db_20230421.sql

参考文章:https://www.cnblogs.com/nhdlb/p/14960000.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常见的管理命令

1. whoami 作用: 显示出当前有效的用户名称,Linux是多用户多任务 语法:whoami(选项) 选项: --help:在线帮助 --version:显示版本信息和退出 场景使用: 1. 当用户想要查看当前登录系统的用户…

04 约数

定义: 若整数n除以整数d的余数为0,即d能够整除n,n是d的倍数,记作d|n. 通过质因子求一个数的约数 如果n可以表示成 其中均为n的质因子 因为对于任意一个质因子都有选0个 选1个 选2个....选个共种可能, n的约数个数…

C++ STL库详解:list

目录 一、list简介 二、list的使用 2.1list的构造 2.2list iterator迭代器的使用 2.3list element access 2.4list 常见接口 2.5迭代器失效 三、list与vector的对比 一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器…

腾讯云轻量应用服务器Docker如何一键搭建属于自己的幻兽帕鲁服务器?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏,在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活,也…

【机器学习300问】19、深度学习和机器学习什么关系?

之前的文章都聚焦在传统的机器学习上,作为入门,学了许多机器学习的基础。往后的文章我会穿插着机器学习和深度学习的内容进行,所有有必要在这里先说下两者的关系。 一、从范围上讲 深度学习和机器学习都是人工智能的一个子领域,它…

杰理-修改蓝牙版本5.4

杰理-修改蓝牙版本5.4 #define BLUETOOTH_CORE_SPEC_54 0x0dextern void set_bt_version(u8 version); set_bt_version(BLUETOOTH_CORE_SPEC_54); //蓝牙版本5.4

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件:点击VSCode左侧边栏中的扩展图标(或按 CtrlShiftX)&a…

即时设计好用吗?即时设计都有什么优势?

即时设计是否易于使用?即时设计有哪些易于使用的功能?假如你在寻找一个免费的Sketch 或者网页版本 PS,那么「即时设计」这是个不错的选择。这个云端 UI 设计工具允许您在不占用计算机内存的情况下使用任何设备。它可以快速存储您的设计文件&a…

AI教我学编程之SQL Server常见指令以及数据类型

前言 今天在工作的过程中,遇到了许多常见的属性,在此做下记录,方便以后查询 目录 SQL Server 常见指令 对话AI 光有概念怎么行 阶段总结 SQL Server关键字 边学边练 数据类型 看图说话 对话AI 数据类型我知道 括号里的神秘数字 疑问 边练…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时,临时提升为超级用户。例如,普通用户可以使用sudo执行系统管理任务,如安装软件、修改系统配置等。访问控制:sudo命令通过sudoers文件中的配置,可以对用…

企业软件项目成果-图像识别

下面图像识别仅仅使用了OpenCV库而已,并没有涉及深度学习、机器学习。 整盘样本的拍照识别结果(识别准确率达100%): 宫颈刷图像识别的测试结果(识别准确率达100%):

基于51单片机的智能烘干机设计

基于51单片机的智能烘干机设计[proteus仿真] 温湿度检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的智能烘干机设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥&#x…

基于springboot在线学习平台源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括学习平台的网络应用,在外国学习平台已经是很普遍的方式,不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台采用ja…

jetson-inference----docker内运行分类任务

系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…

C++PythonC# 三语言OpenCV从零开发(2):教程选择

文章目录 相关专栏前言视频教学和官方文档视频教程OpenCV 官方教程最终选择我的最终选择 相关专栏 C&Python&Csharp in OpenCV 前言 OpenCV 有官方的教程和简单的视频教程: OpenCV 官方教程 B站也有相关的视频教学 OpenCV4 C 快速入门视频30讲 - 系列合集 …

使用Ollama本地部署大模型

Ollama 是一个简明易用的本地大模型运行框架,目前已经有 32 K star。随着围绕着 Ollama 的生态走向前台,更多用户也可以方便地在自己电脑上玩转大模型了,使用 Ollama 本地部署大模型在 mac 上尤其简单 GitHub地址:https://github…

[每日一题] 01.25 - 子数整数

子数整数 k int(input()) flag False for i in range(10000,30001):a,b,c [int(str(i)[j:j 3]) for j in range(3)]if a % k 0 and b % k 0 and c % k 0:print(i)flag Trueif not flag:print(No)

文旅AI交互数字人,提升景区数字化导览服务体验

随着数字化的普及,文化旅游逐渐走向数字化,通过数字人技术手段对文化旅游资源进行整合与开发。 AI交互数字人可以部署于交互式终端设备和移动端,可以为游客提供“面对面”的语音交互,提供路径规划、游览路线推荐、景点讲解等服务&…

[小程序]页面跳转

一、页面跳转 1.声明式导航 使用<navigate>组件实现&#xff08;固定式&#xff09;&#xff0c;需要指定url属性(跳转位置)和open-type属性(跳转方式) ①跳转tabBar页面 open-type属性必须指定类型为switchTab <navigator url"/pages/index/index" open-t…

golang整合rabbitmq,创建交换机并绑定队列

1,如果要开发消息队列,需要创建交换机和队列,通常有2中方式创建,1种是在面板直接创建 2,第二种就是在代码中创建,这里 展示的是go语言代码中创建rabbitmq package mainimport ("fmt""log""github.com/streadway/amqp" )func main() {// 连接R…