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

线上版本升级 — — 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source) 1)执行环境(Execution Environment)1.1.创建执行环境1.2.执行模式(Execution Mode)1.3.触发程序执行…

Hudi学习笔记(一)

大数据发展背景 Hudi用于管理分布式文件系统上大型分析数据集存储,支持Spark和Flink整合。它能够是DFS数据集在分钟级时延内支持变更,也支持下游系统对这个数据集的增量处理。 学习目标 什么是数据湖为什么使用数据湖Hudi基本功能如何编译Hudi源码Hud…

抖音账号矩阵系统开发

技术自研框架开发背景: 抖音账号矩阵系统是一种基于数据分析和管理的全新平台,能够帮助用户更好地管理、扩展和营销抖音账号。 部分源码分享:计算分页$active_list_all $Video_model->getCount($where);$page_libs newLibs_Pagination_…

PyQtGraph 之PlotCurveItem 详解

PyQtGraph 之PlotCurveItem 详解 PlotCurveItem 是 PyQtGraph 中用于显示曲线的图形项。以下是 PlotCurveItem 的主要参数和属性: 创建 PlotCurveItem 对象 import pyqtgraph as pg# 创建一个 PlotCurveItem curve pg.PlotCurveItem()常用的参数和属性 setData(…

02 分解质因子

一、数n的质因子分解 题目描述&#xff1a; 输入一个数n&#xff08;n<10^6&#xff09;,将数n分解质因数&#xff0c;并按照质因数从小到大的顺序输出每个质因数的底数和指数。 输入 5 输出 5 1 输入 10 输出 2 1 5 1 朴素解法&#xff1a; 首先求出1~n的所有质数…

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…

BPM、低代码和人工智能:实现灵活、创新与转型的关键结合

随着零售业格局的不断演变&#xff0c;零售商正被迫在一个日益活跃、竞争日益激烈的客户驱动型市场中展开竞争。随着互联网上产品信息和评论的出现&#xff0c;消费者的态度发生了巨大的变化——购物者不再依赖销售人员来获取信息。他们现在知道的和许多零售销售人员一样多&…

uniapp 用css animation做的鲤鱼跃龙门小游戏

第一次做这种小游戏&#xff0c;刚开始任务下来我心里是没底的&#xff0c;因为我就一个‘拍黄片’的&#xff0c;我那会玩前端的动画啊&#xff0c;后面尝试写了半天&#xff0c;当即我就给我领导说&#xff0c;你把我工资加上去&#xff0c;我一个星期给你做出来&#xff0c;…

人机共融时代,节卡机器人如何持续“点亮智慧火花”?

近年来&#xff0c;协作机器人产品发展势头十分强劲&#xff0c;尤其在工业生产方面&#xff0c;由于更为灵活便捷&#xff0c;能够实现人机安全协作&#xff0c;已形成较为广泛的应用。 值得一提的是&#xff0c;协作机器人在消费场景的应用潜力也在逐步释放&#xff0c;比如…

GroupMixFormer:Advancing Vision Transformers with Group-Mix Attention论文学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2311.15157.pdf 代码地址&#xff1a;https://github.com/AILab-CVC/GroupMixFormer 摘要&#xff1a;ViT 已被证明可以通过使用多头自注意力 &#xff08;MHSA&#xff09; 对远程依赖关系进行建模来增强视觉识别&#xff0c;这通常…

C++ 之LeetCode刷题记录(十七)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

Tomcat Notes: Web Security, HTTPS In Tomcat

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…

《深入解析Java虚拟机:从JVM体系结构到垃圾回收算法》

文章目录 JVM体系结构JVM的组成 类加载器Class Loader类加载器的作用双亲委派机制JVM自带三个类加载器Bootstrap ClassLoader-根加载器ExtClassLoader-扩展加载器AppClassLoader-应用类加载器 Java历史-沙箱安全机制沙箱概念沙箱的作用本地代码和远程代码沙箱安全机制模型JDK1 …

js执行字符串代码

js将字符串作为代码执行 一、适用场景二、具体实现1. eval2. new Function() 三、两者差异 一、适用场景 在业务中我们很少去将一个字符串作为代码执行&#xff0c;因为出于安全考虑&#xff0c;尽量不要直接在客户端执行用户输入的代码。但是在造轮子或者框架开发中&#xff…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

将Python打包为exe+inno setup将exe程序封装成向导安装程序

为什么要打包&#xff1f; Python脚本不能在没有安装Python的机器上运行。如果写了一个脚本&#xff0c;想分享给其他人使用&#xff0c;可她电脑又没有装Python。如果将脚本打包成exe文件&#xff0c;即使她的电脑上没有安装Python解释器&#xff0c;这个exe程序也能在上面运行…

简单易懂带你入门Spring框架,循序渐进,帮助你理解IOC思想---(一)入门实验一,教你如何使用spring框架

目录 1.1 、Spring概述 1.2 、Spring家族 1.3 、Spring Framework 1.3.1 、Spring Framework特性 1.3.2 、Spring Framework五大功能模块 IOC容器 IOC思想 IOC容器在Spring中的实现 基于XML管理bean 实验一&#xff1a;入门案例 如何获取bean 1.1 、Spring概述 官网…

爬虫笔记(二):实战58二手房

第一&#xff1a;给大家推荐一个爬虫的网课哈&#xff0c;码起来 第二&#xff1a;今夜主题&#xff1a;通过xpath爬取58二手房的title信息&#xff0c;也就是标红的位置~ 第三&#xff1a;先分析一波title所在的位置 打开按下f12打开抓包工具&#xff0c;即可看到网站的源码…

代码随想录算法训练营29期|day30 任务以及具体安排

332.重新安排行程 class Solution {private LinkedList<String> res;private LinkedList<String> path new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {Collections.sort(tickets, (a, b) -> a.…