Postgresql备份和恢复
- 格式:doc
- 大小:25.15 KB
- 文档页数:22
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备份⼯具pgBackRest使⽤详解前⾔pgBackRest是⼀款开源的备份还原⼯具,⽬标旨在为备份和还原提供可靠易⽤的备份。
特性并⾏备份和还原备份操作期间压缩通常是其瓶颈所在。
pgBackRest通过并⾏处理解决了备份期间压缩出现的瓶颈问题。
本地远程操作⾃定义协议允许 pgBackRest以最⼩化配置通过SSH在本地或者远程执⾏备份、还原和归档。
并且该程序也通过协议层提供了PostgreSQL查询接⼝,以便于必须要再远程访问PostgreSQL,从⽽保证了其安全性能。
全量,增量和差异备份⽀持全量,增量和差异备份。
pgBackRest不受异步时间影响,因此差异和增量备份完全安全。
备份保留策略和和归档过期⽀持保留策略设置可以在任意时间创建全备和差异备份的覆盖。
备份完整性可以计算备份中每个⽂件的校验和,并在还原期间重新检查。
备份完成⽂件复制后,将等待直到每个WAL段所需的备份保持⼀致然后存储到备份仓库中。
块校验和断点备份流压缩和校验和增量还原并⾏异步WAL Push和Get表空间重新映射和Link⽀持S3存储⽀持和Azure兼容对象存储⽀持加密使⽤安装解压[postgres@pgserver12 tools]$ tar -zxf pgbackrest-release-2.31.tar.gz[postgres@pgserver12 tools]$ ls创建必要⽬录ostgres@sungsasong ~]$ sudo mkdir -p -m 770 /var/log/pgbackrest[postgres@sungsasong ~]$ sudo chown postgres.postgres /var/log/pgbackrest/[postgres@sungsasong ~]$ sudo mkdir -p /etc/pgbackrest[postgres@sungsasong ~]$ sudo mkdir -p /etc/pgbackrest/conf.d[postgres@sungsasong ~]$ sudo touch /etc/pgbackrest/pgbackrest.conf[postgres@sungsasong ~]$ sudo chmod 640 /etc/pgbackrest/pgbackrest.conf[postgres@sungsasong ~]$ sudo chown postgres.postgres -R /etc/pgbackrest/[postgres@sungsasong ~]$ sudo mkdir /usr/bin/pgbackrest[postgres@sungsasong ~]$ sudo chown postgres.postgres /usr/bin/pgbackrest/[postgres@sungsasong ~]$ sudo chmod 755 /usr/bin/pgbackrest/编译安装[postgres@sungsasong src]$ ./configure --prefix=/usr/bin/pgbackrest/[postgres@sungsasong src]$ make -j24[postgres@sungsasong src]$ make install -j24install -d /usr/bin/pgbackrest/bininstall -m 755 pgbackrest /usr/bin/pgbackrest/bin命令测试[postgres@sungsasong src]$ /usr/bin/pgbackrest/bin/pgbackrestpgBackRest 2.31 - General helpUsage:pgbackrest [options] [command]Commands:archive-get Get a WAL segment from the archive.archive-push Push a WAL segment to the archive.backup Backup a database cluster.check Check the configuration.expire Expire backups that exceed retention.help Get help.info Retrieve information about backups.restore Restore a database cluster.stanza-create Create the required stanza data.stanza-delete Delete a stanza.stanza-upgrade Upgrade a stanza.start Allow pgBackRest processes to run.stop Stop pgBackRest processes from running.version Get version.Use 'pgbackrest help [command]' for more information.配置数据库监听和访问及⽇志(可选)[postgres@sungsasong pgbackrest-release-2.31]$ egrep "10.10" $PGDATA/pg_hba.confhost all all 10.10.20.0/24 trust[postgres@sungsasong pgbackrest-release-2.31]$ egrep -v "^#" $PGDATA/postgresql.auto.conflogging_collector = 'on'listen_addresses = '*'配置PostgreSQL数据库数据存储⽬录[postgres@sungsasong src]$ cat >>/etc/pgbackrest/pgbackrest.conf <<EOF> [demo]> pgl-path=/data/pg10/pgdata> EOF配置环境变量[postgres@sungsasong ~]$ echo "export PATH=/usr/bin/pgbackrest/bin:\$PATH" >> .bashrc创建备份和归档仓库[postgres@sungsasong ~]$ sudo mkdir -p /pgbackrest/repos[postgres@sungsasong ~]$ sudo chmod 750 /pgbackrest/ -R[postgres@sungsasong ~]$ sudo chown postgres.postgres /pgbackrest/ -R将仓库路径加载在pgBackRest配置⽂件中[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf[demo]pgl-path=/data/pg10/pgdata[global]repol-path=/pgbackrest/repos配置数据库归档[postgres@sungsasong ~]$ egrep -v "^#" $PGDATA/postgresql.auto.conflogging_collector = 'on'archive_mode = 'on'archive_command = 'pgbackrest --stanza=demo archive-push %p'listen_addresses = '*'log_filename = 'postgresql.log'log_line_prefix = ''max_wal_senders = '3'wal_level = 'replica'重新启动数据库[postgres@sungsasong ~]$ pg_ctl restart -D $PGDATA -l /tmp/logfilewaiting for server to shut down.... doneserver stoppedwaiting for server to start.... doneserver started可选配置归档压缩[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf[demo]pgl-path=/data/pg10/pgdata[global]repol-path=/pgbackrest/repos[global:archive_push]compress-level=3配置基于保留策略的归档[postgres@sungsasong ~]$ cat /etc/pgbackrest/pgbackrest.conf[demo]pg1-path=/data/pg10/pgdatapg1-host-config-path=/data/pg10/pgbackrestpg1-host-port=22pg1-host-user=postgrespg1-host=sungsasongpg1-port=10001pg1-user=postgres[global]repo1-path=/pgbackrest/reposrepo1-retention-full=2[global:archive_push]compress-level=3创建存储空间并检查配置[postgres@sungsasong ~]$ pgbackrest --stanza=demo --log-level-console=info stanza-create2021-01-08 20:42:58.887 P00 INFO: stanza-create command begin 2.31: --exec-id=9283-e9744c3e --log-level-console=info --pg1-host=sungsasong --pg1-host-config-path=/data/pg10/pgbackrest --pg1-host-port=22 --pg1-host-user=postgres --pg1-path=/data/pg10 2021-01-08 20:42:59.835 P00 INFO: stanza-create command end: completed successfully (948ms)检查配置[postgres@sungsasong ~]$ pgbackrest --stanza=demo --log-level-console=info check2021-01-08 21:41:29.851 P00 INFO: check command begin 2.31: --exec-id=21648-1862ac0d --log-level-console=info --pg1-path=/data/pg10/pgdata --pg1-port=10001 --pg1-user=postgres --repo1-path=/pgbackrest/repos --stanza=demo2021-01-08 21:41:32.826 P00 INFO: WAL segment 000000010000000000000006 successfully archived to '/pgbackrest/repos/archive/demo/10-1/0000000100000000/000000010000000000000006-2f027934f4f35cd3983ca4b1b7b43c32ab089448.gz'2021-01-08 21:41:32.826 P00 INFO: check command end: completed successfully (2975ms)执⾏备份默认为增量备份,增量备份将会请求⼀个基础全备,如果没有基础全备,增量备份将会变更到全备。
PostgreSQL⾼可⽤之Pgpool-II的故障转移和故障恢复参数详解Pgpool-II故障转移(failover)是指 Pgpool-II会将⽆法访问的PostgreSQL后端节点从集群中分离出去,如果故障的是主机节点,则会提升⼀个备机节点作为主机继续提供服务。
Pgpool-II通过使⽤健康检查来确认PostgreSQL后端节点的不可访问性:【健康检查】定期进⾏健康检查(),健康检查过程尝试从Pgpool-II连接到PostgreSQL节点以确认其健康状况。
如果连接失败,则可能是Pgpool-II 和PostgreSQL之间的⽹络连接出现问题或PostgreSQL⽆法正常⼯作。
Pgpool-II不会区分每种情况,只是确定如果运⾏状况检查失败,则认为特定的PostgreSQL节点不可⽤。
【故障恢复参数详解】failover_on_backend_error若failover_on_backend_error为off,则Pgpool-II仅报告错误,并在出现此类错误时断开会话(但是请注意,当Pgpool-II检测到PostgreSQL后端服务器的管理性关闭时,它仍会触发故障转移)。
如果客户端已经连接到Pgpool-II 并且PostgreSQL已关闭(请注意,如果根本没有客户端连接到Pgpool-II,关闭PostgreSQL不会触发故障转移)若failover_on_backend_error为on,则触发故障转移failover_commandfailover_command通常是⼀个故障转移脚本,官⽅提供的是failover.sh.sample,参数说明如下:failover_command(字符串)指定当PostgreSQL后端节点分离时要运⾏的⽤户命令。
Pgpool-II将以下特殊字符替换为后端特定信息。
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'follow_primary_commandfollow_primary_command命令⽤于通过调⽤pcp_recovery_node命令从新的主数据库恢复备⽤数据库。
一、pg_dump工具介绍1.1 备份单个数据库pg_dump只能备份单个数据库,不会导出角色和表空间相关的信息,便于迁移或异机恢复。
常用参数如下:# pg_dump --help 可以查看用法-U, --username=NAME 以指定的数据库用户联接-v, --verbose 详细输出模式-F, --format=c|d|t|p 导出文件的格式,-Fc备份为二进制格式, 压缩存储. 并且可被pg_restore 用于精细还原。
-Fp备份为文本, 大库不推荐-d, --dbname=DBNAME 指定数据库名-O, --no-owner 在明文格式中, 忽略恢复对象所属者-f, --file=FILENAME 导出后保存的文件名-j, --jobs=NUM 指定备份的并行度,指定备份路径而非备份文件,会生成很多小文件,还原时指定该目录即可--insert 导出成sql语句类型,虽然方便查看数据内容,但是导出耗时长1.2 开始备份以下路径和帐号密码示例:请根据个人真实进行修改(1)、打开CMD,切换到PostgreSQL 安装目录,定位到bin 文件中。
D:\Program Files\PostgreSQL\16\bin\pg_dump.exe -h localhost -U postgres -d postgres -f "D:\\20240728.dmp" -Fc(2)、执行导出命名,根据本地数据库动态更改配置。
pg_dump.exe -h localhost -U postgres -d postgres -f "D:\\20240728.dmp" -Fc二、pg_restore工具介绍host-----------------------数据库的ip地址port------------------------数据库的端口username---------------数据库用户名role-----------------------角色dbname------------------数据库名verbose-------------------备份所在的路径2.1、导入命名如下:以下路径和帐号密码示例:请根据个人真实进行修改C:\Program Files\PostgreSQL\16\bin>pg_restore.exe --host "localhost" --port "8001" --username "postgres" --role "postgres" --dbname "postgres" --verbose "D:\\20240728.dmp"。
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@>.以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
数据库备份与恢复的常见问题解决方案数据库备份和恢复是数据库管理的重要环节,对于保护数据和避免数据丢失具有至关重要的作用。
然而,在进行数据库备份和恢复的过程中,常常会遇到各种问题和挑战。
在本文中,我们将介绍一些常见的数据库备份和恢复问题,并提供解决方案。
一、备份问题解决方案1. 备份速度慢:数据库备份是一个繁重的任务,如果备份速度过慢,可能会导致系统性能下降。
为了解决这个问题,可以尝试以下方法:- 定期优化数据库性能并检查磁盘空间使用情况,确保数据库能够快速写入备份文件。
- 使用并行备份技术,同时备份多个数据库实例,提高备份速度。
- 考虑使用增量备份策略,只备份发生变化的数据,减少备份的数据量。
2. 备份失败:数据库备份失败可能是由于各种原因引起的,例如磁盘空间不足、备份设备故障等。
以下是一些处理备份失败的解决方案:- 确保备份设备可靠,并定期进行设备测试和检查。
- 检查备份日志和错误日志,找出导致备份失败的具体原因,并根据错误提示采取相应的措施。
- 如果备份失败是由于磁盘空间不足引起的,可以考虑增加磁盘容量或删除不必要的文件,以确保备份能够成功执行。
二、恢复问题解决方案1. 恢复失败:数据库恢复过程可能会遇到各种问题,例如恢复设备故障、数据库文件损坏等。
下面是一些处理恢复失败的解决方案:- 确保用于恢复的数据文件是完整和正确的,可以通过校验和检查等方式进行验证。
- 检查恢复日志和错误日志,查找恢复失败的具体原因,并根据错误提示采取相应的措施。
- 如果恢复设备故障,可以尝试使用备份设备的备份文件进行恢复,或者将备份文件复制到其他设备上尝试恢复。
2. 数据丢失:数据库恢复过程中,可能会出现数据丢失的情况,例如恢复到了错误的时间点或者恢复过程中发生了错误。
以下是一些解决数据丢失问题的方法:- 定期进行备份并进行备份验证,确保备份是正确和完整的。
- 在进行恢复操作之前,先进行彻底的数据检查和验证,确保所需数据在备份中存在。
PostgreSQL恢复误删数据 在Oracle中;删除表或者误删表记录;有个闪回特性,不需要停机操作,可以完美找回记录。
当然也有⼀些其他的恢复⼯具;例如odu⼯具,gdul⼯具。
都可以找回数据。
⽽PostgreSQL⽬前没有闪回特性。
如何在不停机情况下恢复误删数据。
还好是有完整的热备份。
本⽂描述的⽅法是:利⽤热备份在另⼀台服务器进⾏数据恢复;再导⼊正式环境;这样不影响数据库操作。
这⽅法也适⽤在Oracle恢复。
必须满⾜⼏个条件有完整的基础数据⽂件备份和归档⽂件备份.所以备份是很重要的。
有⼀台装好同款Postgres软件的服务器实例模拟讲解 过程模拟误删表tbl_lottu_drop后;后续进⾏dml/ddl操作;表明正式数据库还是进⾏正常⼯作。
在另外⼀台数据库基于数据库PITR恢复。
恢复表tbl_lottu_drop的数据。
Postgres201 :线上数据库服务器Postgres202 :操作服务器1. 创建⼀个有效的备份postgres=# select pg_start_backup(now()::text);pg_start_backup-----------------0/F000060(1 row)[postgres@Postgres201 ~]$ rsync -acvz -L --exclude "pg_xlog" --exclude "pg_log" $PGDATA /data/backup/20180428postgres=# select pg_stop_backup();NOTICE: pg_stop_backup complete, all required WAL segments have been archivedpg_stop_backup----------------0/F000168(1 row)2. 模拟误操作 2.1 创建⼀个需要恢复对象表tbl_lottu_drop。
数据库常用的备份和恢复方法1. 数据库备份方法:使用数据库管理系统自带的备份工具,比如MySQL的mysqldump 命令、SQL Server的备份与还原工具、Oracle的RMAN等。
2. 备份恢复方法:通过数据库管理系统自带的还原工具进行数据库的恢复操作,还原到备份的状态。
3. 使用备份数据库文件:将数据库文件完整拷贝到另一个地方,以便在需要时进行恢复。
4. 使用数据库复制:通过数据库复制功能实现备份,比如MySQL的主从复制、SQL Server的数据库镜像等。
5. 使用第三方备份工具:如Acronis Backup、Veeam Backup等第三方软件来进行数据库备份。
6. 使用文件系统级别的备份:直接备份数据库所在的文件系统,这种方法需要确保数据库处于非活动状态。
7. 冷备份:在数据库服务未运行的情况下进行备份,确保备份文件的完整性。
8. 热备份:在数据库服务正在运行的情况下进行备份,能够实现数据库的连续性。
9. 定时自动备份:通过定时任务或其他调度工具定期对数据库进行备份,确保备份的及时性。
10. 增量备份:仅备份数据库中发生变化的部分数据,从而减少备份数据的大小和时间。
11. 差异备份:备份数据库自上次完整备份之后发生变化的部分数据,比增量备份更快,但恢复时需要依赖上次的完整备份。
12. 完整备份:备份整个数据库的数据和结构,是最基本的备份方法。
13. 数据库备份到云存储:将数据库备份文件上传至云存储服务,保证备份的安全性和可靠性。
14. 数据库备份加密:对备份文件进行加密,增加备份文件的安全性。
15. 数据库备份压缩:对备份文件进行压缩,减小备份文件的大小,节省存储空间。
16. 数据库备份验证:对备份文件进行验证,确保备份文件的完整性和可恢复性。
17. 数据库备份日志记录:记录备份的相关信息,如备份时间、备份状态、备份文件位置等,便于管理和追踪备份操作。
18. 数据库备份监控:通过监控系统对数据库备份进行实时监控,确保备份的正常进行。
数据库备份与恢复方法总结数据库备份是一个重要的数据管理任务,它可以确保数据的安全性和可恢复性。
数据库备份的目的是将数据库中的数据和结构导出并存档,以防止数据丢失或数据不一致性的问题。
恢复数据库则是将备份的数据重新导入,并使数据库恢复到故障发生之前的状态。
本文将总结几种常见的数据库备份与恢复方法,以及其优缺点。
1. 完全备份(Full Backup)完全备份是将整个数据库备份到磁盘或其他存储介质中,包括所有的表、视图、存储过程等。
这是最常见和最简单的备份方法,可以快速实施恢复,并保证数据的完整性。
但是,完全备份需要耗费较长的时间和存储空间,特别是当数据库庞大并且频繁更新时。
2. 增量备份(Incremental Backup)增量备份只备份上次完全备份之后的增量更新数据。
它可以大大减少备份时间和存储空间的开销。
增量备份记录了自上次完全备份以来所做的所有更改,当需要恢复数据时,需要依次恢复上次完全备份和增量备份中的更改。
由于增量备份不能直接提供完整的数据库镜像,恢复过程可能会更复杂一些。
3. 差异备份(Differential Backup)差异备份记录了自上次完全备份以来发生的所有更改,并与上次完全备份进行对比,只备份新的或更改的数据。
与增量备份不同的是,差异备份备份的是与上次完全备份的差异,而不是上次备份之后的增量更新。
差异备份在恢复数据时,只需要恢复上次完全备份和最近的差异备份,大大简化了恢复过程。
4. 日志备份(Log Backup)日志备份是备份数据库的事务日志,以确保数据操作的连续性和一致性。
日志备份可以提供更高级别的数据恢复,恢复可以精确到某个时段甚至某个特定事务。
通过定期备份事务日志,可以将数据库恢复到任意时间点之前的状态。
然而,日志备份通常需要更多的存储空间和备份时间。
总体来说,完全备份适用于小型数据库或需要紧急恢复的情况。
增量备份适用于频繁更新的大型数据库,可以减少备份时间和存储空间的开销。
macOS命令行下的数据库备份和恢复技巧数据库是现代应用开发中不可或缺的组成部分,它承载着重要的数据,为应用的正常运行提供支持。
在开发过程中,我们常常需要对数据库进行备份和恢复操作,以确保数据的安全性和可靠性。
本文将介绍macOS命令行下的数据库备份和恢复技巧,帮助开发者更好地处理数据库相关操作。
一、数据库备份数据库备份是指将数据库的数据、结构和配置等内容复制到另一个存储介质中,以应对各种突发情况,如数据丢失、硬件故障等。
在macOS命令行下,我们可以使用不同的命令行工具来进行数据库备份。
1.1 使用mysqldump备份MySQL数据库对于MySQL数据库,常用的备份工具是mysqldump。
它可以将整个数据库或者指定的表备份为SQL文件。
首先,我们需要登录到MySQL服务器。
打开终端,输入以下命令:```mysql -u root -p```其中,"-u"参数后面是MySQL用户名,"-p"参数表示需要输入密码。
输入密码后,我们就可以登录到MySQL服务器了。
接下来,我们可以使用mysqldump命令进行备份。
以下是备份整个数据库的命令:```mysqldump -u root -p --all-databases > backup.sql```该命令将备份所有数据库,并将备份结果保存到backup.sql文件中。
如果只需要备份指定的数据库,可以使用下面的命令:```mysqldump -u root -p your_database_name > backup.sql```上述命令将备份名为"your_database_name"的数据库到backup.sql文件中。
备份完成后,我们可以使用以下命令查看备份结果:```cat backup.sql```1.2 使用pg_dump备份PostgreSQL数据库对于PostgreSQL数据库,我们可以使用pg_dump命令进行备份。
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 工作的时候并不阻塞其他的对数据库的操作。
(但是会阻塞那些需要排它锁的操作,比如VACUUM FULL。
)Important: 如果你的数据库结构依赖于OID (比如说用做外键),那么你必须告诉pg_dump 把OID 也倒出来。
要倒OID,可以使用-o 命令行选项。
缺省时也不会转储"大对象"。
如果你使用大对象,请参考pg_dump 的命令手册页。
从转储中恢复pg_dump 生成的文本文件可以由psql 程序读取。
从转储中恢复的常用命令是psql dbname < infile这里的infile 就是你给pg_dump命令的outfile参数。
这条命令不会创建数据库dbname,你必须在执行psql 前自己从template0创建(也就是说,用命令createdb -T template0 dbname)。
psql 支持类似pg_dump 的选项用以控制数据库服务器位置和用户名。
参阅psql 的手册获取更多信息。
在开始运行恢复之前,目标库和所有在转储出来的库中拥有对象的用户,以及曾经在某些对象上被赋予权限的用户都必须已经存在。
如果这些不存在,那么恢复将失败,因为恢复过程无法把这些对象恢复成原有的所有权和/或权限。
(有时候你希望恢复权限,不过通常你不需要这么做。
)一旦完成恢复,在每个数据库上运行ANALYZE 是明智的举动,这样优化器就有有用的统计数据了。
你总是可以运行vacuumdb -a -z 来VACUUM ANALYZE 所有数据库;这个等效于手工运行VACUUM ANALYZE。
pg_dump 和psql 可以通过管道读写,这样我们就可能从一台主机上将数据库目录转储到另一台主机上,比如pg_dump -h host1 dbname | psql -h host2 dbname Important: pg_dump生成的转储输出是相对于template0的。
这就意味着任何加入到template1的语言,过程等都会经由pg_dump 转储。
结果是,在恢复的时候,如果你使用的是客户化的template1,那么你必须从template0中创建空的数据库,就象我们上面的例子那样。
有关如何有效地向PostgreSQL 里装载大量数据的建议.使用pg_dumpall 上面的方法在备份整个数据库集群的时候比较麻烦而且不方便。
因此我们提供了pg_dumpall 程序。
pg_dumpall 备份一个给出的集群中的每个数据库,同时还确保保留象用户和组这样的全局数据状态。
这个命令的基本用法是:pg_dumpall > outfile生成的转储可以用psql 恢复:psql template1 < infile (实际上,你可以声明任意现有的数据库进行连接,但是如果你是向一个空的数据库装载,那么template1 是你唯一的选择。
)恢复pg_dumpall的转储的时候通常需要数据库超级用户权限,因为我们需要它来恢复用户和组信息。
处理大数据库因为PostgreSQL 允许表的大小大于你的系统允许的最大文件大小,可能把表转储到一个文件会有问题,因为生成的文件很可能比你的系统允许的最大文件大。
因为pg_dump 输出到标准输出,你可以用标准的Unix 工具绕开这个问题:使用压缩的转储. 使用你熟悉的压缩程序,比如说gzip。
pg_dump dbname | gzip > filename.gz用下面命令恢复:createdb dbnamegunzip -c filename.gz | psql dbname或者cat filename.gz | gunzip | psql dbname 使用split。
. split 命令允许你你用下面的方法把输出分解成操作系统可以接受的大小。
比如,让每个块大小为 1 兆字节:pg_dump dbname | split -b 1m - filename用下面命令恢复:createdb dbnamecat filename* | psql dbname 使用客户化转储格式. 如果PostgreSQL是在一个安装了zlib 压缩库的系统上制作的,那么客户化转储格式将在写入输出文件的时候压缩数据。
它会生成和使用gzip 类似大小的转储文件,但是还附加了一个优点:你可以有选择地恢复库中的表。
下面的命令用客户化转储格式转储一个数据库:pg_dump -Fc dbname> filename客户化格式的转储不是脚本,不能用于psql,而是需要使用pg_restore 转储。
请参考pg_dump 和pg_restore 的手册获取细节。
注意出于向下兼容的考虑,缺省的时候pg_dump 并不转储大对象。
要转储大对象,你必须使用客户化或者tar 输出格式,并且在pg_dump 中使用-b选项。
参阅pg_dump 手册获取详细信息。
在PostgreSQL 源码树的contrib/pg_dumplo 路径里也包含一个可以转储大对象的程序。
另一个备份的策略是直接拷贝PostgreSQL用于存放数据库数据的文件。
tar -cf backup.tar /usr/local/pgsql/data 不过,你要受到两个限制,令这个方法不那么实用,或者至少比pg_dump 的方法逊色一些:为了进行有效的备份,数据库服务器必须被关闭。
象拒绝所有联接这样的折衷的方法是不行的,因为总是有一些缓冲区数据存在。
(主要因为tar 和类似的工具在做备份的时候并不对文件系统的状态做原子快照)。
如果你曾经深入了解了数据库在文件系统布局的细节,你可能试图从对应的文件或目录里备份几个表或者数据库。
这样做是没用的,因为包含在这些文件里的信息只是部分信息。
还有一半信息在提交日志文件pg_clog/*里面,它包含所有事务的提交状态。
只有拥有这些信息,表文件的信息才是可用的。
当然,试图只恢复表和相关的pg_clog 数据也是徒劳的,因为这样会把数据库集群里的所有其他没有用的表的信息都拿出来。
所以文件系统的备份只适用于一个数据库集群的完整恢复。
另外一个文件系统备份的方法是给数据目录做一个"一致的快照",条件是文件系统支持这个功能(并且你愿意相信它是实现正确的)。
典型的过程是制作一个包含数据库的卷的"冻结快照",然后把整个数据库目录(不仅仅是部分,见上文)从快照拷贝到备份设备,然后释放冻结快照。
这样甚至在数据库服务器在运行的时候都可以运转。
不过,这样创建的备份会把数据库文件保存在一个没有恰当关闭数据库服务器的状态下;因此,如果你在这个备份目录下启动数据库服务器,它就会认为数据库服务器经历过崩溃并且重放WAL 日志。
这不是个问题,只要意识到它即可(并且确信在自己的备份中包含WAL 文件)。
如果你的数据库分布在多个卷上(比如,数据文件和WAL 日志在不同的磁盘上),那么可能就没有任何方法获取所有卷上准确的同步冻结快照。
在你新闻这样的情况下的一致性快照的技术之前,仔细阅读你的文件系统文档。
最安全的方法是关闭数据库服务器足够长的时间,以建立所有冻结快照。
还要说明的是,文件系统备份不会比SQL转储小。
恰恰相反,大多数情况下它要大。
(比如pg_dump 不用倒出索引,只是创建它们的命令。
)在任何时候,PostgreSQL 都在集群的数据目录的pg_xlog/ 子目录里维护着一套预写日志(WAL)。
这些日志记录着每一次对数据库的数据文件的修改的细节。
这些日志存在是为了防止崩溃:如果系统崩溃,数据库可以通过"重放"上次检查点以来的日志记录以恢复数据库的完整性。
但是,日志的存在让它还可以用于第三种备份数据库的策略:我们可以组合文件系统备份与WAL 文件的备份。
如果需要恢复,我们就恢复备份,然后重放备份了的WAL文件,把备份恢复到当前的时间。
这个方法对管理员来说,明显比以前的方法更复杂,但是有非常明显的优势:在开始的时候我们不需要一个非常完美的一致的备份。
任何备份内部的不一致都会被日志重放动作修改正确(这个和崩溃恢复时发生的事情没什么区别)。
因此我们不需要文件系统快照的功能,只需要tar 或者类似的归档工具。
因为我们可以把无限长的WAL 文件序列连接起来,所以连续的备份简化为连续地对WAL 文件归档来实现。
这个功能对大数据库特别有用,因为大数据库的全备份可能并不方便。
我们可没说重放WAL 记录的时候我们必须重放到结尾。
我们可以在任意点停止重放,这样就有一个在任意时间的数据库一致的快照。
因此,这个技术支持即时恢复:我们可以把数据库恢复到你开始备份以来的任意时刻的状态。
如果我们持续把WAL 文件序列填充给其它装载了同样的基础备份文件的机器,我们就有了一套"热备份"系统:在任何点我们都可以启动第二台机器,而它拥有近乎当前的数据库拷贝。