PostgreSQL实例恢复与热备份技术内幕分析
pg数据库的备份和恢复

pg数据库的备份和恢复1 备份恢复⽅法sql转储⽂件系统级备份连续归档2 sql转储sql转储⽅法的思想就是创建⼀个由SQL命令组成的⽂件,当把这个⽂件返回数据库时候,数据库利⽤其中的sql命令重建与转储状态⼀样的数据库实例。
postgresql提供的⼯具是pg_dump,这个⼯具的基本⽤法如下:备份:pg_dump dbname > outfile恢复:psql dbname < infile需要注意的是,上述两个命令都是在postgres⽤户下运⾏的,outfile和infile都是sql⽂件。
2.1 pg_dumppg_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.3SET 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是需要存在的,也就是说,转储⽂件中并不包含创建数据库的语句。
PostgreSQL之pgdump备份恢复操作

PostgreSQL之pgdump备份恢复操作逻辑备份在恢复时,介于逻辑备份与故障时间点之间的数据难以恢复,故⼀般不采取逻辑备份⽅式进⾏数据库备份,但逻辑适⽤于跨平台跨版本的数据迁移;逻辑备份恢复主要以下三种:pg_dumppg_dumpallcopy本⼩节主要讲解pg_dumppg_dump备份只能备份单个数据库,不会导出⾓⾊和表空间相关的信息-F c 备份为⼆进制格式,压缩存储.并且可被pg_restore⽤于精细还原-F p 备份为⽂本,⼤库不推荐pg_dump恢复psql dbname -U username < bakfile或pg_restore– pg_restore [option] ... [filename]– pg_restore -d dbname bakfile⼆进制格式的备份只能使⽤pg_restore来还原,可以指定还原的表,编辑TOC⽂件,定制还原的顺序,表, 索引等。
⽂本格式的备份还原, 直接使⽤⽤户连接到对应的数据库执⾏备份⽂本即可,例如psql dbname -f bak.sqlpg_dump备份恢复⽰例1)创建数据库createdb testdb2)连⼊数据库testdbpsql testdb3)创建测试表,插⼊数据testdb=# create table tt(a int) tablespace tbls_t;testdb=# insert into tt(a) values(1);testdb=# insert into tt(a) values(2);4)查看数据testdb=# select * from tt;5)备份pg_dump testdb>/dbbak/testdb.sql #简单语法,可结合选项灵活备份6)删除数据库testdbdropdb testdb7)创建新数据库(恢复之前需创建数据库)createdb testdb8)恢复数据psql testdb </dbbak/testdb.sql9)查看数据是否回复psql testdbtestdb=# select * from tt;⾄此,数据已成功恢复!pg_restore -d postgres /dbbak/pgdumpbak/p.dmppg_dump备份恢复命令扩展练习pg_dump -F c -f /dbbak/pgdumpbak/c.dmp -C -E UTF8 -h 127.0.0.1 -U postgres testdb #⼆进制格式备份⽂件pg_dump -F p -f /dbbak/pgdumpbak/p.dmp -C -E UTF8 -h 127.0.0.1 -U postgres testdb #⽂本格式备份⽂件,”-C” 表⽰包含创建语句pg_restore /dbbak/c.dmp|less 可以解析⼆进制格式的备份⽂件pg_restore -l /dbbak/c.dmppg_restore -d testdb /dbbak/pgdumpbak/c.dmp #需要先创建⽬标库pg_restore -d postgres /dbbak/pgdumpbak/p.dmp #⽂件中包含创建数据库的命令,不需要创建⽬标库toc⽂件选择性备份恢复1)根据⼆进制备份⽂件⽣成toc⽂件pg_restore -l -f /dbbak/pgdumpbak/toc /dbbak/pgdumpbak/c.dmp2)修改 toc⽂件,以⾸⾏加分号“;”的⽅式注释掉不⽤还原的内容3)以toc⽂件列表做恢复pg_restore -F c -L /dbbak/pgdumpbak/toc -d testdb /dbbak/pgdumpbak/c.dmp补充:Postgresql备份与还原命令pg_dumppostgresql数据库的备份和还原命令pg_dump常⽤命令:备份:pg_dump -U postgres -d myDBname -f dump.sql其中postgres是⽤户名myDBname是数据库名dump.sql是⽂件名还原:createdb newDBnamepsql -d newDBname -U postgres -f dump.sql其中postgres是⽤户名newDBname是数据库名dump.sql是⽂件名参考:pg_dump 把⼀个数据库转储为纯⽂本⽂件或者是其它格式.⽤法:pg_dump [选项]... [数据库名字]⼀般选项:-f, --file=FILENAME 输出⽂件或⽬录名-F, --format=c|d|t|p 输出⽂件格式 (定制, ⽬录, tar)明⽂ (默认值))-j, --jobs=NUM 执⾏多个并⾏任务进⾏备份转储⼯作-v, --verbose 详细模式-V, --version 输出版本信息,然后退出-Z, --compress=0-9 被压缩格式的压缩级别--lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败-?, --help 显⽰此帮助, 然后退出控制输出内容选项:-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 在只恢复数据的过程中禁⽤触发器--enable-row-security 启⽤⾏安全性(只转储⽤户能够访问的内容)--exclude-table-data=TABLE 不转储指定名称的表中的数据--if-exists 当删除对象时使⽤IF EXISTS--inserts 以INSERT命令,⽽不是COPY命令的形式转储数据--no-security-labels 不转储安全标签的分配--no-synchronized-snapshots 在并⾏⼯作集中不使⽤同步快照--no-tablespaces 不转储表空间分配信息--no-unlogged-table-data 不转储没有⽇志的表数据--quote-all-identifiers 所有标识符加引号,即使不是关键字--section=SECTION 备份命名的节 (数据前, 数据, 及数据后)--serializable-deferrable 等到备份可以⽆异常运⾏--snapshot=SNAPSHOT 为转储使⽤给定的快照--strict-names 要求每个表和/或schema包括模式以匹配⾄少⼀个实体--use-set-session-authorization使⽤ SESSION AUTHORIZATION 命令代替ALTER OWNER 命令来设置所有权联接选项:-d, --dbname=DBNAME 对数据库 DBNAME备份-h, --host=主机名数据库服务器的主机名或套接字⽬录-p, --port=端⼝号数据库服务器的端⼝号-U, --username=名字以指定的数据库⽤户联接-w, --no-password 永远不提⽰输⼊⼝令-W, --password 强制⼝令提⽰ (⾃动)--role=ROLENAME 在转储前运⾏SET ROLE如果没有提供数据库名字, 那么使⽤ PGDATABASE 环境变量的数值.报告错误⾄ <pgsql-bugs@>.以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
postgresql的在线备份与恢复

