pg数据库的备份和恢复

摘要:
1备份恢复方法SQL转储文件系统级备份连续归档2 SQL转储SQL转储方法的思想是创建一个由SQL命令组成的文件。当文件返回到数据库时,数据库使用其中的SQL命令以与转储相同的状态重建数据库实例。postgresql提供的工具是pg_Dump。该工具的基本用法如下:备份:pg_dumpdbname>流出文件恢复:psqldbname<需要注意的是,以上两个命令是

1 备份恢复方法

  • sql转储
  • 文件系统级备份
  • 连续归档

2 sql转储

sql转储方法的思想就是创建一个由SQL命令组成的文件,当把这个文件返回数据库时候,数据库利用其中的sql命令重建与转储状态一样的数据库实例。postgresql提供的工具是pg_dump,这个工具的基本用法如下:

备份:pg_dump dbname > outfile
恢复:psql dbname < infile

需要注意的是,上述两个命令都是在postgres用户下运行的,outfile和infile都是sql文件。

2.1 pg_dump

pg_dump是一个普通的客户端工具,如果不指定主机IP和端口,那么默认备份的是本地服务器上的数据库。一般来说,这个命令由超级管理员来运行,这样可以备份到整个数据库的所有对象。由数据库创建的对象是一致的,即在运行pg_dump那一刻存储了该时刻的数据库快照,这个命令在运行过程中数据库的更新不会被转储。同时,pg_dump不会阻塞其他对数据库的操作。

以下是一个数据库转储文件的例子,从转储文件中的内容来看,是由一系列的sql语句组成,包含了重建这个数据库所有的sql操作。

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.6.3
-- Dumped by pg_dump version 9.6.3

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: module_permission; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE module_permission (
    profile_key integer NOT NULL,
    campaign_key integer NOT NULL,
    status integer NOT NULL,
    create_time date,
    modify_time date
);


ALTER TABLE module_permission OWNER TO postgres;

--
-- Name: userprofile_data; Type: TABLE; Schema: public; Owner: postgres
--

2.2 恢复

pg_dump生成的sql文本可以有psql程序读取,但是注意的是恢复数据库的时候dbname是需要存在的,也就是说,转储文件中并不包含创建数据库的语句。可以在恢复之前创建一个数据库,用如下命令来创建一个数据库。

createdb -T template0 dbname

表明这个数据库dbname是基于模板template0来创建的,然后再执行如下恢复语句:

psql dbname < infile

恢复结果

SET
SET
SET
SET
SET
SET
SET
SET
CREATE EXTENSION
COMMENT
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
CREATE VIEW
ALTER TABLE
ALTER TABLE
ALTER TABLE
COPY 10
COPY 2514830
COPY 2514830
COPY 511969
 setval 
--------
 388095
(1 row)

COPY 37
 setval 
--------
     37
(1 row)

COPY 10
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE

默认情况下,psql在遇到一个sql执行错误后,会继续执行,并不会停止。这样可能恢复出来的就是一个不完整的数据库,需要手动修复那一小部分的错误。但是实际过程中,这种情况出现的较少,在这里不讨论,可以参考相关的数据手册中“备份和恢复”章节中的内容。

pg_dump和psql读写管道的能力使得直接从一个服务器转储一个数据库到另外一个服务器中成为可能:

pg_dump -h host1 dbname | psql -h host2 dbname

在恢复完成后,基本可以使用,但是同时需要注意的是,需要使用新数据库的账号密码,原来数据库的账号密码并没有同步到新数据库中,同时为了在新数据库中能有更好的性能,在恢复完毕后,对全库进行一次analyze操作,在数据字典中建立统计信息。

2.3 pg_dumpall

pg_dump工具转储的是一个数据库dbname中所有的信息,不会转储角色和表空间等信息,如果需要完整转储整个数据库中所有的数据库实例,PostgreSQL提供了一个工具pg_dumpall,该工具能够转储一个数据库集簇中所有的内容,包含了前面提到的角色和表空间。使用的方法是:

备份:pg_dumpall > outfile
恢复:psql -f infile postgres

从pg_dump和pg_dumpall两个工具的作用来看,前者偏向于重建一个数据库实例,这个实例中包含了基本的对象和数据信息,适用于角色等信息比较简单等,常用于定期备份使用;后者偏向于重建一个数据库集簇,适用于在一个新的环境中部署一套与原来一致的数据库环境,包括表空间和角色,尤其是在角色较多的复杂环境下,减少了手动干预的工作量。

3 文件系统级备份

这种备份方式比较简单粗暴,直接将存储数据库的文件进行备份,也就是通常下的pgdata目录,例如:

tar -czvf backup.tar.gz /data1/pgdata

这种方法有两个限制:
1、为了得到可用的备份,需要停止数据库。创建完备份后,就相当于将该数据库的一个快照进行了备份,在需要时候,解压缩,启动数据库指定数据目录即可。
2、只适用于完整的备份,不适用于部分数据库的备份。

4 连续归档和时间点恢复

待更新

免责声明:文章转载自《pg数据库的备份和恢复》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AUC指标深度理解【转】JAVA 8 日期/时间(Date Time)API指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

no_merge hint

This is tested in 10gR2. SQL> select * from v$version; BANNER ------------------------------------------------ Oracle Database 10g Enterprise Edition Release 1 0.2.0.5.0 - 64b...

jmeter使用复习

多终端进程: 配置客户端远程的ip地址和port 在客户端jmeter安装目录的bin目录下,修改配置文件 jmeter.properties 默认的remote_hosts 的值:(将肉鸡的地址加入到hosts后面) 然后去到jmeterGUI界面内,选择远程启动, 注:远程的jmeter版本与脚本必须一致,否则会报错。 html报告生成: 1. cmd...

oracle pl/sql 变量

一、变量介绍在编写pl/sql程序时,可以定义变量和常量;在pl/sql程序中包括有:1)、标量类型(scalar)2)、复合类型(composite) --用于操作单条记录3)、参照类型(reference) --用于操作多条记录4)、lob(large object)    二、标量(scalar)——常用类型1)、在编写pl/sql块时,如果要使用...

.Net基础:ASP.NET中的session存储模式运用

在asp.net中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障, 用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大...

pg分区表一

PostgreSQL的分区表创建较Oracle分区表复杂些,需要借助创建继承表和触发器的模式实现, 具体创建方法可以参照以下实验, 供参考。 创建父表 123456789101112131415161718 CREATE TABLE fenqu_table ( id integer NOT NULL, mcc character varying(5)...

Android类参考---SQLiteOpenHelper

public 抽象类 SQLiteOpenHelper 继承关系 java.lang.Object |____android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅助类,用来管理数据库的创建和数据库的版本。 你要创建一个这个类的子类来实现onCreate(SQLiteDatabase),onUpgrade(SQ...