2023年7月30日发(作者:)
Postgresql的三种备份⽅式 数据库的备份有多种分类⽅式。按照备份后的⽂件类型,可以分为物理备份(⽂件系统级别的备份)和逻辑备份(备份后的⽂件是sql⽂件或特定格式的导出⽂件);按照备份过程中是否停⽌数据库服务,可分为冷备份(备份过程中停⽌数据库服务)和热备份(备份过程中数据库服务开启并可供⽤户访问);按照备份是否是完整的数据库,可分为全量备份(备份是完整的数据库)和增量备份(备份是上⼀次全量备份后数据库改变的内容)。 Postgresql的常见备份⽅式有以下三种: 1. ⽂件系统级别的冷备份。 这种备份⽅式需要关闭数据库,然后拷贝数据⽂件的完整⽬录。恢复数据库时,只需将数据⽬录复制到原来的位置。该⽅式实际⼯作中很少使⽤。
2. SQL转储。 这⾥我们⽤到的⼯具是pg_dump和pg_dumpall。 这种⽅式可以在数据库正在使⽤的时候进⾏完整⼀致的备份,并不阻塞其它⽤户对数据库的访问。它会产⽣⼀个脚本⽂件,⾥⾯包含备份开始时,已创建的各种数据库对象的SQL语句和每个表中的数据。可以使⽤数据库提供的⼯具pg_dumpall和pg_dump来进⾏备份。pg_dump只备份数据库集群中的某个数据库的数据,它不会导出⾓⾊和表空间相关的信息,因为这些信息是整个数据库集群共⽤的,不属于某个单独的数据库。pg_dumpall,对集簇中的每个数据库调⽤pg_dump来完成该⼯作,还会还转储对所有数据库公⽤的全局对象(pg_dump不保存这些对象)。 ⽬前这包括适数据库⽤户和组、表空间以及适合所有数据库的访问权限等属性。 例如,在我的计算机上,可使⽤如下命令对名为dbname的数据库进⾏备份: pg_dump –h 127.0.0.1 -p 5432 -U postgres -c -C –f dbname 使⽤如下命令可对全部pg数据库进⾏备份。 pg_dumpall –h 127.0.0.1 –p 5432 -U postgres –c -C –f db_ 恢复⽅式很简单。执⾏恢复命令即可: psql –h 127.0.0.1 -p 5432 -U postgres –f db_
3. 连续归档 这种⽅式的策略是把⼀个⽂件系统级别的全量备份和WAL(预写式⽇志)级别的增量备份结合起来。当需要恢复时,我们先恢复⽂件系统级别的备份,然后重放备份的WAL⽂件,把系统恢复到之前的某个状态。这种备份有显著的优点:1. 不需要⼀个完美的⼀致的⽂件系统备份作为开始点。备份中的任何内部不⼀致性将通过⽇志重放来修正。2. 可以结合⼀个⽆穷长的WAL⽂件序列⽤于重放,可以通过简单地归档WAL⽂件来达到连续备份。3. 不需要重放WAL项⼀直到最后。可以在任何点停⽌重放,并使数据库恢复到当时的⼀致状态。4. 可以连续地将⼀系列WAL⽂件输送给另⼀台已经载⼊了相同基础备份⽂件的机器,得到⼀个实时的热备份系统。
如何进⾏连续归档呢? 下⾯的实例中,操作系统为windows 10,Postgresql的版本为9.6。 ⾸先,需要修改⽂件的⼏个参数修改如下: wal_level = ‘replica’ archive_mode = ‘on’ archive_command = 'copy /y "%p" "D:archive%f"' archive_command执⾏时,%p会被要被归档的⽂件路径所替代,⽽%f只会被⽂件名所替代。如果你需要在命令中嵌⼊⼀个真正的%字符,可以使⽤%%。 “D:archive”替换为归档⽇志的存放路径,要确保归档的⽬录是存在的。 之后需要重启数据库使配置⽣效。
接下来需要制作⼀个⾮排他的基础备份。Postgresql提供了排他备份和⾮排他备份两种备份⽅式,推荐使⽤⾮排他的备份⽅式。 1. 作为⼀个具有运⾏ pg_start_backup 权利的⽤户连接到服务器(不在乎是哪个数据库)并且发出命令:Select pg_start_backup('backup_label', false, false); 2. 对数据库进⾏⼀次⽂件系统级别的备份。即将postgresql的安装⽬录下的data⽬录及其内容复制到其他位置。 3. 在同⼀个连接中,发出命令: select * from pg_stop_backup(false); 这个命令代表结束⼀次⾮排他的备份。 现在来看基于时间点的恢复。 假如你的数据库出现了故障,需要恢复到之前的某个时刻的⼀致的状态,就需要进⾏基于时间点的恢复。其过程是:1. 如果服务器仍在运⾏,停⽌它。2. 如果你具有⾜够的空间,将整个集簇数据⽬录和表空间复制到⼀个临时位置。注意最好是拷贝⽽不是移动。如果你没有⾜够的空间,你⾄少要保存集簇的pg_xlog⼦⽬录的内容,因为它可能包含在系统垮掉之前还未被归档的⽇志。3. 移除data ⽬录及其所有⼦⽂件和⼦⽬录。4. 从⽂件系统备份中恢复数据库⽂件。注意它们要使⽤正确的⽤户恢复并且使⽤正确的权限。如果你在使⽤表空间,你应该验证pg_tblspc/中的符号链接被正确地恢复。5.现在已经从备份中恢复了整个数据⽬录,接下来,你需要部分或全部删除数据⽬录中的下列⽂件,如果它们存在: (1) ;(必须) (2) pg_xlog中的⽂件;(必须) (3) pgsql_tmp开头的临时⽂件;(可选) (4) ;(可选) (5) pg_replslot⽬录中的⽂件;(可选) (6) pg_stat_tmp⽬录中的⽂件。(可选)6. 如果你有在第2步中保存的未归档WAL段⽂件,把它们拷贝到pg_xlog/中或WAL⽇志的归档⽬录中。在集簇数据⽬录中创建⼀个恢复命令⽂件。如果你想恢复到最近的⼀致状态,在写⼊如下两⾏:restore_command = 'copy /y D:archive %f%p'recovery_target_timeline = 'latest'其中,restore_command的内容表⽰将归档⽇志⽂件夹中的内容拷贝到pg_xlog,其参数的含义与上⽂archive_command的参数含义完全相同;recovery_target_timeline = 'latest' 表⽰恢复到最近的时间点。 7. 如果要阻⽌普通⽤户在成功恢复之前连接,请修改pg_。 8. 启动服务器。服务器将会进⼊到恢复模式并且进⽽根据需要读取归档WAL⽂件。恢复可能因为⼀个外部错误⽽被终⽌,可以简单地重新启动服务器,这样它将继续恢复。恢复过程结束后,服务器将把重命名为(为了阻⽌以后意外地重新进⼊恢复模式),并且开始正常数据库操作。 9. 检查数据库的内容来确保你已经恢复到了期望的状态。如果没有,返回到第1步。如果⼀切正常,通过恢复pg_为正常来允许⽤户连接。这样就完成了⼀次⽂件系统级别的全量备份,并实现了WAL⽂件级别的增量备份。
附:pg_start_backup() 和 pg_stop_backup()做了什么? 1. pg_start_backup() pg_start_backup() 的函数原型如下: pg_start_backup(label text [, fast boolean [, exclusive boolean ]]) 其中label是⽤来唯⼀标识这次备份操作的任意字符串,fast 表⽰是否⽴即执⾏强制的检查点,exclusive 表⽰该备份是否是⼀个排他备份。 使⽤该函数时,推荐将exclusive设置为false,即⾮排他⽅式备份。 执⾏下⾯的命令: Select pg_start_backup('backup_label', false, false); 这条命令会产⽣三个动作: 1. 在缓冲区中创建两个变量:label_file和tblspc_map_file。前者包含WAL的起始位置、检查点的起始位置、备份⽅法、备份模式、备份开始时间和备份标签的名称(本例中,名称为“backup_label”)等信息;后者包含 “pg_tblspc/”中表空间符号链接的信息,如果它们存在。 2. 强制发⽣⼀次检查点。将检查点开始前提交的事务对数据库的修改刷新到磁盘。 3. 置写⽇志标志为:XLogCtl->ageWrites = true。把这个标志设置为true后,如果在备份期间时有其他事务修改数据库,那么系统会把被修改的数据页在修改前的完整页⾯都记录到WAL中,⽽不仅仅是记录页⾯中的变化的部分。 为什么要将完整的页⾯记录到WAL中呢? 原因是在备份过程中,其他事务修改数据库,可能会造成备份后的数据存在新旧数据混合的情况,甚⾄同⼀数据页⾯也会出现这种情况。假如WAL⽇志中仅仅记录变化的那部分的内容,就⽆法将数据库恢复到上次备份结束时刻的状态。所以要将修改后的完整页⾯写⼊WAL中,以保证数据库恢复后的⼀致性。
2. pg_stop_backup()pg_stop_backup()的函数原型如下:pg_stop_backup([, exclusive boolean ]);exclusive 表⽰该备份是否是⼀个排他备份。如果采⽤⾮排他⽅式备份,执⾏:Select pg_stop_backup(false);这条命令会产⽣如下动作:1. label_file和tblspc_map_file的内容会包含在该函数返回的结果中,并且应该被写⼊到该备份的⼀些⽂件中(这些内容不在数据⽬录中)。2. 在事务⽇志归档区⾥创建⼀个备份历史⽂件(.hostory)。这个历史⽂件包含 pg_start_backup的标签、备份的起始与终⽌事务⽇志位置以及备份的起始和终⽌时间。返回值是备份的终⽌事务⽇志位置(同样也可以被忽略)。 在记录结束位置之后,当前事务⽇志插⼊点被⾃动地推进到下⼀个事务⽇志⽂件,这样结束的事务⽇志⽂件可以⽴即被归档来结束备份。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690655773a387830.html
评论列表(0条)