postgresql同样支持在线备份,该备份方式与oracle中用户热备的方式相同,手动拷贝数据文库文件与归档日志。
可以根据测试过程将备份直接写成script,通过定制,完成数据库的自动备份。
postgresql的恢复支持基于时间戳与事务ID,可以通过时间戳或事务ID的方式,完成数据库的不完全恢复或者因错误操作的故障恢复。
该测试目的:postgresql的在线备份;通过在线备份完成恢复。
1,开启归档[postgre@daduxiong ~]$ more/usr/local/pgsql/data/postgresql.conf |grep archive_archive_mode=on # allows archiving to be donearchive_command='cp -i %p /archive/%f >/dev/null'2,重新启动数据库[root@daduxiong ~]# service postgresqlstopStopping PostgreSQL: server stoppedok[root@daduxiong ~]# service postgresqlstartStarting PostgreSQL: ok3,启动备份[postgre@daduxiong archive]$ psql postgres-c"select pg_start_backup('hot_backup');"pg_start_backup-----------------0/7000020(1row)4,使用tar命令备份数据库文件,不包含pg_xlog目录[postgre@daduxiong archive]$ tar--exclude $PGDATA/pg_xlog-cvjpf/archive/pgbackup.tar.bz2 $PGDATA5,完成备份[postgre@daduxiong archive]$ psql postgres-c"select pg_stop_backup();"pg_stop_backup----------------0/70133A0(1row)6,在postgres数据库中创建表并插入记录,作为恢复时的判断。
PostgreSQL备份与恢复技术介绍

文件快照
• Befo re 9.x • pg_start_backup&pg_stop_backup
• 全量备份(基于文件系统) • 增量备份(基于数据块LSN变更)
• 备份目标
• 主库 • 从库
PostgreSQL 备份管理 Barman
• 单对多
• SSH命令 • Rsy nc通道 • Pg_basebackup
• 元数据管理 • CRON检查
Barman备份与恢复
• 备份
• 全量备份 • WA L备 份 pg_rece ivewal / a rch ive_command
• Re co ve ry. co nf
• r e s t o r e _ c o m m a n d 获 取 WA L 日 志 • a r c h i v e _ c l e a n u p _ c o m m a n d 清 理 WA L 日 志 • recovery_end_command 恢复完成后执行的命令 • recovery_target_timeline 恢复目标时间线
• Checkpoint • Force page writes • 期 间WA L(XLO G ) • Copy on Wr ite • LVM快 照 • ZFS快照
物理备份—恢复
• Wa l重放
• pg_control中获取checkpoint信息(起点) • 逐个应用redo记录 • 新建时间线(时间点恢复)
Postgresql备份和恢复SQL转储篇

P o s t g r e s q l备份和恢复S Q L转储篇集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]Postgresql备份和恢复------SQL转储篇作者:小P来自:摘要:和任何包含珍贵数据的东西一样,PostgreSQL 数据库也应该经常备份。
备份PostgreSQL数据库有三种方法,各种方法有利有弊,本文先讲一下SQL转储的方法。
目录1. 综述;2. 数据备份;2.1 pg_dump;2.2 pg_dumpall;2.3 计划任务;3. 从转储中恢复;3.1 用pg_dump恢复;3.2 用pg_dumpall恢复;3.3 ANALYZE;4. 处理大数据库;4.1 输出大数据库;4.2 恢复大数据库;4.3 使用slipt;4.3.1 分割;4.3.2 合并;5. 关于本文;6. 更新日志;7. 参考文档;8. 相关文档;正文您是否遇到过因为不小心而删除了某个数据库表,或者是存放数据库的磁盘损坏了的情况呢?如果碰到这种情况,我相信您会觉得非常的沮丧,因为您努力了几个星期的工作成果可能就付之东流了。
和任何包含珍贵数据的东西一样,PostgreSQL 数据库也应该经常备份。
如果您将数据存放在 PostgreSQL 表中,您就可以定时的进行数据库备份,从而避免发生上面的悲剧。
PostgreSQL 自带有内置工具来执行备份工作,而且在系统出现损坏或是意外时,您可以通过这些工具进行“回滚”,并通过以前保存的快照将系统恢复到其初始的状态。
1. 综述;PostgreSQL数据库从备份 PostgreSQL 数据有三种完全不同的方法:SQL 转储文件系统级别备份在线备份每种备份都有自己的优点和缺点,下面主要介绍SQl转储的方法;2. 数据备份;SQL 转储的方法是创建一个文本文件,这个文本里面都是 SQL 命令,当把这个文件回馈给服务器时,将重建与转储时状态一样的数据库。
pg_dump实例详解(备份postgresql和greenplum数据库)

pg_dump实例详解(备份postgresql和greenplum数据库)⼀、pg_dump的⽤法:数据库的导⼊导出是最常⽤的功能之⼀,每种数据库都提供有这⽅⾯的⼯具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysqldump,⽽PostgreSQL提供的对应⼯具为pg_dump和pg_restore。
pg_dump是⽤于备份PostgreSQL数据库的⼯具。
它可以在数据库正在使⽤的时候进⾏完整⼀致的备份,并不阻塞其它⽤户对数据库的访问。
转储格式可以是⼀个脚本或者归档⽂件。
转储脚本的格式是纯⽂本,包含许多SQL命令,这些SQL命令可以⽤于重建该数据库并将之恢复到保存脚本时的状态。
可以使⽤ psql从这样的脚本中恢复。
它们甚⾄可以⽤于在其它机器甚⾄是其它硬件体系的机器上重建数据库,通过对脚本进⾏⼀些修改,甚⾄可以在其它SQL数据库产品上重建数据库。
归档⽂件格式必须和pg_restore⼀起使⽤重建数据库。
它们允许pg_restore对恢复什么东西进⾏选择,甚⾄是在恢复之前对需要恢复的条⽬进⾏重新排序。
归档⽂件也是可以跨平台移植的。
D:\Program Files\PowerCmd>pg_dump --helppg_dump 把⼀个数据库转储为纯⽂本⽂件或者是其它格式.⽤法: pg_dump [选项]... [数据库名字]⼀般选项:-f, --file=FILENAME output file or directory name-F, --format=c|d|t|p output file format (custom, directory, tar, plain text)-v, --verbose 详细模式-Z, --compress=0-9 被压缩格式的压缩级别--lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败--help 显⽰此帮助信息, 然后退出--versoin 输出版本信息, 然后退出控制输出内容选项:-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 在只恢复数据的过程中禁⽤触发器--inserts 以INSERT命令,⽽不是COPY命令的形式转储数据--no-security-labels do not dump security label assignments--no-tablespaces 不转储表空间分配信息--no-unlogged-table-data do not dump unlogged table data--quote-all-identifiers quote all identifiers, even if not key words--serializable-deferrable wait until the dump can run without anomalies--use-set-session-authorization使⽤ SESSION AUTHORIZATION 命令代替ALTER OWNER 命令来设置所有权联接选项:-h, --host=主机名数据库服务器的主机名或套接字⽬录-p, --port=端⼝号数据库服务器的端⼝号-U, --username=名字以指定的数据库⽤户联接-w, --no-password 永远不提⽰输⼊⼝令-W, --password 强制⼝令提⽰ (⾃动)--role=ROLENAME do SET ROLE before dump如果没有提供数据库名字, 那么使⽤ PGDATABASE 环境变量的数值.⼆、pg_dump的使⽤实例1、创建两个数据库CREATE DATABASE "TestDb1"WITH OWNER = "TestRole1"ENCODING = 'UTF8'TABLESPACE = "TestTbs1";CREATE DATABASE "TestDb2"WITH OWNER = "TestRole1"ENCODING = 'UTF8'TABLESPACE = "TestTbs1";在TestDb1中创建表csm_bill、cfg_public_int_transport插⼊⼏条记录,并创建索引,索引使⽤索引表空间TestTbsIndex。
Linux命令高级技巧使用pgdump备份和恢复PostgreSQL数据库

