pg_basebackup 不备份哪些文件
2015-10-14 20:51
225 查看
Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开。本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲、俄罗斯、日本、美国等国家和地区的数据库方面专家助阵:
Postgres-XC项目的发起人铃木市一(SUZUKI Koichi)
Postgres-XL的项目发起人Mason Sharp
pgpool的作者石井达夫(Tatsuo Ishii)
PG-Strom的作者海外浩平(Kaigai Kohei)
Greenplum研发总监姚延栋
周正中(德哥), PostgreSQL中国用户会创始人之一
汪洋,平安科技数据库技术部经理
……
2015年度PG大象会报名地址:http://postgres2015.eventdove.com/PostgreSQL中国社区: http://postgres.cn/PostgreSQL专业1群: 3336901(已满)PostgreSQL专业2群: 100910388PostgreSQL专业3群: 150657323 |
那么pg_basebackup会帮你过滤哪些文件,或者不备份哪些文件呢?
1. pgssql_tmp开头的临时目录中的文件
2. postgresql.auto.conf.tmp
3. BACKUP_LABEL_FILE
4. postmaster.pid
5. pg_stat_tmp目录中的文件
6. pg_replslot目录中的文件
7. 如果没有加-x参数则同样跳过pg_xlog中的文件
源码如下:
src/include/storage/fd.h:#define PG_TEMP_FILE_PREFIX "pgsql_tmp"
src/include/utils/guc.h:#define PG_AUTOCONF_FILENAME "postgresql.auto.conf"
contrib/pg_stat_statements/pg_stat_statements.c:#define PGSS_TEXT_FILE PG_STAT_TMP_DIR "/pgss_query_texts.stat"
src/include/pgstat.h:#define PG_STAT_TMP_DIR "pg_stat_tmp"
src/backend/replication/basebackup.c
/* * Include all files from the given directory in the output tar stream. If * 'sizeonly' is true, we just calculate a total length and return it, without * actually sending anything. * * Omit any directory in the tablespaces list, to avoid backing up * tablespaces twice when they were created inside PGDATA. */static int64sendDir(char *path, int basepathlen, bool sizeonly, List *tablespaces){...... dir = AllocateDir(path); while ((de = ReadDir(dir, path)) != NULL) { /* Skip special stuff */ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue;跳过临时文件,即pgsql_tmp开头的文件 /* Skip temporary files */ if (strncmp(de->d_name, PG_TEMP_FILE_PREFIX, strlen(PG_TEMP_FILE_PREFIX)) == 0) continue;跳过postgresql.auto.conf的临时文件postgresql.auto.conf.tmp /* skip auto conf temporary file */ if (strncmp(de->d_name, PG_AUTOCONF_FILENAME ".tmp", sizeof(PG_AUTOCONF_FILENAME) + 4) == 0) continue;跳过使用pg_start_backup()+copy+pg_stop_backup()的方式进行备份的标签文件,BACKUP_LABEL_FILE /* * If there's a backup_label file, it belongs to a backup started by * the user with pg_start_backup(). It is *not* correct for this * backup, our backup_label is injected into the tar separately. */ if (strcmp(de->d_name, BACKUP_LABEL_FILE) == 0) continue;......跳过pid文件 /* Skip postmaster.pid and postmaster.opts in the data directory */ if (strcmp(pathbuf, "./postmaster.pid") == 0 || strcmp(pathbuf, "./postmaster.opts") == 0) continue;跳过控制文件,不是不备份,是放在最后备份,因为使用pg_basebackup不产生标签文件来记录备份开始的XLOG OFFSET,所以需要将pg_control文件放在最后备份。 /* Skip pg_control here to back up it last */ if (strcmp(pathbuf, "./global/pg_control") == 0) continue;......跳过统计信息的临时文件(包括pg_stat_statements插件的,因为这个插件的临时统计信息也放在pg_stat_tmp目录下。), /* * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped * even when stats_temp_directory is set because PGSS_TEXT_FILE is * always created there. */ if ((statrelpath != NULL && strcmp(pathbuf, statrelpath) == 0) || strncmp(de->d_name, PG_STAT_TMP_DIR, strlen(PG_STAT_TMP_DIR)) == 0) { if (!sizeonly) _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); size += 512; continue; }跳过pg_replslot目录中的文件 /* * Skip pg_replslot, not useful to copy. But include it as an empty * directory anyway, so we get permissions right. */ if (strcmp(de->d_name, "pg_replslot") == 0) { if (!sizeonly) _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); size += 512; /* Size of the header just added */ continue; }......跳过pg_xlog,当打开了-x参数时,在另一处代码备份xlog -x, --xlog include required WAL files in backup (fetch mode)
/* * We can skip pg_xlog, the WAL segments need to be fetched from the * WAL archive anyway. But include it as an empty directory anyway, so * we get permissions right. */ if (strcmp(pathbuf, "./pg_xlog") == 0) { if (!sizeonly) { /* If pg_xlog is a symlink, write it as a directory anyway */#ifndef WIN32 if (S_ISLNK(statbuf.st_mode))#else if (pgwin32_is_junction(pathbuf))#endif statbuf.st_mode = S_IFDIR | S_IRWXU; _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf); } size += 512; /* Size of the header just added */
/* * Also send archive_status directory (by hackishly reusing * statbuf from above ...). */ if (!sizeonly) _tarWriteHeader("./pg_xlog/archive_status", NULL, &statbuf); size += 512; /* Size of the header just added */
continue; /* don't recurse into pg_xlog */ }
当打开了-x参数时,在此处代码备份xlog
src/backend/replication/basebackup.c
/* * Actually do a base backup for the specified tablespaces. * * This is split out mainly to avoid complaints about "variable might be * clobbered by longjmp" from stupider versions of gcc. */static voidperform_base_backup(basebackup_options *opt, DIR *tblspcdir){...... if (opt->includewal) { /*......
最后,我们注意到pg_basebackup备份了hash index,以及unlogged table的内容,实际上他们的备份都是无用功,因为他们不产生XLOG,在还原时,unlogged table会自动清掉,而hash index则可能存在不一致数据。
这是不合理的地方。
[参考]
1. src/backend/replication/basebackup.c
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android 代码实现控件之间的间距
- 神器SystemTap
- [Android]在代码里运行另一个程序的方法
- 数据库链接字符串查询网站
- 肯特·贝克:改变人生的代码整理魔法
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 网页恶意代码的预防
- 创建一个空的IBM DB2 ECO数据库的方法
- 路由器备份配置
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- 高手写的Tracer-Flash代码调试类代码下载
- CentOS下DB2数据库安装过程详解