greenplum数据库集群的备份与恢复看这一篇就够啦!_greenplum 备份恢复-程序员宅基地

技术标签: postgresql  运维  linux  数据库备份与恢复方案  数据库  

使用gpbackup和gprestore的GPDB的备份方案

1、前言

Greenplum(以下简称GPDB)是一款开源数据仓库,基于开源的PostgreSQL改造而来,主要用来处理大规模数据分析任务。相比Hadoop,Greenplum更适合做大数据的存储、计算和分析引擎。

GPDB是典型的Master/Slave架构,在Greenplum集群中,存在一个Master节点和多个Segment节点,每个节点上可以运行多个数据库。Greenplum采用shared nothing架构(MPP),典型的Shared Nothing系统汇集了数据库、内存Cache等存储状态的信息,不在节点上保存状态的信息。节点之间的信息交互都是通过节点互联网络实现的。通过将数据分布到多个节点上来实现规模数据的存储,再通过并行查询处理来提高查询性能。每个节点仅查询自己的数据,所得到的结果再经过主节点处理得到最终结果。通过增加节点数目达到系统线性扩展。

Greenplum Database支持并行和非并行方法来备份和还原数据库。并行操作可扩展,而与系统中segment的数量无关,因为segment主机各自将数据同时写入本地磁盘存储中。对于非并行备份和还原操作,必须通过网络将数据从网段发送到主服务器,主服务器将所有数据写入其存储中。除了将I / O限制在一台主机之外,非并行备份还要求主服务器具有足够的本地磁盘存储空间来存储整个数据库。

2、Greenplum备份恢复发展历程

Greenplum备份和恢复体系与时俱进,不断增强备份和恢复功能,持续改善用户体验。下图是Greenplum备份与恢复体系的发展图(下图所列工具均是成熟版本,在企业中有大量的应用):
gp备份恢复工具发展历程

3、备份方案的优劣及使用场景

优劣和使用场景
gpbackup是2017年发布的最新版的备份工具。gpbackup消除了锁表(专有锁)机制,同时,创新性的把GP的原有的外部表技术(一种高效的大规模并行数据加载和卸载技术)引入,用户无需为备份预留单独的时间窗口,同时扩展了备份存储的支持,当前可用使用本地文件系统、Dell Data Domain、NBU、以及分布式存储,也可用使用公有云对象存储(S3),同时还支持用户自定义备份的存储接口。

4、gpbackup编译安装

该节的内容来自于阿里云的开发者社区博客,有较大的参考价值,原链接为https://developer.aliyun.com/article/766276

前言:Greenplum6开始,gpbackup需要自己编译安装
安装步骤:
1.下载go语言包

wget -c https://studygolang.com/dl/golang/go1.13.5.linux-amd64.tar.gz

2.解压

tar -zxvf xxx

3.移动位置

mv go /home/gpadmin

4.改变权限

chown -R gpadmin:gpadmin go

5.切换用户

su - gpadmin

6.编辑环境变量

vi ~/.bashrc
export GOROOT=$HOME/go
export GOPATH=$HOME/gpbackup
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

7.使用环境变量

source ~/.bashrc

8.查看版本

go version

如显示正常则安装成功
9.下载gpbackup包
download gpbackup

go get github.com/greenplum-db/gpbackup

如果失败:

go: missing Git command. See https://golang.org/s/gogetcmd package github.com/greenplum-db/gpbackup: exec: "git": executable file not found in $PATH

则需要安装git:
回到root用户,然后执行

yum install -y git

10.进入gpbackup目录

cd /home/gpadmin/gpbackup/src/github.com/greenplum-db/gpbackup

11.编译

make depend

报错

go:github.com/DATA-DOG/[email protected]:Get
https://proxy.golang.org/github.com/Xxxxx i/o timeout make:*[depend] Error 1

这是go包管理代理网址无法访问:proxy.golang.org
12.切换go包代理网址

go env -w GOPROXY=https://goproxy.cn

13.编译依赖

make depend

14.安装

make build

15.安装

make build_linux

5、使用gpbackup对GPDB进行备份

5/6节的内容来自于GPDB的官方文档,其中有一部分官方文档是纯英文,使用谷歌翻译的结果在一些地方不是特别准确,对照英文文档,我对文档内容进行了修正,并总结呈现给大家。原文链接如下:
Backup and RestoreOverviewhttps://gpdb.docs.pivotal.io/6-1/admin_guide/managing/backup-overview.html
Parallel Backup with gpbackup and gprestorehttps://gpdb.docs.pivotal.io/backup-restore/1-20/admin_guide/managing/backup-gpbackup.html
gpbackuphttp://docs-cn.greenplum.org/v6/utility_guide/admin_utilities/gpbackup.html
gprestorehttp://docs-cn.greenplum.org/v6/utility_guide/admin_utilities/gprestore.html

1)gpbackup介绍

gpbackup工具用来备份数据库的内容到元数据文件集合和数据文件集合,这些文件可以被gprestore工具用来恢复数据库。当备份数据库时,可以通过指定表级别和模式级别选项来备份某些特定的表。例如,可以通过组合模式级别和表级别选项来备份模式下的所有表,并排除某一张单独的表。
 
默认情况下,gpbackup备份指定数据库的对象和Greenplum数据库系统全局对象。可以通过gprestore工具指定可选参数–with-globals来恢复全局对象。
 
gpbackup默认将Greenplum数据库备份的对象元数据文件和DDL文件存储在Master数据目录下。Greenplum Segment使用COPY … ON SEGMENT命令将数据备份为压缩CSV数据文件,并存储在每个Segment的数据目录下。可以通过指定–backup-dir选项将Master和Segment主机上的数据备份到一个绝对路径下。
 
可以通过指定其他选项来过滤备份集合来排除或包含指定的表。 可以通过指定–incremental选项来启动增量备份。增量备份在追加优化表或表分区上的变化数据小于未发生变化的数据时有效。有关增量备份的详细信息,请见使用gpbackup和gprestore创建增量备份
 
指定–jobs选项(1 job),Greenplum数据库Master主机上的每个gpbackup操作都会启动一个单独的事务。COPY … ON SEGMENT命令在每个Segment主机上并行执行备份任务。备份进程会在备份的每张表上唤起ACCESS SHARE锁。在表锁处理过程中,数据库处于静止状态。
 
当备份操作完成后,gpbackup会返回状态码。详情请见返回码
 
gpexpand正在初始化新segments时,gpbackup工具不能运行。集群扩展完成后,在扩展之前创建的备份不能被gprestore使用。
 
Note: 该工具在系统内部采用SSH连接执行各项操作任务。在大型Greenplum集群、云部署或每台主机部署了大量的segment实例时,可能会遇到超过主机最大授权连接数限制的情况。此时需要考虑更新SSH配置参数MaxStartups 以提高该限制。

2)gpbackup命令

 gpbackup --dbname database_name
   [--backup-dir directory]
   [--compression-level level]
   [--data-only]
   [--debug]
   [--exclude-schema schema_name]
   [--exclude-table schema.table]
   [--exclude-table-file file_name]
   [--include-schema schema_name]
   [--include-table schema.table]
   [--include-table-file file_name]
   [--incremental [--from-timestamp backup-timestamp]]
   [--jobs int]
   [--leaf-partition-data]
   [--metadata-only]
   [--no-compression]
   [--plugin-config config_file_location]
   [--quiet]
   [--single-data-file]
   [--verbose]
   [--version]
   [--with-stats]
gpbackup --help 

选项
- -dbname database_name
必须。指定要备份的数据库。
- -backup-dir directory
可选。复制所有备份文件(元数据文件和数据文件)到指定路径。必须指定directory 为绝对路径(不能是相对路径)。如果不提供该选项,元数据文件会保存在Greenplum Master主机的 $MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下。Segment主机的CSV数据文件保存在<seg_dir>/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下。当指定该选项时,文件会被复制到备份目录的子路径下。该选项不能和–plugin-config一起使用。
- -compression-level level
可选。指定用来压缩数据文件的gzip压缩级别(从1到9)。默认为1。注意,gpbackup 默认使用压缩。
- -data-only
可选。仅将表数据备份到CSV文件,不备份用来重建表和其他数据库对象的元数据文件。
- -debug
可选。显示操作期间的调试信息。
- -exclude-schema schema_name
可选。指定要被排除备份的模式名。该参数可以指定多次以排除多个模式。该选项不能与 --include-schema一起使用,也不能与表过滤选项例如: --include-table一起使用。
- -exclude-table schema.table
可选。指定要排除在备份中的表。被排除的表必须为格式. 。如果表或模式名使用了任何非小写字母、数字或下划线,必须用双引号包裹名字。该选项可以指定多次。 该选项不能与–exclude-schema或–include-table同时使用。
该选项不能和–leaf-partition-data组合使用。虽然您可以指定子分区名字,但是 gpbackup会忽略分区名称。
- -exclude-table-file file_name
可选。指定一个包含需要排除在备份之外的列表文件。每行必须指定一个单独的表,格式为 .。文件不能包含多余的行。 如果表或模式名使用了任何非小写字母、数字或下划线,必须用双引号包裹名字。该选项可以指定多次。 该选项不能与–exclude-schema或–include-table同时使用。
该选项不能和–leaf-partition-data组合使用。虽然您可以在–exclude-table-file 中指定子分区名字,但是gpbackup会忽略分区名称。
- -include-schema schema_name
可选。指定要包含在备份中的数据库模式名。可以多次指定该参数来包含多个备份模式。如果指定该选项, 任何不包含在–include-schema中的模式都不会放在备份集中。该选项不能与选项 --exclude-schema、–include-table或 --include-table-file一起使用。
- -include-table schema.table
可选。指定一个要包含在备份中的表。该表的格式必须为.。 如果表或模式名使用了任何非小写字母、数字或下划线,必须用双引号包裹名字。有关模式和表名中支持的 字符信息详情,请见模式和表名中的模式和表名部分。
该选项可以指定多次。该选项不能和模式筛选选项–include-schema或–exclude-table-file等 一起使用。
客户也可以指定序列或视图的名字。
如果指定该选项,该工具不会自动备份依赖对象。客户必须指定相关依赖对象。例如,如果备份了视图, 客户必须备份试图所用的表。如果备份表用到了一个序列,客户必须也备份相关的序列。
可以在表名处通过指定–leaf-partition-data选项来指定表子分区名字, 仅备份指定的分区。当指定子分区备份时,子分区数据和分区表的元数据信息都会被备份。
- -include-table-file file_name
 可选。指定一个备份时需要的表名列表文件。文件中的每行必须定义为单独的表名,格式为: .。该文件不能包含多余的列。 有关模式和表名中支持的 字符信息详情,请见模式和表名中的模式和表名部分。
 任何没有列在文件中的表都会被排除在备份集以外。该选项不能与模式过滤选项–include-schema 或–exclude-table-file等一起使用。
 该选项也可以指定序列和视图名称。
 如果指定该选项,该工具不会自动备份依赖对象。客户必须指定相关依赖对象。例如,如果备份了视图, 客户必须备份试图所用的表。如果备份表用到了一个序列,客户必须也备份相关的序列。
 可以在表名处通过指定–leaf-partition-data选项来指定表子分区名字, 仅备份指定的分区。当指定子分区备份时,子分区数据和分区表的元数据信息都会被备份。
- -incremental
 指定该选项可以增加一个增量备份到增量备份集中。一个备份集包括一个全量备份和一个或多个增量备份。 该备份集合必须是连续性的,以保证在恢复时是可用的。
 默认情况下,gpbackup会找出最近的备份。如果该备份是全备份,工具会创建一个 备份集合。如果备份为增量备份,工具会将备份增加到已经存在的备份集。增量备份被增加到备份集的最后 。可以通过指定–from-timestamp来覆盖默认的行为。
- -from-timestamp backup-timestamp
 可选。指定备份时间戳。指定的备份必须已经有增量备份存在。如果指定的备份只有全量备份,该工具 会创建一个备份集。如果指定的备份是增量备份,工具会将增量备份直接备份到该备份集合。
 该选项必须与–leaf-partition-data选项一起使用。不能与–data-only 或–metadata-only一起使用。
 如果备份操作不能增加备份到已经存在的增量备份集或者不能使用备份来创建一个备份集,工具将不能创建备份 并且工具会返回错误。
 有关创建和使用增量备份的详细信息,请见使用gpbackup和gprestore创建增量备份。
- -jobs int
 可选。指定进行表备份的并行任务数量。默认gpbackup采用1个任务(数据库连接)。 增加该参数的值可以提高数据备份的速度。多运行多个任务时,每个任务会在一个单独的事务中备份表。 例如,如果指定–jobs 2,工具会创建2个进程,每个进程启动一个单独的事务, 工具会使用这两个进程并行的备份表。
 Important: 如果指定超过1的值,数据库在工具从表上获取备份用的锁时处于静默状态。 如果数据库操作正在那些被备份的表上执行,此时进行备份的话这些表在不同事务中的锁处理和一致性 问题不能被保证。
 该选项不能和–metadata-only、–single-data-file或 --plugin-config一起使用。
- -leaf-partition-data
 可选。对于分区表,该选项定义后会为每一个子分区创建一个单独的数据文件,而不是为整个表创建一个 完成的文件(默认)。使用该选项要求客户通过–include-table-file选项指定 包含在备份中的单独子节点分区。该选项不能与–exclude-table-file或 --exclude-table选项同时使用。
- -metadata-only
 可选。仅创建可用来重建数据库的元数据文件(DDL),不备份表的实际数据。
- -no-compression
 可选。不对表数据CSV文件进行压缩。
- -plugin-config config-file_location
 指定gpbackup插件配置文件的位置,该文件是一个YAML格式的文本文件。 该文件包含gpbackup在备份操作期间使用的配置信息。
 如果在备份数据库时指定了–plugin-config选项,那么在从备份 恢复数据库时也需要同样指定对应的配置信息。
 该选项不能与–backup-dir一起使用。
- -quiet
 可选。不显示所有非告警、非错误日志信息。
- -single-data-file
 可选。在每个Segment主机上为所有备份的表创建一个单独的数据文件。默认情况下,每个gpbackup 会为每张表创建一个压缩CSV文件。
 Note: 如果选用–single-data-file选项来将每个Segment上的数据备份为1个文件, 就不能在使用gprestore时指定–jobs选项为超过1的值来执行 并行恢复。
- -verbose
 可选。打印详细日志信息。
- -version
 可选。打印工具版本号并退出。
- -with-stats
 可选。在备份集中包含查询计划统计信息。
- -help
 显示在线帮助信息。

3)返回码

gpbackup完成后会返回如下返回码之一。

• 0 – 成功完成备份。
• 1 – 备份完成,没有严重错误。具体信息见日志文件。
• 2 – 备份失败,有严重错误。具体信息见日志文件。

4)表名和模式

当指定表过滤项–include-table或–include-table-file为列表文件时,gpbackup支持备份模式或表名,可包含以下特殊字符时。

~ # $ % ^ & * ( ) _ - + [ ] { } > < \ | ; : / ? ! ,

如果在命令行指定–include-table选项时,名字包含大写字母或特殊字符时,名字必须被单引号包裹。例如:

gpbackup --dbname test --include-table 'my#1schema'.'my_$42_Table'

当使用–include-table-file选项,表名被放在文件中时,不需要使用单引号。例如, 使用–include-table-file选项备份两个表。

my#1schema.my_$42_Table
my#1)schema.my_$590_Table

Note: --include-table和–include-table-file选项不支持 模式名或表名包含:

双引号(")、点号(.)、换行符(\n) 或空格符( )。

5)实例演示

执行基础备份操作

要执行数据库的完整备份以及Greenplum数据库系统元数据,请使用以下命令:

gpbackup --dbname <database_name>

例如:

$ gpbackup --dbname demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Starting backup of database demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Timestamp = 20180105112754
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Database = demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Type = Unfiltered Compressed Full Backup
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Gathering list of tables for backup
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired:  6 / 6 [================================================================] 100.00% 0s
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Gathering additional table metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing global database metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Global database metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing pre-data metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Pre-data metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing post-data metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Post-data metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing data to file
Tables backed up:  3 / 3 [==============================================================] 100.00% 0s
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Data backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Email containing gpbackup report /gpmaster/seg-1/backups/20180105/20180105112754/gpbackup_20180105112754_report will not be sent
20180105:11:27:55 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup completed successfully

上面的命令在Greenplum数据库master主机的默认目录中创建一个包含全局和数据库特定元数据(包括模式和表)的文件,$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDHHMMSS/
例如:

$ ls /gpmaster/gpsne-1/backups/20180105/20180105112754
gpbackup_20180105112754_config.yaml   gpbackup_20180105112754_report
gpbackup_20180105112754_metadata.sql  gpbackup_20180105112754_toc.yaml

默认情况下,每个节点用一个独立的压缩CSV文件在<seg_dir>/backups/YYYYMMDD/YYYYMMDDHHMMSS/存储备份的每个表的数据:

$ ls /gpdata1/gpsne0/backups/20180105/20180105112754/
gpbackup_0_20180105112754_17166.gz  gpbackup_0_20180105112754_26303.gz
gpbackup_0_20180105112754_21816.gz

要将所有备份文件合并到一个目录中,请包含–backup-dir选项。 请注意,您必须使用此选项指定绝对路径:

$ gpbackup --dbname demo --backup-dir /home/gpadmin/backups
20171103:15:31:56 gpbackup:gpadmin:0ee2f5fb02c9:017586-[INFO]:-Starting backup of database demo
...
20171103:15:31:58 gpbackup:gpadmin:0ee2f5fb02c9:017586-[INFO]:-Backup completed successfully
$ find /home/gpadmin/backups/ -type f
/home/gpadmin/backups/gpseg0/backups/20171103/20171103153156/gpbackup_0_20171103153156_16543.gz
/home/gpadmin/backups/gpseg0/backups/20171103/20171103153156/gpbackup_0_20171103153156_16524.gz
/home/gpadmin/backups/gpseg1/backups/20171103/20171103153156/gpbackup_1_20171103153156_16543.gz
/home/gpadmin/backups/gpseg1/backups/20171103/20171103153156/gpbackup_1_20171103153156_16524.gz
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_config.yaml
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_predata.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_global.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_postdata.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_report
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_toc.yaml
执行其他备份操作

备份"demo"数据库中除了"twitter"模式以外的所有模式和表:

$ gpbackup --dbname demo --exclude-schema twitter

仅备份"demo"数据库中的"twitter"模式:

$ gpbackup --dbname demo --include-schema twitter

备份"demo"数据库中的所有模式和表,包括Greenplum数据库全局系统对象,将所有备份文件复制到 /home/gpadmin/backup路径下。

$ gpbackup --dbname demo --with-stats --backup-dir /home/gpadmin/backup

该示例使用–include-schema和–exclude-table 备份指定模式,除了单独的一张表。

$ gpbackup --dbname demo --include-schema mydata --exclude-table mydata.addresses

–exclude-schema选项不能与表过滤选项一起使用,例如–include-table。

6、使用gprestore对GPDB进行还原

1)gprestore介绍

恢复由gpbackup创建的Greenplum数据库备份。默认gprestore 使用位于Greenplum Master主机数据目录下的元数据文件和DDL文件,使用存储于Segment主机上的表数据CSV 文件
 
使用gprestore从备份集恢复时,必须包含–timestamp选项来指定确切一个来自备份集的恢复时间值(YYYYMMDDHHMMSS)。如果在备份时指定了 --backup-dir,那么gprestore同样要指定 --backup-dir 来获取备份文件。如果指定的是增量备份,那么还需要一个完全备份的文件集合(一个全备和所有需要的增量备份)。gprestore会在开始恢复之前验证备份集合是可用的。
Important:对于增量备份集,备份必须在单独设备上。例如,备份集的所有文件必须全部在 Data Domain系统。
 
有关增量备份的详细信息,请见使用gpbackup和gprestore创建增量备份
 
当从备份集恢复时,gprestore会将数据恢复到创建备份时指定的数据库。如果目标数据库存在,并且数据库中存在该表,恢复操作会失败。如果目标数据库不存在,可以通过指定 --create-db 选项来创建数据库。也可以通过指定 --redirect-db 选项来将数据恢复到不同的数据库。
 
当恢复分区表的子分区时,分区表和数据会一同被恢复。例如,使用gpbackup的 --include-table-file 选项创建了一个备份。恢复数据时会恢复创建分区表并只将数据恢复到列表文件中指定的分区。
 
Greenplum数据库系统对象会自动包含在gpbackup备份集中,但是只有在用gprestore进行恢复时指定–with-globals 选项才会进行恢复。相似的情况还有,如果备份时使用–with-stats选项备份了查询计划统计信息,那么在使用gprestore进行恢复时必须指定–with-stats才能对这部分数据进行恢复。默认情况下,只有备份集中的数据库对象会被恢复。
 
恢复操作的性能可以通过提高创建多个并行连接的方式来同时恢复多个表和元数据。默认gprestore 使用1个连接,但是我们可以通过–jobs选项来为大的恢复过程增加处理进程数。
 
当一个操作完成后,gprestore会返回一个状态码。详见Return Codes
 
Note: 该工具在系统内部采用SSH连接执行各项操作任务。在大型Greenplum集群、云部署或每台主机部署了大量的 segment实例时,可能会遇到超过主机最大授权连接数限制的情况。此时需要考虑更新SSH配置参数MaxStartups 以提高该限制。更多关于SSH配置的选项,请参考您的Linux分发版的SSH文档。

2)gprestore命令

gprestore --timestamp YYYYMMDDHHMMSS
   [--backup-dir directory]
   [--create-db]
   [--debug]
   [--exclude-schema schema_name]
   [--exclude-table schema.table]
   [--exclude-table-file file_name]
   [--include-schema schema_name]
   [--include-table schema.table]
   [--include-table-file file_name]
   [--data-only | --metadata-only]
   [--jobs int]
   [--on-error-continue]
   [--plugin-config config_file_location]
   [--quiet]
   [--redirect-db database_name]
   [--verbose]
   [--version]
   [--with-globals]
   [--with-stats]

gprestore --help

- -timestamp YYYYMMDDHHMMSS
 必须。指定一个用来恢复gpbackup备份集的时间戳。默认gprestore 会尝试从Master主机的$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下定位时间戳对应的元数据文件,从每个Segment主机的<seg_dir>/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下定位CSV数据文件。
- -backup-dir directory
 可选。从指定的路径下找所有备份文件(元数据文件和数据文件)。必须指定directory 为一个绝对路径(不能是相对路径)。如果没有指定该选项,gprestore会尝试从Master主机的 $MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下定位时间戳对应的元数据文件,从每个Segment主机的<seg_dir>/backups/YYYYMMDD/YYYYMMDDhhmmss/ 路径下定位CSV数据文件。如果gpbackup操作指定了该选项,那么恢复时请同时指定该选项。
该选项不能和–plugin-config选项一起使用。
- -create-db
 可选。在恢复数据库对象元数据之前先创建数据库。
通过复制空的系统标准数据库template0来创建指定的数据库。
- -data-only
 可选。仅恢复gpbackup创建的表数据,不恢复创建数据库表的操作。该选项假定 数据库中已经存在对应的表。如果要恢复指定的集合,可以通过指定选项来包含表/模式或排除表/模式。 指定–with-stats选项来从备份集恢复表的统计信息。
 备份集必须包含要被恢复的表数据。例如,gpbackup采用选项 --metadata-only备份的备份集不包含表数据,不能用来恢复数据。
如果要仅恢复数据库表,不恢复表里的数据,参见选项 --metadata-only。
- -debug
 可选。显示操作期间的详细信息和调试日志。
- -exclude-schema schema_name
 可选。指定恢复操作期间要排除的数据库模式。可以多次指定以排除多个模式。该选项不能和 --include-schema或表过滤选项(例如:–include-table) 一起使用。
- -exclude-table schema.table
 可选。指定恢复操作期间要排除的表。指定的格式必须为.。 如果表名或模式名使用了非小写字母、数字或下划线,那改名字可以用双引号包裹。客户可以多次指定该选项。 如果表不在备份集中,恢复操作会失败。不能指定分区表的子分区。
 该选项不能与–exclude-schema或表过滤选项(例如:–include-table) 一起使用。
- -exclude-table-file file_name
 可选。指定恢复期间要排除的表的列表文件。文件为text格式,并且每行都必须定义一个单独的表,格式为 .。文件不能包含多余的行。 如果表名或模式名使用了非小写字母、数字或下划线,那改名字可以用双引号包裹。客户可以多次指定该选项。 如果表不在备份集中,恢复操作会失败。不能指定分区表的子分区。
 该选项不能与–exclude-schema或表过滤选项(例如:–include-table) 一起使用。
- -include-schema schema_name
 可选。指定要恢复的数据库模式。可以多次指定该选项以包含多个模式。如果指定了该选项,那定义的任何 模式都必须在备份集中。没在–include-schema选项中指定的所有模式都会被忽略。
 如果指定的模式在目标数据库中存在,该工具会产生一个错误然后继续操作。如果被恢复的表在数据库中存在, 该工具会失败。
 如果备份集在多个模式下存在依赖关系,那不能使用该选项。
更多信息请见过滤备份和恢复的内容。
- -include-table schema.table
 可选。指定一个要恢复的表。格式必须为.。 如果任何表名或模式名使用非小写字母、数字或下划线,那么可以用双引号包裹名字。该选项可以多次指定。 不能指定分区表的子分区。
也可以指定一个有效的模式或视图。
 如果指定了该选项,工具不会自动恢复依赖对象。必须指定需要的依赖对象。例如,如果恢复一个视图, 那么必须也恢复它对应的表。如果恢复的表使用到了一个序列,那么也必须恢复该序列。这些对应的对象 也必须都在备份集中存在。
 不能将该选项与–include-schema或表过滤选项 (例如–exclude-table-file)一起使用。
- -include-table-file file_name
 可选。指定一个包含恢复表名的列表文件。每行代表一张单独的表,格式必须为 .。该文件不能包含多余的行。 如果表名或模式名使用了非小写字母、数字或下划线,那改名字可以用双引号包裹。客户可以多次指定该选项。 如果表不在备份集中,恢复操作会失败。不能指定分区表的子分区。
 也可以指定一个有效的模式或视图。
 如果指定了该选项,工具不会自动恢复依赖对象。必须指定需要的依赖对象。例如,如果恢复一个视图, 那么必须也恢复它对应的表。如果恢复的表使用到了一个序列,那么也必须恢复该序列。这些对应的对象 也必须都在备份集中存在。
 如果使用–include-table-file选项,gprestore 不会创建表的角色或用户集合。工具会恢复表的索引和规则。触发器也会被恢复,但是Greenplum 目前不支持触发器。
更多信息请见过滤备份或恢复的内容 。
- -jobs int
 可选。指定恢复表数据和元数据的并行连接的数量。默认gprestore使用1个连接。 增加该参数会提高数据恢复的速度。
Note: 如果使用gpbackup --single-data-file选项合并表备份为每个Segment 节点1个单独的文件,那么不能在恢复过程中指定–jobs超过1来进行并行恢复。
- -metadata-only
 可选。从一个gpbackup创建的备份集中创建数据库表,不恢复数据。该选项 假设目标数据库中不存在这些表。要从备份集创建指定的表集合,可以通过指定对应的选项来选择或 排除相应的表或模式。指定选项–with-globals来恢复Greenplum数据库 系统对象。
 备份集必须包含要恢复的表的DDL数据。例如,gpbackup选项–data-only 生成的备份集就不包含表的DDL信息。
 创建完数据库表后再恢复表数据,请见选项 --data-only。
- -on-error-continue
 可选。指定该选项以在创建数据库元数据(例如表、对象或函数)或恢复数据过程中出现SQL错误时, 忽略错误继续执行。如果有其他类型错误出现,工具会退出。工具会显示错误信息汇总并将错误信息写入到 gprestore日志文件,并继续恢复操作。
 默认为第一次出现错误即退出。
- -plugin-config config-file_location
 指定gpbackup插件配置文件位置,它是一个YAML格式的文本文件。该文件包含 gprestore在恢复操作期间使用的插件的配置信息。
 如果备份数据库时指定了–plugin-config选项,那么在从该备份集恢复 数据时也必须指定该配置文件。
 该选项不能与–backup-dir同时使用。
 有关存储插件应用的详细信息,请见使用gpbackup存储插件
- -quiet
 可选。禁止任何非告警、非错误日志输出。
- -redirect-db database_name
 可选。恢复到指定的database_name,而不是备份时的默认数据库名。
- -verbose
 可选。显示恢复操作期间的详细日志信息。
- -version
 可选。打印版本号并退出。
- -with-globals
 可选。恢复备份集合中的Greenplum数据库系统对象,和其余数据库对象。详见备份或还原中包含的对象。
- -with-stats
 可选。从备份集合恢复查询计划统计信息。
- -help
 显示在线帮助信息。

3)返回码

gprestore完成后会返回如下返回码之一

  • 0 – 成功完成恢复。
  • 1 – 恢复完成,没有严重错误。具体信息见日志文件。
  • 2 – 恢复失败,有严重错误。具体信息见日志文件。

4)实例演示

4.1)执行基本恢复操作

使用gprestore从备份集合恢复所有表名和模式名,必须使用–timestamp选项指定准确的时间戳值(YYYYMMDDHHMMSS)。 包括–create-db选项,如果数据库未在集群中创建。 例如:

$ dropdb demo
$ gprestore --timestamp 20171103152558 --create-db
20171103:15:45:30 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restore Key = 20171103152558
20171103:15:45:31 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Creating database
20171103:15:45:44 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Database creation complete
20171103:15:45:44 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring pre-data metadata from /gpmaster/gpsne-1/backups/20171103/20171103152558/gpbackup_20171103152558_predata.sql
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Pre-data metadata restore complete
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring data
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Data restore complete
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring post-data metadata from /gpmaster/gpsne-1/backups/20171103/20171103152558/gpbackup_20171103152558_postdata.sql
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Post-data metadata restore complete

如果指定自定义的–backup-dir来合并备份文件,使用gprestore时指定相同的–backup-dir选项来定位备份文件:

$ dropdb demo
$ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db
20171103:15:51:02 gprestore:gpadmin:0ee2f5fb02c9:017819-[INFO]:-Restore Key = 20171103153156
...
20171103:15:51:17 gprestore:gpadmin:0ee2f5fb02c9:017819-[INFO]:-Post-data metadata restore complete

gprestore默认不会为Greenplum系统尝试恢复全局元数据。 如果这个是必须的,需要–with-globals参数。

4.2)执行其他恢复操作

恢复备份集到"demo2"数据库而不是默认备份的"demo"数据库:

$ createdb demo2
$ gprestore --timestamp 20171103152558 --redirect-db demo2

恢复数据库全局对象和查询计划统计信息,而不是默认的全部数据:

$ gprestore --timestamp 20171103152558 --create-db --with-globals --with-stats

默认情况下,gprestore使用一个连接去恢复表数据和元数据。 如果备份集非常大,可以使用–jobs选项来提高并发连接数从而提升恢复性能。 测试备份集的并行连接数,以确定快速数据恢复的理想数量。例如:

$ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db --jobs 8

使用创建在/home/gpadmin/backup下的文件恢复数据,创建8个并行连接:

$ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db --jobs 8

仅恢复备份集中的"wikipedia"模式:

$ dropdb demo
$ gprestore --include-schema wikipedia --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db

如果从增量备份集中恢复,所有需要的备份文件都必须对gprestore可用。例如, 以下时间戳指定增量备份集。20170514054532时增量备份集合的全备份。

20170514054532 (full backup)
20170714095512
20170914081205
20171114064330
20180114051246

以下gprestore命令指定时间戳20121114064330。时间戳为20120714095512和 20120914081205的增量备份和全量备份必须都能被恢复程序访问。

gprestore --timestamp 20121114064330 --redirect-db mystest --create-db

7、使用gpbackup和gprestore创建增量备份

gpbackup和gprestore工具支持创建追加优化表的增量备份以及从增量备份还原。 只有表被更改时,增量备份才会备份所有指定的堆表和追加优化的表(包括追加优化的,面向列的表)。
例如,如果追加优化表的行已更改,则会备份该表。对于分区的追加优化表,仅备份更改的叶子分区。
当自上次备份以来,追加优化表更或分区表更改的数据与未更改的数据相比量很小的时候,增量备份是高效的。
仅当在上次全量备份或增量备份后对表执行以下操作之一时,增量备份才会备份追加优化表:
• ALTER TABLE
• DELETE
• INSERT
• TRUNCATE
• UPDATE
• DROP然后重建表
要从增量备份还原数据,您需要一个完整的增量备份集。

1)关于增量备份集

关于增量备份集,一个增量备份集包含如下备份:

  • 一个全量的备份。这是增量备份基于的全量备份。
  • 捕获全量备份后数据库的增量备份集。

例如:创建一个全量备份,然后创建三个天级增量备份。 全量备份和全部三个增量备份就是备份集。 关于增量备份更多信息,请参考使用增量备份集的例子。

创建或添加到增量备份集时,gpbackup可确保使用一组一致的备份选项创建集合中的备份,以确保可以在还原操作中使用备份集。 关于备份集合一致性的信息,参考使用增量备份。

创建增量备份时,包含这些选项与其他 gpbackup 选项一起创建备份:

  • - -leaf-partition-data 增量备份集中的所有备份都需要。
          - 创建全量备份时必需,该备份将作为增量备份集的基备份。
          - 创建增量备份时必须。
  • - -incremental 创建增量备份时必须。
    不能将–data-only或–metadata-only和–incremental一起使用。
  • - -from-timestamp 可选的。该选项可以和 - -incremental 一起使用。 指定的时间戳是一个已经存在的备份。 可以是一个全量备份或增量备份。 创建的备份必须和使用 - -from-timestamp 选项指定的备份兼容。
    如果不指定- -from-timestamp,gpbackup会尝试基于gpbackup历史文件找一个兼容的备份。 参考增量备份说明

2)使用增量备份

将增量备份添加到备份集时,gpbackup通过检查以下gpbackup选项来确保全量备份和增量备份是一致的:
- -dbname - 数据库必须相同。
- -backup-dir - 文件夹必须相同。备份集,全量和增量备份路径必须相同。
- -single-data-file - 这个选项在集合中所有的备份,要么全部指定,要么全部非指定。
- -plugin-config - 如果指定该选项,则必须在备份集中所有的备份中都指定。 配置必须引用相同的二进制插件文件。
- -include-table-file, --include-schema, 或其他过滤表和schema的选项必须相同。 当检查schema筛选时,只检查schema名字,不检查schema里包含的对象。
- -no-compression 如果这个选项被指定,必须在备份集中所有的备份中都要指定。 如果在全量备份上使用压缩,则必须在增量备份上使用压缩。 备份集中的备份允许不同的压缩级别。
 
如果尝试将增量备份添加到备份集,则如果gpbackup选项不一致,则备份操作将失败。

2.1)使用增量备份集的例子

每个备份都有一个创建备份时的时间戳。 例如,如果您在2017年5月14日创建备份,则备份文件名包含20170514hhmmss。 hhmmss表示时间:小时,分钟和秒。

此示例假定您已创建数据库mytest的两个全量备份和增量备份。 要创建全量备份,请使用以下命令:

gpbackup --dbname mytest --backup-dir /mybackup --leaf-partition-data

使用下面命令创建增量备份:

gpbackup --dbname mytest --backup-dir /mybackup --leaf-partition-data --incremental

当指定–backup-dir选项时,备份被创建在每个数据库主机的/mybackup目录里。

在该示例中,全量备份具有时间戳键20170514054532和20171114064330。其他备份是增量备份。 该示例包含两个备份集,第一个具有两个增量备份,第二个具有一个增量备份。 备份从最早到最近列出。

20170514054532 (全量备份)
20170714095512
20170914081205
20171114064330(全量备份)
20180114051246

要基于最新的增量备份创建新的增量备份,必须包含与增量备份相同的- -backup-dir选项以及- -leaf-partition-data和- -incremental选项。

gpbackup --dbname mytest --backup-dir /mybackup --leaf-partition-data --incremental

您可以指定- -from-timestamp选项以基于现有增量备份或全量备份创建增量备份。 根据该示例,此命令将第四个增量备份添加到备份集,其中包括20170914081205作为增量备份,并使用20170514054532作为全量备份。

gpbackup --dbname mytest --backup-dir /mybackup --leaf-partition-data --incremental --from-timestamp 20170914081205

此命令基于全量备份20171114064330创建增量备份集,并与包含增量备份20180114051246的备份集分开。

gpbackup --dbname mytest --backup-dir /mybackup --leaf-partition-data --incremental --from-timestamp 20171114064330

要使用增量备份20170914081205还原数据库, 需要增量备份20120914081205和20170714095512, 以及全量备份20170514054532。这将是gprestore命令。

gprestore --backup-dir /backupdir --timestamp 20170914081205
2.2)使用gpbackup创建增量备份

gpbackup输出显示增量备份所基于的备份的时间戳。 在此示例中,增量备份基于时间戳为20180802171642的备份。 备份20180802171642可以是增量备份或全量备份。

$ gpbackup --dbname test --backup-dir /backups --leaf-partition-data --incremental
20180803:15:40:51 gpbackup:gpadmin:mdw:002907-[INFO]:-Starting backup of database test
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Backup Timestamp = 20180803154051
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Backup Database = test
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Gathering list of tables for backup
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired:  5 / 5 [================================================================] 100.00% 0s
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Gathering additional table metadata
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Metadata will be written to /backups/gpseg-1/backups/20180803/20180803154051/gpbackup_20180803154051_metadata.sql
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Writing global database metadata
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Global database metadata backup complete
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Writing pre-data metadata
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Pre-data metadata backup complete
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Writing post-data metadata
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Post-data metadata backup complete
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Basing incremental backup off of backup with timestamp = 20180802171642
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Writing data to file
Tables backed up:  4 / 4 [==============================================================] 100.00% 0s
20180803:15:40:52 gpbackup:gpadmin:mdw:002907-[INFO]:-Data backup complete
20180803:15:40:53 gpbackup:gpadmin:mdw:002907-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20180803:15:40:53 gpbackup:gpadmin:mdw:002907-[INFO]:-Email containing gpbackup report /backups/gpseg-1/backups/20180803/20180803154051/gpbackup_20180803154051_report will not be sent
20180803:15:40:53 gpbackup:gpadmin:mdw:002907-[INFO]:-Backup completed successfully
2.3)使用gprestore从增量备份恢复

从增量备份还原时,可以指定–verbose选项以在命令行上显示还原操作中使用的备份。 例如,以下gprestore命令使用时间戳20180807092740(增量备份)还原备份。 输出包括用于还原数据库数据的备份。

$ gprestore --create-db --timestamp 20180807162904 --verbose
...
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[INFO]:-Pre-data metadata restore complete
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Verifying backup file count
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Restoring data from backup with timestamp: 20180807162654
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.tbl_ao from file (table 1 of 1)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Checking whether segment agents had errors during restore
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Restoring data from backup with timestamp: 20180807162819
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.test_ao from file (table 1 of 1)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Checking whether segment agents had errors during restore
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Restoring data from backup with timestamp: 20180807162904
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.homes2 from file (table 1 of 4)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.test2 from file (table 2 of 4)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.homes2a from file (table 3 of 4)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Reading data for table public.test2a from file (table 4 of 4)
20180807:16:31:56 gprestore:gpadmin:mdw:008603-[DEBUG]:-Checking whether segment agents had errors during restore
20180807:16:31:57 gprestore:gpadmin:mdw:008603-[INFO]:-Data restore complete
20180807:16:31:57 gprestore:gpadmin:mdw:008603-[INFO]:-Restoring post-data metadata
20180807:16:31:57 gprestore:gpadmin:mdw:008603-[INFO]:-Post-data metadata restore complete

输出显示还原操作使用了三个备份。

从增量备份还原时,gprestore还会在gprestore日志文件中列出还原操作中使用的备份。

在还原操作期间,如果全量备份或其他所需的增量备份不可用,gprestore将显示错误。

3)增量备份说明

要创建增量备份或从增量备份集还原数据,您需要完整的备份集。 存档增量备份时,必须存档完整的备份集。 您必须归档在master和所有segment上创建的所有文件。

每次运行gpbackup时,该工具都会将备份信息添加到Greenplum数据库master数据目录中的历史文件gpbackup_history.yaml。 该文件包括备份选项和其他备份信息。

如果在创建增量备份时未指定- -from-timestamp选项,则gpbackup将使用具有一致选项集的最新备份。 该工具检查备份历史记录文件以查找具有一致选项集的备份。 如果工具找不到具有一致选项集的备份或历史文件不存在,则gpbackup会显示一条消息,指出必须先创建全量备份才能创建增量。

如果在创建增量备份时指定- -from-timestamp选项,则gpbackup可确保正在创建的备份选项与指定备份的选项一致。

对于备份集中的所有备份,gpbackup选项 - -with-stats不需要相同。 但是,要使用gprestore选项 - -with-stats执行还原操作以还原统计信息,您指定的备份必须在创建备份时必须使用 - -with-stats。

您可以从备份集中的任何备份执行还原操作。 但是,将不会还原在备份用于还原数据库数据之后的增量备份中捕获的更改。

从增量备份集还原时,gprestore会检查备份并从备份集中最新版本的追加优化表中还原每个追加优化表,并从最新备份还原堆表。

增量备份集,全量备份和关联的增量备份必须位于单个设备上。 例如,备份集中的备份必须全部位于文件系统上,或者必须全部位于Data Domain系统上。

Warning: 对Greenplum数据库segment配置的更改会使增量备份无效。 更改segment配置(添加或删除segment实例)后,必须先创建全量备份,然后才能创建增量备份。

8、备份和还原方案设计

具体的备份方案,可根据以上全量备份与增量备份的方案,进行定制化设计。在这里不做具体方案内容。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44179427/article/details/112966845

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签