Linux命令高级技巧使用pgdump备份和恢复PostgreSQL数据库在Linux操作系统中,使用pg_dump命令可以方便地备份和恢复PostgreSQL数据库。
pg_dump是PostgreSQL自带的工具之一,它能够将数据库中的表、数据、函数等对象以可读性较高的文本格式输出到文件中,同时可以使用pg_restore工具将备份文件中的数据恢复到数据库中。
本文将介绍如何使用pg_dump备份和恢复PostgreSQL数据库,并结合一些高级技巧,帮助读者更加灵活地处理数据库备份和恢复的需求。
一、备份PostgreSQL数据库要备份PostgreSQL数据库,可以使用以下命令格式:pg_dump -h 主机名 -p 端口号 -U 用户名 -F 格式 -f 文件名数据库名1. 主机名:指定数据库所在的主机名或IP地址。
2. 端口号:指定PostgreSQL服务的端口号,默认为5432。
3. 用户名:连接数据库的用户名。
4. 格式:指定备份文件的格式,常用的格式有两种,一种是普通的文本格式(plain),该格式会生成一个可读性较高的文本文件;另一种是自定义的归档格式(custom),该格式会生成一个二进制文件,一般用于备份大型数据库。
5. 文件名:指定备份文件的保存路径和文件名。
6. 数据库名:要备份的数据库的名称。
下面举个例子,假设要备份名为"mydatabase"的数据库到"/backup/mydatabase_backup.sql"文件中,通过以下命令来完成备份:pg_dump -h localhost -p 5432 -U postgres -F plain -f/backup/mydatabase_backup.sql mydatabase执行命令后,pg_dump会连接数据库并将备份内容写入到指定文件中。
备份文件是一个文本文件,可以使用文本编辑器打开查看,也可以通过pg_restore命令来恢复数据库。
Postgresql备份和恢复

Postgresql备份和恢复和任何包含珍贵数据的东西一样,PostgreSQL 数据库也应该经常备份。
尽管这个过程相当简单,但是我们还是应该理解做这件事所用的一些技巧和假设。
备份PostgreSQL 数据有三种完全不同的方法:SQL 转储文件系统级别备份在线备份每种备份都有自己的优点和缺点。
SQL 转储SQL 转储的方法采用的主意是创建一个文本文件,这个文本里面都是SQL 命令,当把这个文件回馈给服务器时,将重建与转储时状态一样的数据库。
PostgreSQL 为这个用途提供了应用工具pg_dump。
这条命令的基本用法是:pg_dump dbname > outfile正如你所见,pg_dump 把结果输出到标准输出。
我们下面就可以看到这样做有什么好处。
pg_dump 是一个普通的PostgreSQL 客户端应用(尽管是个相当聪明的东西。
)这就意味着你可以从任何可以访问该数据库的远端主机上面进行备份工作。
但是请记住pg_dump 不会以任何特殊权限运行。
具体说来,就是它必须要有你想备份的表的读权限,因此,实际上你几乎总是要成为数据库超级用户。
要声明pg_dump 应该以哪个用户身份进行联接,使用命令行选项-h host 和-p port。
缺省主机是本地主机或你的环境变量PGHOST声明的值。
类似,缺省端口是环境变量PGPORT或(如果它不存在的话)编译好了的缺省值。
(服务器通常有相同的缺省,所以还算方便。
)和任何其他PostgreSQL 客户端应用一样,pg_dump 缺省时用与当前操作系统用户名同名的数据库用户名进行联接。
要覆盖这个名字,要么声明-U 选项,要么设置环境变量PGUSER。
请注意pg_dump 的联接也和普通客户应用一样要通过客户认证机制。
由pg_dump 创建的备份在内部是一致的,也就是说,在pg_dump运行的时候对数据库的更新将不会被转储。
pg_dump 工作的时候并不阻塞其他的对数据库的操作。
数据库服务器 之 Postgresql备份和恢复

数据库服务器之 Postgresql备份和恢复.txt38当乌云布满天空时,悲观的人看到的是“黑云压城城欲摧”,乐观的人看到的是“甲光向日金鳞开”。
无论处在什么厄运中,只要保持乐观的心态,总能找到这样奇特的草莓。
数据库服务器之 Postgresql备份和恢复您是否遇到过因为不小心而删除了某个数据库表,或者是存放数据库的磁盘损坏了的情况呢?如果碰到这种情况,我相信您会觉得非常的沮丧,因为您努力了几个星期的工作成果可能就付之东流了。
和任何包含珍贵数据的东西一样,PostgreSQL数据库也应该经常备份。
如果您将数据存放在 PostgreSQL 表中,您就可以定时的进行数据库备份,从而避免发生上面的悲剧。
PostgreSQL 自带有内置工具来执行备份工作,而且在系统出现损坏或是意外时,您可以通过这些工具进行“回滚”,并通过以前保存的快照将系统恢复到其初始的状态。
1. 综述;PostgreSQL数据库从备份 PostgreSQL 数据有三种完全不同的方法:SQL 转储文件系统级别备份在线备份每种备份都有自己的优点和缺点,下面主要介绍SQl转储的方法;2. 数据备份;SQL 转储的方法是创建一个文本文件,这个文本里面都是 SQL 命令,当把这个文件回馈给服务器时,将重建与转储时状态一样的数据库。
2.1 pg_dump;PostgreSQL 自带的内置备份工具叫做 pg_dump。
这个工具是通过一系列的SQL语句读取某个指定的数据库并复制其中的内容,以它作为快照并用于日后的数据恢复。
客户端到服务器端的连接是用于执行备份工作。
这些备份文件就是前面所讲的快照并可以用于日后的数据恢复。
而保证客户端与服务器端的连接是执行备份所必需的。
这条命令的基本用法是:pg_dump dbname > outfile注:在进行上述工作之前,首先请确保您具有登录到服务器并访问您将要备份的数据库或表的权限。
您可以通过使用PostgreSQL 命令行客户端——psql,进行服务器登录。
PostgreSQL备份和恢复

Chapter 23. 备份和恢复Table of Contents23.1. SQL 转储23.1.1. 从转储中恢复23.1.2. 使用 pg_dumpall23.1.3. 处理大数据库23.2. 文件系统级别的备份23.3. 在线备份以及即时恢复(PITR)23.3.1. 设置 WAL 归档23.3.2. 进行一次基础备份23.3.3. 从在线备份中恢复23.3.4. 时间线23.3.5. 注意23.4. 在不同版本之间迁移和任何包含珍贵数据的东西一样,PostgreSQL 数据库也应该经常备份。
尽管这个过程相当简单,但是我们还是应该理解做这件事所用的一些技巧和假设。
备份 PostgreSQL 数据有三种完全不同的方法:∙SQL 转储∙文件系统级别备份∙在线备份每种备份都有自己的优点和缺点。
23.1. SQL 转储SQL 转储的方法采用的主意是创建一个文本文件,这个文本里面都是 SQL 命令,当把这个文件回馈给服务器时,将重建与转储时状态一样的数据库。
PostgreSQL 为这个用途提供了应用工具pg_dump。
这条命令的基本用法是:pg_dump dbname>outfile正如你所见,pg_dump 把结果输出到标准输出。
我们下面就可以看到这样做有什么好处。
pg_dump 是一个普通的 PostgreSQL 客户端应用(尽管是个相当聪明的东西。
)这就意味着你可以从任何可以访问该数据库的远端主机上面进行备份工作。
但是请记住 pg_dump 不会以任何特殊权限运行。
具体说来,就是它必须要有你想备份的表的读权限,因此,实际上你几乎总是要成为数据库超级用户。
要声明 pg_dump 应该以哪个用户身份进行联接,使用命令行选项 -h host和-p port。
缺省主机是本地主机或你的环境变量PGHOST声明的值。
类似,缺省端口是环境变量PGPORT或(如果它不存在的话)编译好了的缺省值。
(服务器通常有相同的缺省,所以还算方便。
Postgresql备份和增量恢复方案

Postgresql备份和增量恢复⽅案前⾔最近⼯作上使⽤的数据库⼀直是Postgresql,这是⼀款开源的数据库,⽽且任何个⼈可以将该数据库⽤于商业⽤途。
在使⽤Postgresql的时候,让我最明显的感觉就是这数据库做的真⼼好,虽然说数据库的安装包真的很⼩,但是性能和操作的便捷是⼀点也不输给其他商业的⼤型数据库,另外在命令⾏界⾯下对该数据库直接进⾏操作的感觉真的是很爽。
在使⽤数据库的时候,我们作为⼩公司的数据库管理员有⼀项⼯作是不可能避免的,那就是数据的备份和恢复问题。
PostgreSQL虽然各个⽅⾯的有点很多,但是在数据库备份这⽅⾯,它是不⽀持增量备份的,这点确实让⼈觉得很是可惜啊。
不过,瑕不掩瑜,总的来说这是⼀款很好的数据库软件。
之前,我们在《》⼀节中,部署了Postgresql的主从异步流复制环境。
主从复制的⽬的是为了实现数据的备份,实现数据的⾼可⽤性和容错⾏。
下⾯主要简单地介绍下我们运维Postgresql数据库时的场景备份与恢复⽅案。
增量备份PostgreSQL在做写⼊操作时,对数据⽂件做的任何修改信息,⾸先会写⼊WAL⽇志(预写⽇志),然后才会对数据⽂件做物理修改。
当数据库服务器掉重启时,PostgreSQL在启动时会⾸先读取WAL⽇志,对数据⽂件进⾏恢复。
因此,从理论上讲,如果我们有⼀个数据库的基础备份(也称为全备),再配合WAL⽇志,是可以将数据库恢复到任意时间点的。
上⾯的知识点很重要,因为我们场景的增量备份说⽩了就是通过基础备份 + 增量WAL⽇志进⾏重做恢复的。
增量备份设置为了演⽰相关功能,我们基于《》⼀节中的环境pghost1服务器上,创建相关管理⽬录切换到 postgres ⽤户下mkdir -p /data/pg10/backupsmkdir -p /data/pg10/archive_walsbackups⽬录则可以⽤来存放基础备份archive_wals⽬录⾃然⽤来存放归档了接下来我们修改我们的postgresql.conf⽂件的相关设置wal_level = replicaarchive_mode = onarchive_command = '/usr/bin/lz4 -q -z %p /data/pg10/archive_wals/%f.lz4'archive_command 参数的默认值是个空字符串,它的值可以是⼀条shell命令或者⼀个复杂的shell脚本。
PostgreSql备份和恢复

PostgreSql备份和恢复PostgreSql备份和恢复pg_dump --helppg_dump dumps a database as a text file or to other formats.Usage:pg_dump [OPTION]... [DBNAME]General options:-f, --file=FILENAME output file or directory name-F, --format=c|d|t|p output file format (custom, directory, tar, plain text (default))-j, --jobs=NUM use this many parallel jobs to dump-v, --verbose verbose mode-V, --version output version information, then exit-Z, --compress=0-9 compression level for compressed formats--lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock-?, --help show this help, then exitOptions controlling the output content:-a, --data-only dump only the data, not the schema-b, --blobs include large objects in dump-c, --clean clean (drop) database objects before recreating -C, --create include commands to create database in dump -E, --encoding=ENCODING dump the data in encoding ENCODING-n, --schema=SCHEMA dump the named schema(s) only-N, --exclude-schema=SCHEMA do NOT dump the named schema(s)-o, --oids include OIDs in dump-O, --no-owner skip restoration of object ownership inplain-text format-s, --schema-only dump only the schema, no data-S, --superuser=NAME superuser user name to use in plain-text format-t, --table=TABLE dump the named table(s) only-T, --exclude-table=TABLE do NOT dump the named table(s) -x, --no-privileges do not dump privileges (grant/revoke)--binary-upgrade for use by upgrade utilities only--column-inserts dump data as INSERT commands with column names --disable-dollar-quoting disable dollar quoting, use SQL standard quoting--disable-triggers disable triggers during data-only restore --exclude-table-data=TABLE do NOT dump data for the named table(s)--if-exists use IF EXISTS when dropping objects--inserts dump data as INSERT commands, rather than COPY --no-security-labels do not dump security label assignments --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs--no-tablespaces do not dump tablespace assignments--no-unlogged-table-data do not dump unlogged table data --quote-all-identifiers quote all identifiers, even if not key words--section=SECTION dump named section (pre-data, data, or post-data)--serializable-deferrable wait until the dump can run without anomalies--use-set-session-authorizationuse SET SESSION AUTHORIZATION commands instead ofALTER OWNER commands to set ownershipConnection options:-d, --dbname=DBNAME database to dump-h, --host=HOSTNAME database server host or socket directory-p, --port=PORT database server port number-U, --username=NAME connect as specified database user-w, --no-password never prompt for password-W, --password force password prompt (should happen automatically)--role=ROLENAME do SET ROLE before dumpIf no database name is supplied, then the PGDATABASE environmentvariable value is used.Report bugs to .博客分类:PostgreSql有三种不同的备份方法:SQL dump文件系统级备份(File system level backup)连续归档(Continuous archiving)每种都有优势和劣势。
Postgresql命令行和数据库备份与恢复

Postgresql命令⾏和数据库备份与恢复进⼊Postgresql1 进⼊默认安装会创建postgres ⽤户,,使⽤postgres⽤户,psql命令会直接进⼊数据库:Bash代码$ su postgres //psql⽤户$ psql //默认可直接进⼊$ psql -U posrgres -d dbname //使⽤psql命令进去如数据库管理2 显⽰数据库Bash代码$ \l3 选择使⽤某数据库Bash代码\c dbname4 显⽰数据表Bash代码$ \dt5为postgres⽤户添码Bash代码$ \password postgre修改 vim /etc/postgresql/9.1/main/pg_hba.conf 中的 peer 模式为 md5命令⾏常⽤操作1.createdb 数据库名称产⽣数据库2.dropdb 数据库名称删除数据库3.CREATE USER ⽤户名称创建⽤户4.drop User ⽤户名称删除⽤户5.SELECT usename FROM pg_user;查看系统⽤户信息\du7.SELECT version();查看版本信息8.psql 名打开psql交互⼯具9.mydb=> \i basics.sql\i 命令从指定的⽂件中读取命令。
10.COPY weather FROM '/home/user/weather.txt';批量将⽂本⽂件中内容导⼊到wether表11.SHOW search_path;显⽰搜索路径12.创建⽤户CREATE USER ⽤户名 WITH PASSWORD '密码'13.创建模式CREATE SCHEMA myschema;14.删除模式DROP SCHEMA myschema;15.查看搜索模式SHOW search_path;16.设置搜索模式SET search_path TO myschema,public;17.创建表空间create tablespace 表空间名称 location '⽂件路径';18.显⽰默认表空间show default_tablespace;19.设置默认表空间set default_tablespace=表空间名称;20.指定⽤户登录psql MTPS -u21.显⽰当前系统时间、now()Postgresql备份与导⼊1 备份。
PostgreSQL热备和恢复

PostgreSQL热备和恢复PostgreSQL的PITR技术(Point-In-Time-Recovery)–Seamus Dean 2005-04-11(at PostgreSQL-8.0.2 release)为什么要写这篇文章?因为我看了一下,国内所有的PostgreSQL教程都没有很详细的介绍该功能,而相反,国内的Oracle文章对这块非常的看重。
虽然,PostgreSQL的官方文档有一个章节是介绍这块内容的,但是写得太过‘文学’化。
的确,一个数据库的可靠性和完整性是非常重要的,否则,很难叫人们所接受它。
本文假设读者对PostgreSQL已经有基本的认识,如果你对PostgreSQL还完全不熟悉的话,建议你先去看看它的Documentation.作为最强大的开源数据库,PostgreSQL拥有一切商业数据库所拥有的功能,甚至比商业数据库更好。
在以前的版本中,它在数据恢复,可靠性方面做的不太好,但经过最近几年的发展,已经可以和Oracle媲美了。
在PostgreSQL7的时候就引入了WAL(Write Ahead Logging)的概念,即预写日志,所有对数据库的更改,在更改之前必须写到该LOG中,这样,就算机器断电,PostgreSQL也可以从该LOG中知道数据库在断电前做了什么操作,已经做到第几步了,这样保证了所有事务的完整性,但PostgreSQL7没有提供很好的灾难恢复机制,一旦数据库崩溃,除非你曾经对数据库作过pg_dump或者file system level backup,否则,你的数据将全部丢失,并且,就算你曾经对数据库做过备份,也只能恢复到你备份的那一刻的数据,这对一个生产数据库(特别是24*7生产库)来说,是无法容忍的。
PostgreSQL8的推出,使PostgreSQL的稳定性和可靠性又迈出了划时代的一步。
除了提供对tablespace的支持外,PostgreSQL8提供了支持时间点的恢复—PITR. 其基本原理和Oracle的热备份完全一样:首先,对数据库在file system level做一个backup(PostgreSQL是首先用pg_start_backup(‘label’)命令,然后用tar直接tar整个data目录,假设命名为base.tar,然后pg_stop_backup();结束热备。
MySQL备份与恢复之热备(3)

MySQL备份与恢复之热备(3)在上两篇⽂章(MySQL备份与恢复之冷备,MySQL备份与恢复之真实环境使⽤冷备)中,我们提到了冷备和真实环境中使⽤冷备。
那从这篇⽂章开始我们看下热备。
显然热备和冷备是两个相对的概念,冷备是把数据库服务,⽐如MySQL,Oracle停下来,然后使⽤拷贝、打包或者压缩命令对数据⽬录进⾏备份;那么我们很容易想到热备就是在MySQL或者其他数据库服务在运⾏的情况下进⾏备份。
但是,这⾥存在⼀个问题,因为⽣产库在运⾏的情况下,有对该库的读写,读写频率有可能⾼,也可能低,不管频率⾼低,总会就会造成备份出来的数据和⽣产库中的数据不⼀致的情况。
热备这段时间,其他⼈不可以操作是不现实的,因为你总不可能终⽌⽤户访问Web程序。
要解决这个问题,可以采⽤指定备份策略,⽐如哪个时间段进⾏备份,备份哪些数据等等,总之,保证数据的完整性和⼀致性,切记,备份重于⼀切热备可以对多个库进⾏备份,可以对单张表或者某⼏张表进⾏备份。
但是⽆法同时备份多个库多个表,只有分开备份。
下⾯我们看下热备的⽰意图,并进⾏热备模拟。
⽰意图热备模拟1、对单个库进⾏备份第⼀步,移除LVM快照。
(如果没有创建,忽略此步)[root@serv01 data]# lvremove /dev/data/smydataDo you really want to remove active logical volume smydata? [y/n]: yLogical volume "smydata" successfully removed第⼆步,设置MySQL的密码mysql> set password=password("123456");Query OK, 0 rows affected (0.00 sec)第三步,查看MySQL是否启动。
因为是热备,所以要求MySQL服务启动[root@serv01 data]# /etc/init.d/mysqld statusSUCCESS! MySQL running (2664)第四步,导出单个数据库[root@serv01 data]# cd /databackup/#本质是导出为SQL[root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb-- MySQL dump 10.13 Distrib 5.5.29, for Linux (x86_64)---- Host: localhost Database: larrydb-- -------------------------------------------------------- Server version 5.5.29-log/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;---- Current Database: `larrydb`--CREATE DATABASE /*!32312 IF NOT EXISTS*/ `larrydb` /*!40100 DEFAULT CHARACTER SET latin1 */;USE `larrydb`;---- Table structure for table `class`--DROP TABLE IF EXISTS `class`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `class` (`cid` int(11) DEFAULT NULL,`cname` varchar(30) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `class`--LOCK TABLES `class` WRITE;/*!40000 ALTER TABLE `class` DISABLE KEYS */;INSERT INTO `class` VALUES (1,'linux'),(2,'oracle');/*!40000 ALTER TABLE `class` ENABLE KEYS */;UNLOCK TABLES;---- Table structure for table `stu`--DROP TABLE IF EXISTS `stu`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `stu` (`sid` int(11) DEFAULT NULL,`sname` varchar(30) DEFAULT NULL,`cid` int(11) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;/*!40101 SET character_set_client = @saved_cs_client */;---- Dumping data for table `stu`--LOCK TABLES `stu` WRITE;/*!40000 ALTER TABLE `stu` DISABLE KEYS */;INSERT INTO `stu` VALUES (1,'larry01',1),(2,'larry02',2);/*!40000 ALTER TABLE `stu` ENABLE KEYS */;UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;Dump completed on 2013-09-10 18:56:06#将输出结果保存到⽂件中[root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb > larrydb.sql 第五步,模拟数据丢失,进⼊MySQL,删除数据库[root@serv01 data]# mysql -uroot -p123456Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.5.29-log Source distributionCopyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || crm || game || hello || larrydb || mnt || mysql || performance_schema || test |+--------------------+9 rows in set (0.00 sec)mysql> drop database larrydb;Query OK, 2 rows affected (0.01 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || crm || game || hello || mnt || mysql || performance_schema || test |+--------------------+8 rows in set (0.00 sec)mysql> exitBye第六步,导⼊数据[root@serv01 databackup]# mysql -uroot -p123456 <larrydb.sql第七步,登录MySQL,查看数据是否正常[root@serv01 data]# mysql -uroot -p123456Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 6Server version: 5.5.29-log Source distributionCopyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show database;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1 mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || crm || game || hello || larrydb || mnt || mysql || performance_schema || test |+--------------------+9 rows in set (0.00 sec)mysql> use larrydb;Database changedmysql> select * from class;+------+--------+| cid | cname |+------+--------+| 1 | linux || 2 | oracle |+------+--------+2 rows in set (0.00 sec)mysql> select * from stu;+------+---------+------+| sid | sname | cid |+------+---------+------+| 1 | larry01 | 1 || 2 | larry02 | 2 |+------+---------+------+2 rows in set (0.00 sec)对多个库进⾏备份第⼀步,查看有哪些数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || crm || game || hello || larrydb || mnt || mysql || performance_schema || test |+--------------------+9 rows in set (0.00 sec)mysql> use game;Database changedmysql> show tables;+----------------+| Tables_in_game |+----------------+| country || fight || hero |+----------------+3 rows in set (0.00 sec)mysql> select * from country;+-----+---------+----------+| cno | cname | location |+-----+---------+----------+| 10 | caowei | luoyang || 20 | shuhan | chengdou || 30 | sunwu | nanjing || 40 | houhan | luoyang || 50 | beisong | kaifeng || 60 | 魏国 | 洛阳 |+-----+---------+----------+6 rows in set (0.00 sec)第⼆步,备份多个库[root@serv01 databackup]# mysqldump -uroot -p123456 --databases larrydb game > larrydb_game.sql [root@serv01 databackup]# ll larrydb_game.sql-rw-r--r--. 1 root root 6159 Sep 10 19:05 larrydb_game.sql第三步,模拟数据丢失。
PostgreSQL备份与恢复

PostgreSQL备份与恢复PostgreSQL⾃带⼀个客户端pgAdmin,⾥⾯有个备份,恢复选项,也能对数据库进⾏备份恢复(还原),其实PostgreSQL内置不少的⼯具,寻找的备份恢复⽅案就在其中:pg_dump,psql。
在数据库的安装⽬录下,如:C:\Program Files\PostgreSQL\bin⽂件夹,会看到不少的exe⽂件,这就是PostgreSQL内置的⼯具了。
⾥⾯会找到 pg_dump.exe,psql.exe两个⽂件。
我们怎么⽤他们?⽤法:备份数据库,指令如下:pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak开始-运⾏-cmd 弹出dos控制台;然后在控制台⾥,进⼊PostgreSQL安装⽬录bin下:cd C:\Program Files\PostgreSQL\9.0\bin最后执⾏备份指令:pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak恢复数据库例:c:\pgsql\bin pg_restore -h localhost -p 5432 -U postgres -d yy_ly -Fc "f:\yy_ly.dump"-h 服务器地址-p 端⼝号-U ⽤户号-d 数据库名字 database-F, --format=c|d|t 备份⽂件格式(应该⾃动进⾏)其中--format=c|d|t c 代表定制custor d 代表⽬录 t 代表 tar 压缩⽂件========================================================D:\Program Files\pgsql\bin>pg_restore --helppg_restore 从⼀个归档中恢复⼀个由 pg_dump 创建的 PostgreSQL 数据库.⽤法:pg_restore [选项]... [⽂件名]⼀般选项:-d, --dbname=名字连接数据库名字-f, --file=⽂件名输出⽂件名(- 对于stdout)-F, --format=c|d|t 备份⽂件格式(应该⾃动进⾏)-l, --list 打印归档⽂件的 TOC 概述-v, --verbose 详细模式-V, --version 输出版本信息, 然后退出-?, --help 显⽰此帮助, 然后退出恢复控制选项:-a, --data-only 只恢复数据, 不包括模式-c, --clean 在重新创建之前,先清除(删除)数据库对象-C, --create 创建⽬标数据库-e, --exit-on-error 发⽣错误退出, 默认为继续-I, --index=NAME 恢复指定名称的索引-j, --jobs=NUM 执⾏多个并⾏任务进⾏恢复⼯作-L, --use-list=FILENAME 从这个⽂件中使⽤指定的内容表排序输出-n, --schema=NAME 在这个模式中只恢复对象-N, --exclude-schema=NAME 不恢复此模式中的对象-O, --no-owner 不恢复对象所属者-P, --function=NAME(args) 恢复指定名字的函数-s, --schema-only 只恢复模式, 不包括数据-S, --superuser=NAME 使⽤指定的超级⽤户来禁⽤触发器-t, --table=NAME 恢复命名关系(表、视图等)-T, --trigger=NAME 恢复指定名字的触发器-x, --no-privileges 跳过处理权限的恢复 (grant/revoke)-1, --single-transaction 作为单个事务恢复--disable-triggers 在只恢复数据的过程中禁⽤触发器--enable-row-security 启⽤⾏安全性--if-exists 当删除对象时使⽤IF EXISTS--no-comments 不恢复注释--no-data-for-failed-tables 对那些⽆法创建的表不进⾏数据恢复--no-publications 不恢复发⾏--no-security-labels 不恢复安全标签信息--no-subscriptions 不恢复订阅--no-tablespaces 不恢复表空间的分配信息--section=SECTION 恢复命名节 (数据前、数据及数据后)--strict-names 要求每个表和(或)schema包括模式以匹配⾄少⼀个实体--use-set-session-authorization使⽤ SESSION AUTHORIZATION 命令代替ALTER OWNER 命令来设置所有权联接选项:-h, --host=主机名数据库服务器的主机名或套接字⽬录-p, --port=端⼝号数据库服务器的端⼝号-U, --username=名字以指定的数据库⽤户联接-w, --no-password 永远不提⽰输⼊⼝令-W, --password 强制⼝令提⽰ (⾃动)--role=ROLENAME 在恢复前执⾏SET ROLE操作选项 -I, -n, -N, -P, -t, -T, 以及 --section 可以组合使⽤和指定多次⽤于选择多个对象.⽰例:D:\Program Files\pgsql\bin>pg_restore -h localhost -p 5432 -U postgres -d yy_ly -Fc "f:\yy_ly.dump"⼀、备份:导出命令:pg_dump [OPTION]… [DBNAME]查看使⽤帮助:pg_dump –help主要参数解释:关键字说明(默认值)-h, –host=HOSTNAME 数据库服务器IP-p, –port=PORT 数据库服务器端⼝号-U, –username=NAME ⽤户名-W, –password 密码-F, –format=c|t|p 输出⽂件格式(custom,tar,plain text)-v, –verbose 详细信息模式,会显⽰备份时的信息-f, –file=FILENAME 输出⽂件名-b, –blobs 在dump⽂件中包含⼤对象。
分布式数据库中的数据冷热备份与数据恢复(三)

数据备份与恢复是分布式数据库管理中的重要环节。
在分布式数据库中,数据的冷热备份和数据的恢复是确保数据安全性和可靠性的关键步骤。
本文将从数据备份的定义和原理,数据恢复的策略和技术,以及备份与恢复的挑战和未来发展等角度讨论分布式数据库中的数据备份与恢复问题。
一、数据备份的定义和原理数据备份是指将数据库中的数据复制到其他存储介质或设备上,以防止数据丢失或损坏。
数据备份是保障数据库安全性的重要手段,可以帮助解决病毒入侵、硬件故障、人为错误等情况下的数据丢失问题。
在分布式数据库中,数据备份需要考虑数据分布和数据一致性的问题。
一般来说,数据备份可以分为冷备份和热备份两种方式。
冷备份是指在数据库关闭状态下进行备份,即将数据库中的数据完整复制到备份设备上。
冷备份的优点是备份过程对数据库操作没有任何干扰,但其缺点是备份时间较长,会导致数据库长时间不可用。
热备份是指在数据库运行状态下进行备份,即备份数据库中正在使用的数据。
热备份的优点是备份时间较短,对数据库的影响较小,但其缺点是备份过程中可能会导致数据库性能下降。
分布式数据库的数据备份可以采用增量备份和全量备份相结合的方式。
增量备份只备份发生变化的数据,可以减少备份时间和存储空间的占用。
全量备份则备份整个数据库,可以确保备份数据的完整性和一致性。
二、数据恢复的策略和技术数据恢复是指在数据库发生故障或数据丢失时,通过一系列的操作和技术手段将备份数据恢复到原始数据库中。
数据恢复是保障数据库可靠性和可用性的关键环节。
在分布式数据库中,数据恢复可以采用以下策略和技术:1. 冷备份恢复:将冷备份的数据直接恢复到数据库中。
这种方式适用于数据库损坏或数据丢失严重的情况,但恢复时间较长。
2. 热备份恢复:将热备份的增量数据恢复到数据库中。
这种方式适用于数据丢失较小的情况,可以快速恢复数据库。
3. 日志恢复:通过数据库的日志文件,将数据恢复到故障发生之前的状态。
这种方式适用于数据库发生部分数据丢失的情况,可以减少数据恢复的时间和影响范围。
postgresql和mysql数据库备份恢复以及时区问题

postgresql和mysql数据库备份恢复以及时区问题•概要•postgesql 12o备份/恢复脚本o时区设置•mysql 5.6o备份/恢复脚本o时区设置概要postgresql 和 mysql 是最常用的 2 种开源关系数据库, 很多项目也会优先选用这 2 种数据库.通过 docker 来使用这 2 种数据库的时候, 部署非常方便, 没什么好说的. 这里简单总结下数据库的备份/恢复和时区设置问题. postgesql 12备份/恢复脚本1 DOCKER_CONTAINER=pg122 DATE=`date +%Y%m%d-%H%M`3 BACK_DATA=${DOCKER_CONTAINER}-data-${DATE}.out4 docker exec ${DOCKER_CONTAINER} pg_dumpall -U postgres > ${BACK_DATA}56 echo "docker cp ${BACK_DATA} ${DOCKER_CONTAINER}:/tmp" > restore-data.sh7 echo "docker exec ${DOCKER_CONTAINER} psql -U postgres -f /tmp/${BACK_DATA} postgres" >> restore-data.sh 其中 DOCKER_CONTAINER 可以配置成自己的数据库 docker 的名称备份之后, 会生成对应的恢复脚本.时区设置docker 中的数据库默认都是配置的 UTC 时区, 和中国差 8 个小时.通过修改配置文件, 可以将默认时区改成中国的时区.把 docker 中 /var/lib/postgresql/data/postgresql.conf 文件拷贝出来, 并修改如下 2 条:log_timezone = 'PRC'timezone = 'PRC'启动的 docker-compose.yml 中, 加上对应 volume 配置:services:postgres:image: postgres:12restart: alwaysports:- "5432:5432"volumes:- db_data:/var/lib/postgresql/data- ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf environment:POSTGRES_PASSWORD: mypasswordmysql 5.6备份/恢复脚本1 DOCKER_CONTAINER=mysqldb2 DB_NAME=db13 DATE=`date +%Y%m%d-%H%M`4 BACK_DATA=${DOCKER_CONTAINER}-${DB_NAME}-${DATE}.sql5 docker exec ${DOCKER_CONTAINER} mysqldump -uroot -pxxx --databases ${DB_NAME} > ${BACK_DATA}67 echo "docker cp ${BACK_DATA} ${DOCKER_CONTAINER}:/tmp" > restore-data.sh8 echo "docker exec ${DOCKER_CONTAINER} mysql -uroot -pxxx -D ${DB_NAME} < /tmp/${BACK_DATA}" >> restore-data.sh 其中 DOCKER_CONTAINER 可以配置成自己的数据库 docker 的名称 DB_NAME 可以配置需要备份的数据库名称备份之后, 会生成对应的恢复脚本.时区设置mysql 的时区配置比较简单, 可以不改配置文件, 在docker-compose.yml 中做如下修改就行:mysql-db:image: mysql:5.7restart: alwaysports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: mypasswordvolumes:-/usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Sh anghaipostgresql 和 mysql 数据库备份恢复以及时区问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PostgreSQL多版本的秘密 PostgreSQL的多版本
什么?PostgreSQL没有回滚段!!! 是的,没有回滚段。旧数据是放在原有数据文件中的 如果放在原有的数据文件中,旧数据越来越多怎么办? • 垃圾回收操作vacuum来做这个事。 • 有自动垃圾回收autovacuum 更新操作中新行的物理位置发生了变化,非更新列的索引是 不是也要更新? • 通常不会,HOT技术。如果原有的数据块之间有空间,旧 行与新行之间会建一个链接,索引上仍然指向旧的数据行 。 垃圾回收的代价会不会影响性能? • 有很多参数控制这个影响:vacuum_cost_delay, vacuum_cost_limit
当数据库实例异常终止后,重启实例时会恢复到被异常终止 时的状态 • 实例能正常启动 • 已提交事务的数据还在 导致数据库实例异常终止的原因 • 被kill掉,如内存不足时被OOM Killer给kill掉了 • 操作系统崩溃 • 硬件故障导致机器停机或重启
实例恢复与热备份基础 实例恢复的原理
PostgreSQL实例恢复的总体设计
记录上次checkpoint点时 WAL日志的位置。 文件为global/pg_control
记录重做日志,每次事务 提交后,所做操作必须先 持久化到此文件中。 在目录pg_xlog下
控制文件
WAL文件
数据文件
事务ቤተ መጻሕፍቲ ባይዱ态文件
记录每个事务的状态,是 提交还是已回滚,具体见 后面的多版本实现。 文件在目录pg_clog下
PostgreSQL实例恢复与热备 份技术内幕
唐成@大象会 2015 Postgres 用户大会
自我介绍 姓名:唐成,网名osdba 杭州沃趣网络科技有限公司首席数据库架构师 《PostgreSQL修炼之道:从小工到专家》作者 专注于数据库、存储领域 历任网易开发专家、阿里巴巴高级数据库专家 关注我
每项操作记录到重做日志中,实例重新启动后,重演(replay )日志,这个动作称为“前滚” “前滚”完成后,多数数据库还会把未完成的事务取消掉, 就象这些事务从来没有执行过一样。这个动作称之为“回滚 ” 在“前滚”过程中,数据库是不能被用户访问的。 每次“前滚”时,从哪个点开始? • Checkpoint点的概念登场了:保证Checkpoint点之前的数据 已持久化了。 • 发生Checkpoint点的周期通常在几分钟
时间线:英文为timeline,是以1开 始的递增数字,如1,2,3... LogId:32bit长的一个数字,是以0 开始递增的数字,如0,1,2,3...。实际 为LSN的高32bit LogSeg:32bit长的一个数字,是以 0开始递增的数字,如0,1,2,3...。 LogSeg是LogSeg是LSN的低32bit的 字节的值再除以WAL文件大小( 16M)的结果。注意:当LogId为0 时,LogSeg是从1开始的。
事务提交后,所做操作不必 马上持久化,但checkpoint 点之前的数据必须持久化到 数据文件中 所在目录: base/<dboid>/<relfileno de>
WAL日志文件的秘密
WAL文件名称的秘密
WAL文件的默认大小为 16M。如果改变需要重新 编译程序 LSN(Log Sequence Number):WAL日志的 绝对位置 文件名由24字符组成
实例恢复与热备份基础 热备份的原理
把正在运行的数据库中的数据文件直接拷贝出来,然后把拷 贝开始到结束之间的重做日志重新执行一遍,就能把数据库 推到一个一致点。 但存在以下问题? • 如果正在运行的数据库正在写一个数据块,而你正在读这 个数据块,有可能你读到的数据块的前半部分是新数据而 后半部分是旧数据。 解决办法: • 读的过程中,如果发现读出的数据块是不一致的,则再次 读。 • 重做日志中有此块的一个基础备份,即使不一致,则会用 日志中的块覆盖。
00000001 00000000 00000086 时间线 LogId LogSeg
具体可见:/534.html
WAL日志文件的秘密 WAL日志文件什么时候删除?
在做一次checkpoint时,checkpoint之前的WAL日志文件会被 “删除” 通常并不是真的“删除”,而是被复用,被改名成新的一个 WAL文件。为什么? pg_xlog下面序号最大的文件并不是当前正在写的WAL文件, 而有可能是刚被改名过来的旧WAL文件。 直接改名过来的旧WAL文件,并不会把原来的内容清零,这 是否会有问题? • 每条WAL记录上有LSN。 改名是直接rename吗? • 不是,建立一个新的硬链接,然后删除旧的文件
提纲
1 2 3 4 5
实例恢复与热备份基础 PostgreSQL实例恢复总体设计 WAL日志文件的秘密 PostgreSQL多版本的秘密 控制文件中的秘密
实例恢复与热备份基础 什么是实例恢复?
PostgreSQL多版本的秘密 PostgreSQL事务ID秘密
常常被称为xid • 无符号的32bit的数字表示 • 每产生一个事务,就会加1,到达最大值后,又重新开始 。 如何知道事务是提交了还是回滚了? • 事务的状态记录在commitlog中,即pg_clog目录下的文件 中 • 每个事务的状态用两个bit来表示: