导图社区 HCCDP-GaussDB工作级认证最全速记脑图v1.0
华为高斯认证工作级,这个速记脑图提供了一个清晰的结构,帮助记忆和理解HCCDP-GaussDB工作级认证的核心知识点。复习材料一张脑图全搞定!
编辑于2024-12-11 17:28:16hccdp
GAUSSDB数据库介绍
gaussdb概述
持分布式事务强一致,同城跨AZ部署,数据0丢失,支持1000+的计算节点扩展能力,4PB海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。
高性能:32节点,1500万tpmc; 3节点 500GB<200s, 100GB<500s, 单集群超4PB
高可用:数据零丢失,RPO=0;RTO<30
高扩展:计算与存储水平扩展; 在线重分布能力
高安全: 访问控制;加密认证,数据库审计,脱敏,全密态
gaussdb体系结构
Shared-Nothing架构优点: 易于扩展的架构。为BI和数据分析的高并发、大数据量计算提供高扩展能力。并行处理机制。 内部处理自动化并行。数据加载和访问方式与一般数据库相同。数据分布在所有的并行节点上。每个节点只处理其中一部分数据。 优化的I/O处理。所有的节点同时进行并行处理。节点之间完全无共享,无I/O冲突。 增加节点实现性能扩展增加节点可增加存储、查询和加载性能。
关键角色
OM:运维 CM:集群管理, GTM:全局事务管理:生成全局事务ID,快照,时间戳,sequence CN:协调节点:分解任务,调度任务在DN并行执行 DN:数据节点:存储数据,只想查询和返回数据给CN ETCD:分布式键值存储, 服务注册和发现 storage: 持久化存储
部署形态
主备:1+1最大可用,1+2最大保护
分布式:分布式高扩展, shard划分,分布式高可用,同城双活,两地三中心
gaussdb关键技术
SQL2011语法兼容, ODBC3,5, JDBC4.0, Libpq PygreSQL,
数据分布策略:replication; Hash,range,list
全局强一致事务:ACID
隔离级别: 读未提交 只读,应急, 读已提交: 可重复读: 串行化不支持
GTM模式:
GTM—free,更高处理性能,不支持强一致性读
GTM-lite: CSN优化,提供并发,降低负载
高可用
存储RAID,网络双交换机,网卡冗余,UPS电源保护
CM SERVER;CM Agent; CM Monitor
跨az:RPO=0:RTO<60s
两地三中心:RPO 10s, RTO 10分钟
在线横向扩展
集群加节点:同步DN元信息,分钟级
数据重分布:数据扩容重分布, 小时级;支持IUD, DDL下推DN
表切换:阻塞,秒级
负载均衡:统一入口,均匀分发给CN
故障隔离:JDBC client,CN 30s ELB 故障感知时间3S 可配置
备份恢复
备份指标
OBS带宽15GB;单分片备份2T 4H
5min产生200M数据,40%负荷;限速备份支持
KPI:10h恢复15分钟前状态
备份策略:全量:一周一次, 增量:15分,保留3个月,备份状态可查
恢复策略:指定增量备份点恢复, 状态可查
在线平滑升级
热补丁:零中断,业务无感知,解决紧急问题,缩短发版时间
灰度升级:优先升级部分节点,支持大小版本,支持在线,闪断一次10s以内
滚动升级:升级DN,支持大小版本,每个分片中断不超过10s
主要技术指标
DN分片:256,单表32T*节点,单行1600G 单字段1G
单表记录2^23,最大列1600,索引2^32 约束2^32,索引列32,对象63字节,并发10w
RPO=0, az内rto10s, raz间rto60s
gaussdb客户端工具
gsql:linux系统工具,命令行
安装链接:配置环境变量; 安装包..tmp/tools/
链接数据库: source ~/.bashrc,
gsql -d postgres-h 10.10.0.11 -Ujack-p 8000-WTest@123
指令:\l:查询数据库实例
\h\help[name]; \copyright;\q;\o[file]发送到文件;\c链接到数据库;\copy:导入导出
\d[S_];searchPath模式的表,视图序列
\db[+];表空间 \db[S+]所有模式;\du[+]角色 \l[+]:所有库,user,priv
das:可视化,data admin service
导入
导入文件1G
暂不支持BINARY、 VARBINARY、 TINYBLOB、 BLOB、 MEDIUMBLOB、 LONGBLOB等二进制 类型字段的导入
导出
执行sql最大5m
系统库不支持导出,
连接备库导出,不一定最新数据
dbeaver:支持mysql pg,oracle,db2, mssql,其他兼容jdbc的DB
驱动:JDBC,ODBC,Psycopg
高斯DB开发指引
驱动概述
客户端接入认证方式
基于主机的认证:服务端配置文件,匹配用户名,ip,库
口令认证:远程和本地的用户名密码
SSL认证
配置服务器
以集群安装用户登录GaussDB集群任意主机 执行如下命令增加对外提供服务的网卡IP或者主机名(英文逗号分隔),其中NodeName为当前节点名称: gs_guc reload -Z coordinator -N NodeName -I all -c "listen_addresses='localhost,10.1 1.12.13'" 执行如下命令在所有的CN配置文件中增加一条认证规则:gs_guc reload -Z coordinator -N all -I all -h "host alljack 10.11.12.13/32 sha256"
JDBC
概述
通过java.sql接口实现,符合sql2003标准,支持jdbc4,0和jdk8以上
两个包
java.sql:基本功能,编程服务,如生成链接,执行语句,准备语句,运行批处理, 事务隔离,滚动结果集
javax.sql:扩展功能:, 高级操作提供接口和类, 链接,分布式事务,连接池,行集
JDBC结构体系
JDBC API:应用程序到管理器链接;程序调用接口
JDBC Driver Manager: 驱动管理载入
JDBC Driver: 链接不同数据库(oracle,sql server, gaussDB)
GaussDB JDBC驱动
解压后三个驱动包
gsjdbc4.jar:与pg兼容, pg程序可直接移植gauss:,jdbc:postgresql
gsjdbc200.jar: 支持同时访问og和gauss, jdbc:gaussdb
opengaussjdbc.jar, url前缀为jdbc:opengauss
比PG驱动增强点:SHA256, slf4j, 分布式负载均衡,容灾切换
接口支持 java.sql
databasemetadata:数据库对象定义接口
preparedstatement:预处理,不支持executeLargeUpdate
statement:sql语句接口, executeLargeUpdate,getLargeupdatecount,executeLargeBatch(JDBC4.2以上)
javax.sql
pooledconnection :连接池创建的链接
copyManager: 批量集群导入数据,api接口类
PGreplicationConnection: api接口类,执行逻辑复制相关功能
DriverManager类: java.sql为数不多的类
定义了三个方法,getconnection(url ,user, paasword),三个参数的最常用
Connection接口
通过Connection对象,可以获得操作数据库的Statement,PrepearedStatement(预处理对象),CallableStetement(存储过程)
commit:释放当前connection对象当前持有的所有数据库锁
rollback:取消事务,锁释放同commit
close(): 立即释放此connection对象的数据库和jdbc资源,而不是等待释放
Statemnet接口
statement对象=conn.createStatement();
executeQuery;executeUpdate , 位未知类型使用execute()
statement不支持参数,只执行静态sql
结果集处理:next()末尾返回false, getxxx()方法获取数据
Resultset接口
结果集定位:absolute()移动到指定位置,relative,1-next,-1 previous, getRow()当前第几行,isxxx是否xxx
resultsetmeataDate接口:获取列的类型,属性,列数,名称,数据类型
PreparedStatement接口:预编译sql, 以后每次修改参数执行,性能好,比statement多了setXXX(index,value)、clearParameters()方法
批处理
conn.setAutoCommit(false); ps=,,生成预处理语句, for循环; ps.executeBatch;执行批处理
使用游标
statement.setFetchSize(50)打开游标, setFetchSize(0)关闭游标,
javax.sql.DataSource: getConnection(), int getLoginTimeout, PrinterWriter geetLogwriter, void setXXX
负载均衡: xxx?autoBanlance=[value], 轮询,优先级,随机,默认false
轮询:设置true,balance,roundrobin,开启, refreshCNIpListTIme 默认10s刷新
优先级:设置priorityN, 默认均衡到前N个, 刷新时间10S
随机:设置autoBalance=shuffle, 默认刷新时间10s
读写分离与故障转移
targetServerType=master:主节点, slave:备节点,preferslave先备后主, any,任意节点, 不可用抛异常,
注意:hostRecheckSeconds用于控制节点状态可惜时间, 默认10s,超过失效
日志记录功能
LoggerLevel:off/info/debug/trace, 详细程度不同
Loggerfile: 未指定责生成在客户端运行目录,不存在默认通过流输出
Logger:JDBC使用的框架, 仅支持slf4j-API, 默认使用JDKLogger
ODBC
ODBC开发介绍
ODBC(open database connectivity),微软基于X/OPEN CLI
开始-申请句柄-设置环境属性-连接数据源-执行sql-处理结果集-断开连接-释放句柄资源-结束
ODBC基本实现
ODBC驱动:psqlodbc,oralce odbc,DB2 odbc, 基于odbc api实现
ODBC驱动管理器:unidxOdbc,iODBC, 可编译C/C++
GaussDB支持ODBC3.5
x86_64:centos6.4-7.4
Arm64:centos7.6
X86-64:Euler2.0 sp2、sp3
Arm64:Euler2.0 SP8
ODBC安装配置
www.unioxodbc.org,下载unixODBC-2.3.7.tar.gz以上版本,默认安装到/usr/local, 源文件到 local/ect, 库到、/local/lib, root权限
配置文件:/usr/local/etc/odbcinst.ini(driver,setup); odbc.ini(driver=gaussmpp, user,paas.port ,ssl...)
配置环境变量:export LD_LIBRARY_PATH, ODBCSYSINI,ODBCINI,验证是否成:isql -v gaussdb
ODBC常用接口
分配ODBC句柄:SQLAllocHandle() 环境,链接,执行三个句柄
释放句柄:Freehandle(type, handle)
执行sql:sqlExecute, 获取结果:sqlFetch, 获取某列,sqlGetData, 多次调用检索不定长度的数据
ODBC开发问题总结
多条语句一个事务:关闭autocommit,结束调用sqlEndTran,
连续两条sql语句报错the cursor is open:中间执行sqlfetch或者sqlCloseCursor将游标重置
报错,bindmessager PLAN0x24b200 require1, 参数个数是否一致,占位符改成?或者$1
Psycopg
概述
执行sql的pythonAPI, psycopg2是对libpq的封装,C语言, 支持copy to/from,支持ssl
支持平台 x86_64/ARM64的Kylin
驱动配置
root用户将psycopg2拷贝到sit-packages,
psycopg2的目录权限755; 添加到环境变量$PSYTHONPATH,
psycopg2开发流程:加载驱动-链接数据库-执行sql-处理结果集-关闭链接
connection类:线程安全, 可以用作context管理器,包装了事务, 成功提交,异常回滚事务
connect方法 dbname,user,password,host,port'
cursor类
connection.cursor()创建,整个生命周期绑定数据库实例; 同数据库实例游标不孤立,不同数据库实例游标取决于连接的隔离级别
cursor方法:name -默认none, cursor-factory, 默认none,scrollable, None, withHold默认false
execute方法:execute(query,vars_list),psycopg2支持%s占位符
executemany:不比execute在循环执行快
fetchone:返回一个元祖,没有数据返回None
fetchAll:返回所有剩余行列表,空返回空列表
copy_from:写入表,copy_from(file,table,sep,null,size:读文件缓冲区大小,columns:指定列)
copy_to:写入文件, copy_to(file,table,sep=''分隔符 null=文件中的文本表示null columns=None 列名导出,默认所有列);
开发设计建议
对象命名设计建议
对象命名建议
避免使用保留或非保留关键词
避免使用双引号,除非限制大小写
对象命名风格务必保持统一:迁移的遵循历史,单词用下划线,望文知义,有意义
命名时区分表类型:临时表tmp_xx 非日志表ul_xx,外表f_xx,不创建以redis开头的
使用schema进行业务隔离,系统管理员创建schema和atabase再进行用户授权,不建议使用默认postgresql,utf8,
gaussDB支持TD,ORA,PG,MYSQL(默认)兼容模式,
ORA,空-null,date- timestamp(0) without time
字符串转整形,mysql转0,其他兼容报错
pg兼容,字符计数,其他字节计数
DB的owner拥有所有权限,包括删除,谨慎使用
schema&database
非owner需要授予schema的usage权限, schema创建对象需要有create权限, schema的owner拥有删除,谨慎使用
表设计
数据均匀分布到DN,避免数据倾斜,选择合适的分布列
扫描压力均匀分布,等值过滤会导致扫描压力不均
减少需要扫描的数据量,通过分区表的剪枝机制可以大幅减少扫描量
减少随机IO,使用聚簇、局部聚簇实现热数据连续存储,减少扫描IO
减少数据shuffle ,通过对关联条件和分组条件的设计。
字段:
性能考虑:整数,浮点数,numeric
多个表逻辑关系,同一含义使用相同数据类型
子主题
字符串建议变长指定最大长度,避免截断, 明确知道长度可以使用固定长度。
约束
DEFAULT和NULL
尽量从业务层面补全,不建议使用DEFAULT
NOT NULL优化器会进行优化
除了这两个,其他约束都可以显式命名
局部局簇PCK:列存表, min/max稀疏矩阵实现快速扫描
一张表只有一个PCK ,一般不建议超过2列
选择distinct值比较多的列建pck; col op const
主键约束:行列存表军支持
检查约束:行支持,列不支持, CK+字段名
视图
除非视图强依赖,否则不建议嵌套; 视图定义避免排序, 关联表:字段少,类型一致,命名提现关联关系
表设计最佳实践
分布方式
HASH:hash散列,适用数据量较大的事实表
replication: 冗余,适用小表,维度表
range、list, 用户自定义分布规则的场景
选择分布列
HASH:选择表的主键为分布列;连接条件使用分布列,join可以下推到DN,Hash分表策略之后需要进行数据倾斜检查
xc_node_id为DN, 不同DN 数据量相差5%以上视为倾斜, 10%必须调整分布列
分区表:改善查询性能,增强可维护性,方便维护; gaussdb支持范围分区表,缺点使用索引扫描代价较高,业务表建议使用地区或者range分区
分布式事务:尽量避免使用分布式:提升性能,提升并发,降低复杂性
sql查询最佳实践
where
包含所有分布键字段等值查询
避免使用相同的表字段进行比较
尽量使用is null, is not null
禁止对索引使用!=
避免隐式数据类型转换
避免使用表达式或函数
过滤条件,较小记录的排在前面
多使用等值,少使用非等值
模糊查询 %不放在首位, IN的子集不超过500
select
避免对大字段执行order by。group by等引起排序的操作
避免频繁使用count()获取大表行数
避免使用select *, 避免使用子查询,不要用count(col)替代count(*)
count(distinct col)计算不重复非NULL的数量
insert
insert on duplicate key update:不支持对主键或唯一约束上的列执行update
批量插入效率高于执行多条values()
update
不支持使用limit,明确目标行,不支持多表更新
必须有where字据,避免全表,不允许更新多个列时,是更新源
禁止使用order by, group by,避免不必要的排序
有主键/索引的表,更新时应结合主键和索引
delete
不支持limit。指定目标行 ;不支持多表删除,delete必须有子句,
在GTM-FREE模式下,不允许跨节点事务, 删除HASH分布数据必须指定等值过滤。
清空使用truncate, delete需要等到vaccuum full阶段才会清理磁盘空间;
其他事项参考update,大部分相同
关联查询
多表嵌套深度必须小于8, join必须使用on,避免笛卡尔积; 避免直接使用join;必须使用别名,避免隐式类型转换影响效率
多用关联,少用子查询; 大量null值的情况增加关联 is not null的过滤条件
子查询
禁止一条sql出现重复子查询
少用标量子查询
避免select目标列使用子查询,可能导致计划无法下推
子查询深度不建议超过2层
事务
GTM-FREE:sql执行包含跨节点事务会报错;
大对象不支持事务,如创建db,analyze,vacuum
避免拼接多条sql为一条语句
GAUSSDB数据库迁移
前言:数据库和应用迁移UGO(Data and Application Migration)和数据复制服务DRS(Data Replication Service)
UGO工具
UGO 介绍:异构数据库对象迁移和应用迁移,通过预迁移评估,结构迁移二大核心功能,助力用户轻松实现一键上云,一键切换数据库的目的
支持场景:源端:oracle、mysql,pg; 目标端:gaussdb,gaussdb for mysql,, rds for mysql, rds for pg
UGO核心能力:数据库源库画像,目标库选型与规格推荐,目标库兼容分析,迁移工作量评估,数据库结构迁移,应用sql迁移
数据库迁移评估
连接源进行基本信息采集,性能数据采集,源库特性分析,到各个目标数据库的语法兼容评估:选型与规格
基础信息:数据库版本,采集时间,连接信息,通过后下一步
对象迁移:创建迁移项目,迁移计划,迁移,对象校正,验证&应用
预检查:getDDL的权限,动态视图访问权限, 所有检查通过才算通过
查看评估任务信息:源库基本信息,性能信息,特征分析, 数据库模式(所有对象的详情), 目标数据库评估:兼容性
数据库对象迁移任务
1-创建迁移项目:确认目标库; 目标库类型与版本选定无法修改,填写目标库链接信息,确保有创建对象的权限;测试连通性后创建项目
2-查看项目信息:项目基本信息,迁移验证成功率;
3-迁移计划:用户密码配置及迁移配置设置
4-迁移配置:迁移方案的选择,源库目标库映射配置
5-进行迁移:错误报告,迁移过程将源sql转换成目标库sql
6-对象校正:手工校正,再次验证
7-查看对象校正
8-验证与应用:手动修改错误对象,再次验证‘’
DRS工具
介绍:易用,稳定,高效,用于数据库在线迁移和数据库实时同步的云服务,支持场景
源端:oracle,sql server, mysql ,pg,ddm,mongo,gauss for mysql,guassdb
目标端:ddm,mongo,gauss for myhsql, gauss, oracle, sql server,mysql,pg
DRS数据迁移流程
调研
1-迁移场景
2-业务关联性分析
3-信息收集,数据量,压力,规格
4-迁移网络
方案制定
1-项目启动
2-方案工具讨论
3-迁移网络评估
4-迁移方案:全新,参数组,在线迁移
5-迁移周期、项目计划
技术验证
1-技术验证:速率,业务影响,工具能力限制
2-风险评估、应急预案
3-初步方案评审
迁移演练
1-搭建环境
2-模拟演练
3-验证结果和步骤
4-最终方案确定
迁移实施
1-迁移准备,环境检查,工具部署
2-迁移实施
3-测试验证,功能+性能
4-割接,结果验证,完整性,正确性
5-迁移后观察保障
灵活使用DRS
快:分钟级,易:指引搭建,顺:可演练,稳:割接
DRS技术原理
全量同步:全量数据一次性同步;支持对表结构,索引,主键唯一的同步;支持对表进行分片同步
增量同步:实施解析源日志,转换为DRS内存存储格式;DRS抓取数据落盘;目标库sql回放
其他库到Gaussdb同步任务
流动方向:入云,源库引擎:如oralce,目标库引擎:分布式或主备版,网络类型:公网、vpn,vpc,专线,同步类型:增量,全量,全量+增量
选择同步对象:表级,库级,导入对象文件;
全量配置:同步类型:表结构,数据(必选),索引; 流模式:分片提交,写入分批提交;分片记录数:分片导出,提升同步效率;同步位点:当前SCN
增量设置:日志抓取并发数,oralce日志, 回放日志并发数,回放启动策略:自动,手动,冲突策略:覆盖,报错,忽略
预校验:不通过的提示修复后重新校验;所有检查通过后下一步;所有检查项确认后进行下一步;
同步对比:源库和目标库的差异,对象级对比,数据库、索引,表,视图等; 数据级对比:行数和内容对比
GaussDB到其他数据同步任务
gaussdb到oracle;gaussdb到mysql
常见问题-源库权限问题
源库为oracle
create session
select any transaction
select any table
select any dictionary(目标库为pg时,还需要select any sequenece, )
日志解析权限
全量迁移模式
创建用户用于迁移:create user user1 identified by pwd
使用sys或者dba权限,授权 grant create session, select any transaction, select any table,select any dictionary t o user1
增量迁移模式
创建用户用于迁移:create user user1 identified by pwd
使用sys或者dba权限,授权 grant create session, select any transaction, select any table,select any dictionary t o user1
使用sys或dba权限授予日志解析权限
oracle12c: grant execute_catalog_role to user1
大于12C: grant execute_catalog_role to user1; grant logmining to user1
常见问题处理-目标库权限
源账户:selectl、show view, event,lock tables, replication slave, replication client
目标库账号:
database: create ,connect
schema: create, usage
tabe: DDL权限
grant select,update,insert,delete on all tables in schema schema to user
grant select,updatee,insert,delete on table schema.table to user
常见问题处理-主键冲突,列不存在,长度超长
全量同步点启动,增量同步点重试继续同步
主键冲突:全量清空目标库,增量DRS自动覆盖,忽略或者报错
长度不够:扩充目标库重试
列不存在:扩展目标库重试
GaussDB数据库操作与管理
数据库对象基本操作
模式概述
schema类似于目录,但不能嵌套,逻辑分割数据库对象
用户权限控制访问一个或多个schema
schema和用户弱绑定,创建用户创建同名schema,
默认搜索第一个schema, public是默认的,默认搜索路径包含它
搜索路径:show search_path:
模式管理
create schema xxx authorization user1; 修改:alter schema xxs 删除: drop schema xxx [cascade]
用户管理
用户,角色和权限控制访问; 用户是人,角色是权限的集合,系统权限:syssysadmin.creeatedb,createrole,auditadmin,login; 对象权限:CRUD
用户与角色的区别, 角色不能login
用户分类
初始用户:默认生成,有系统最高权限,能够执行所有操作, 会绕过权限检查,作为DBA用途,非业务用途
系统管理员;sysadmin属性账户,与对象所有者相同全新,但是无dbe_perf的对象权限
三权分立
系统管理员:表空间创建,修改,删除、访问分配权限; 对模式权限缩小,仅对自己模式有权限
用户创建:
创建用户:create user usr1 identifired by '123' ;
xxx with sysadmin password '123' --赋予admin权限
xxx with valid begin xx valid until xx identified by '123' conntion limit 100;
修改用户属性
alter user usr1 with sysadmin --授权; rename to user 2;-- 改名
开启三权分立:gs_guc reload -N all -l all -c "enableseparationofduty=on"
重启:gs_om -t stop && gs_om -t start
权限管理
权限赋予:默认不开启三权分立,
权限撤销:revoke撤销, 对象所有者的隐式权限无法撤销(alter,drop ,grant,revoke)
对象隔离性:对象隔离特性开启,自动添加行级访问控制策略,:alter database dbname enable private object;
表空间管理
表空间概述:是操作系统的一个目录,可能有多个,依赖于文件系统
优点:分区或卷磁盘满后,可以在不同分区创建和使用表空间进行重新配置空间
优点2:管理员可以设置占用的磁盘空间,防止公用分区时占据其他空间;
优点3:表空间可以控制数据占据的磁盘空间,超过90%只读模式
gaussDB自带2个表空间
pg_default:目录对象,用户表;用户表index;临时表,临时表index,内部临时表默认空间:$GAUSS_DATA_HOME/base/
pg_global:存放系统字典表:$GAUSS_DATA_HONE/global
创建表空间
creaete tablespace tbs2 relative location xxx maxsize 100G
crate tablespace tbs3 owner jack location xxx
查询表空间
\db: 元命令查看表空间
select* from pg_tablespace_location((select oid from pg_tabespace where spc_name ='tbs2'))-- 查看表空间所属目录
select oid,* from pg_tablespace --查看表空间所有者
数据库管理
数据库概述
初始化时:template0, template1, 默认用户库postgres
cretea database实际是从template0拷贝新库
通过-d参数进行链接; postgres可以直接使用
\l --元命令查看数据库
select * from pg_dagtabases --通过系统表查看数据库
表管理
数据与数据的联系,一行叫一个元祖,关系是元祖的合集,
普通表存储模型
行存表(默认):insert update效率高,适用一行查询所有属性,OLTP场景
列存表:适用于海量,投影高效,insert update麻烦, OLAP场景, 将列存储到硬盘分区上
表创建
create table xxx as select * from xxx where 1=2
craete table xxx as table xxx;
设置行级访问:alter table xxx enable row level security; create row level security policy all_data_rls on all data using(role=current_user)
分区表:
范围分区:range (列存表仅支持该分区)
value less than(partition key)
每个分区需指定上边界:递增排列
分区最多支持4列
maxvalue表示最大值,用于最后一个分区
start end
相邻2个分区,第一个end等于第二个start
与less than不可以混用
分区只有一列
每个分区包含起止,不包含终点值;起始值是minvalue时不包含
第一个分区包含sart, 其实是第二个分区,第一个分区是(minvalue ,start)
哈希分区:hash
列表分区:list
分区表优势
改善查询性能:指定分区查询
增强可用性:分区故障不影响其他分区
方便维护:分区故障单独修复
均衡IO:不同分区映射不同磁盘
表注意事项
1-只有表的owner可以执行alter table,系统管理员也有权限
2-不能修改分区表的tablespace,但可以修改分区的tablespace
3-不支持修改存储参数orientation
4-不支持增加自增列,或者增加default中包含nextval()的列
5-不支持对外表,临时表开启行访问控制
6-删除primary key不会删除not null,需手动删除
7-JDBC可以通过Preparestatement对default进行参数化设置
8-列存表支持pck,不支持主外键等表级约束
9-列存表支持NULL,not null,default常量值, 只支持对default的修改i,不支持对null和not null的修改
索引管理
索引概述
索引类似于目录,优点:减少搜索元组,提升访问速度;缺点:IUD变慢,索引需要额外存储空间,性能下降
哪些列建索引:
经常查询的字段
where子句过滤条件
order by, group by ,distinct字段
多字段连接查询的条件上
行存引擎索引
类型:
B-TREE: B+树,适合存储范围查询和查询
GIN:倒排索引,可以处理多个键的值
GIst:几何和地理等多维度类型数据,集合数据
索引创建方式
唯一索引:只有Btree可以创建
多字段索引, Btree支持32个字段
部分索引:表的子集上的索引,函数索引
表达式索引
列存引擎索引
类型
Btree
Psort:列存表缺省值
GIN
稀疏索引
列存储引擎每个列自带min/max稀疏索引,在CUdesc表中存储着每个CU的最小值和最大值
在查询的时候,可以根据查询条件做简单的min/max判断,如果查询条件不在范围内,可以不读取这个CU,减少IO读取
列存表缺省聚簇索引:partial sort index
如果数据模型较为离散,会有大量CU误读取
聚簇索引可以做排序,保证CU交集尽量少,可以极大提升数据离散场景下稀疏索引效率
索引创建
唯一索引:create unique index t1_fn_idx on t1(xxx)
复合索引:create index t1_owner_tbs_idx on t1(xxx,xxx)
部分索引: create index t1_xxx on t1(xxx) where delete_flag='0'
函数索引:create index t1_xxx on t1(upper(xxx))
分区表本地索引:create index pt1_id_idx on pt1(id ) local;
分区表全局索引:create index pt1_score_idx on pt1(score) global tablespace tbs1
索引重建
重建单个索引: reindex index t1_lttbs_idx
重建单表所有索引:reindex table t1
修改分区索引
alter index pt1_id_idx rebuild partition p1_id__idx;
alter index pt1_id_idx modify partition p1_id_idx unusable;
alter index pt1_id_idx rename partiontion p1_id_idx to p1_id_idx2;
alter index pt1_id_idx move partition p1_id_idx2 tablespace tbs1;
视图管理
视图特性:封装底层查询逻辑,物理上不存在,数据仍在基表中,基表变化视图随之变化
提升性能可以采用物化视图,需要用REFRESH从基本进行数据更新
序列管理
产生唯一整数的数据库对象,用作主键的原因,可以看做是存放等差数列的特殊表
唯一标识的方式
声明字段类型是序列整型。后台自动创建sequence
create sequence创建新的sequenece, 指定字段默认值为nextval('seq_name')
create sequenece seq_xxx increment by 1 minvalue 1 maxvalue 9999999 cache 1 nocycle;
\d seq_xxx 查看序列 或者select * from seq_xxx
同义词synonym
支持表,视图,函数和存储过程
若指定模式名称,则同义词在指定模式中创建,否则在当前模式创建
需要关联对象的权限:select,insret ,update,delete,explain,call
创建
create synonym syn_t1 for t1
数据字典
GaussDB数据字典
主要包括系统表和系统视图
系统表示存放结构元数据的地方,是系统运行控制信息的来源,是数据库系统的核心组成部分
系统视图提供了查询系统表和访问数据库内部状态的方法
要么只对管理员可见,要么对所有用户可见
通过DDL,DCL维护系统表信息
GaussDB系统表
PG_database:数据库信息
PG_NAMESPACE: shcema信息
PG_ATTRIBUTE: 表字段信息
PG_INDEX: 索引的部分信息,其他信息在PG_CLASS
PG_CLASS:数据库对象及其之间的关系
PG_TABLESPACE:表空间信息
PG_TYPE:数据类型信息
PGCX_NODE: 集群节点信息
PGXC_GRUOP: 节点组信息
PGXC_CLASS:表的复制或分布信息
PGCX_SLICE:记录range和list的分布信息,不支持range interval自动扩展分片,但系统表有预留
GaussDB系统视图
DB_CONS_COLUMNS: 当前用户可访问的约束字段信息
DB_SOURCE: 可访问的存储过程和函数信息,提供定义的字段
Gsql常用元命令
\l:所有数据库名称,所有者,编码和权限
\db 表空间 \du 角色 \di 索引 \ds 序列 \d tablename 表详细信息 \df 函数 \d 当前search parth所有的表视图序列
\dn 所有模式和空间 \dt 所有表 \dv 所有视图 \dp 权限 \d indexname 索引详细信息
\timing sql执行时间ms \i file.sql file读取并执行查询 \? gsql帮助 \conninfo 连接信息
\o file 查询结果发到文件 \sf 函数定义 \echo [string] 字符串标准输出 \! os_command:执行os指令
\h sql语法 \c 更换链接的用户和数据库 \q退出gsql
存储过程
一些sql语句组成的记录集合
优点
先编译,后执行,效率高
降低通信量,网络通信速率提高
权限控制,数据更安全
缺点
分布式系统,存储过程一条语句不能下推,责存储过程不能下推,受限多
复杂存储过程调试不方便
匿名块:一般用于执行不频繁,不重复的活动,不被存储
begin,end, 分号结束, "/"回车执行
声明部分包含变量定义,类型,游标定义等
最简单的匿名快不执行任何命令,但至少有一个语句,甚至是NULL
函数:数据库内定义的子程序,可以从内置sql被调用
函数与存储过程的区别
函数必须返回单个值,存储过程可以多个或者没有
函数可以select执行,存储过程不行
PLSQL编写
变量作用域
必须在declare部分声明,必须建立begin end块,先声明后使用
同一变量可以不同作用域多次定义,内层覆盖外层
外部定义变量可以内部嵌套使用,外部不能访问内部
动态语句
执行动态查询
方式一:execute immediate 动态语句 into var using clause
方式二:open cursor for 动态语句 using value;
控制语句
返回
return;
返回一个集合:return next或者return query 追加结果集,
条件
IT_THEN
IF_THEN_ELSE
IF_THEN_ELSE_IF
IF_THEN_ELSIF_ELSE
IF_THEN_ELSEIF_ELSE
循环
LOOP
WHILE_LOOP
FOR_LOOP(integer变量)
FOR_LOOP查询
FORALL批量查询
分支
case when
GOTO
GOTO是到目标语句的无条件跳转,谨慎使用,目标label必须唯一, 可以使用exception处理特殊场景
游标
静态游标:定义游标名和select语句
动态游标:声明时不绑定sql,通过open for绑定sql语句
函数、存储过程设计规范
禁止使用存储过程,触发器实现业务逻辑,避免对库产生依赖
业务数据库升级脚本禁止实现存储过程升级逻辑
仅创建对固定入参有固定返回值的函数,必须为immutable和shippable类型
不允许使用CUDF(user-defined function)
存储过程常见错误
RAISE INFO
使用未声明的变量
PL 语法错误
SQL 语法错误
语义不正确
拼写错误
数据库性能调优
系统级指标及性能调优
集群性能指标体系
系统级:集群级别或节点级别指标,OS,Instance Time, Memory, Session, Thread, Events, Utility
对象级:数据库对象指标,Database,Table, Index,File,Lock
应用级:应用负载性能:Transaction, Statement, Active session Profile, SLow Query, Full sql trace
系统级
OS
OS_RUNTIME, OS_THREADS:获取实时CPU时间,LOAD,内存消耗信息,判断当前系统负载
Instance Time:系统级时间消耗细分,判断系统是否存在负载,网络,IO,CPU上的瓶颈
Memory
MEMORY_NODE_DETAIL:实例级内存分配,使用率(全局,动态内存,共享内存,通信等)
SHARED_MEMORY_DETAIL:共享内存上下文分配,使用率,定界细化到特性级别,帮助定位会话级内存使用问题
Session
Session _Stat :会话级负载强度
Session_time:会话级时间细分
Session_memory,Session_memory_detail:会话级总内存和内存上下文分配使用
Session_stat_activity:获取实时系统活跃会话列表,基本信息,会话事务,语句,等待事件,会话状态等
与CachePlan相关的内存使用,超过max_dynamic_memory新的动态内存申请将失败。
Thread
THREAD_WAIT_STATUS:获取实例工作线程列表,阻塞在哪个事件上,正在等待哪个锁,被哪个会话阻塞,流控·
Event: Wait_EVENTS: IO、LOCK、LWLOCK、STATUS事件的等待次数,等待时间,特性粒度时延性能问题
Utility
C OMM_DELAY, COMM_RECV_STREAM, COMM_SEND_STREAM, COMM_STATUS: 时延信息,诊断通信链路容量和时延故障
REPLICATION STAT: 主备延时,复制性能故障
GLOBAL_GET_BGWRITER_STATUS, GLOBAL_PAGEWRITER_STATUS::后台全量,增量检查点信息,buffer待落盘脏页信息,磁盘IO繁忙程度,
POOLER STATUS:CN和DN之间连接池, pooler状态可以诊断连接池瓶颈
对象级
DATABASE
STAT_DATABASE:活跃连接数,负载,块读写性能,死锁,临时下盘文件,识别热点数据库,诊断大颗粒性能瓶颈
Table
STAT_USER_TABLES, STAT_SYS_TABLES,STAT_ALL_TABLES,STATIO_USER_TABES,STATIO_SYS_TABLES,STATIO_ALL_TABLES:识别热点表,诊断表级别粒度性能瓶颈
GLOBAL_STAT_HOTKEYS_INFO:表级别热key,定位网络IO瓶颈
Index
STAT_USERINDEXS, STATIO_INDEXS
索引使用统计:index scan次数,index scan返回的索引项,评估索引收益和效率
File
FILE_IOSTAT:数据文件的IO性能统计指标,识别文件级别物理IO强度和瓶颈
FILE_REDO_IOSTAT,STAT_BAD_BLOCK, redo日志的性能瓶颈
Lock: LOCKS,对象锁涉及到的对象,事务,会话,锁信息,识别热点锁
Sequence
STATIO_USER_SEQUENCES: 序列缓存效率
应用级
Statement
STATEMENT_COUNT, STATEMENT,
DDL,DML,DCL语句的分布比率,预警负载异常变动
语句级别的响应时间,执行次数,识别热点语句,定位语句性能瓶颈
Active Session Profile
LOCAL_ACTIVE_SESSION,GA_ASP(public_schema)
ASP(Active session profile)活跃会话概要信息
最近用户session最耗资源的事件
最近占资源的session、sql消耗在哪些event
最近执行时间,次数最多的sql
最近最耗资源的用户,
最近阻塞其他session最多的session
LOCAL_ACTIVE_SESSION默认采样1s,内存视图, ASP默认采样10s,持久化存储
Full SQL trace
Level 0,性能影响1% 默认常开
实例信息、客户端信息,语句概要信息、执行上下文信息,元组访问,buffer,time breakdown,网络开销
Level1,性能影响3%,建议常开,规划存储
执行计划,LOCK、LOCK WAIT计数,LWLOCK,LWLOCK WAIT计数
Level2.性能影响30%,短暂开启
Lock/LWLock Waith time
Lock Start/LWlock start
Timestamp
locktag
lockmode
Lock Release
Time'stamp
支持慢sql与full sql,支持独立trace level设置,系统表存储,周期可配置,时间范围内的报表生成
WDR报告详解
WDR报告
WDR snaphsot:用于定时查询系统性能视图并生成快照
仅采集schema为dbe_perf下的性能视图
默认关闭,通过guc参数enable_wdr_snapshot开启snapshot
默认采集周期60min,设置guc参数wdr_snapshot_inerval设置
默认保存8天,通过wdr_snapshot_retention_days管理
手动生成快照,create_wdr_snapshot系统函数
WDR Report用于生成2个快照间的性能数据报告
通过generate_wdr_report生成WDR Report,实例级cluster,节点级node
主要内容:
Summary:最耗时等待事件,事件种类,CPU,IO,Memory统计信息”
Detail:时间模型,sql统计,sql具体,系统等待事件,Cache,IO统计,应用统计,对象统计,系统配置
WDR报告-Summary
Database stat:库级统计数据,如事务数,物理读,行活动,文件读写耗时等
Load Profile:DB/CPU时间,表IO信息,SQL量,事务量,登录数,P80(集群)
Instance Efficiency Percentages:buffer命中率(集群,节点)
Top 10 Events by total waiti time (节点)
Wait classes by total waith time:按wait event类型时间排序 (节点)
Host CPU:cpu信息,如user,system,idle,waiti io时间占比(节点)
IO Profile: IO信息,如表,索引等文件IO次数,WAL文件的次数大小等(集群,节点)
Memory Statistics:内存信息,如process_used_memory/shared_used_memory(节点)
WDR报告-Detail
Time Model:时间模型,如DB TIME,CPU TIME,.NET_TIME,DATA_IO_TIME,PLAN_TIME( 节点)
SQL Statistics:sql统计信息, 如行活动,cache。IO, time model(集群,节点)
wait events: 总次数,总时间(min/max/avg)等(节点)
cache io stats:表索引的IO,如逻辑读,buffer命中率等(集群,节点)
Utility status: 主备复制状态,BgWriter信息等(节点)
Object status:表索引信息,插入更新行,live/dead元组数,vacuum/analyze信息,坏块等(集群,节点)
Configuration settings:数据库相关GUC信息
SQL Detail: 归一化SQL文件及ID信息
WDR报告生成
gsql方式连接,切换postgres库; \a \t \o报告路径
select generate_wdr_report(begin_snap_id,end_snap_id,report type,report scope,node_name)
begin/end_snap_id:起始snapshot ID,取自snapshot..snapshot
report type:summary,detail, all
report_scope:cluster, node
noce_name:取自pgcx_node表
report_scope为node,为节点值
report_scope为cluster,可省略
限制及参数说明
以下情况不支持生成WDR
1-两次snapshot中间节点有重启2
2-两次snapshot中间有drop database
3-两次snapshot中间有主备倒换
4-重置dbe_perf.statement视图
WDR使用场景举例
P80/P95响应时间:cluster的summary报告, Load Profile章节
TOP SQL:cluster/node的detail报告,SQL statistics章节,按不同维度分析top sql是否合理
命中率不够:node/cluster的WDR报告,summary中的instance effiency percentage章节
异常wait events:node的WDR报告,details中的wait events章节
SQL优化
SQL执行机制
执行sql流程分解
查询解析
词法&语法解析
语义分析
查询优化
查询重写
路径&计划生成
执行sql
根据计划树中的访问顺序,访问表,索引等执行sql语句
执行计划
执行计划显示信息
sql语句引用的表的顺序
sql语句中每个表的访问方法
针对sql语句中连接操作相关表的连接方法
where条件过滤,order排序及count聚合等操作
执行计划三要素
访问路径:扫描表数据的路径
连接顺序:多表连接顺序
连接方式:多表连接方式
Explain [option] statement
analyze [boolean]:执行语句,显示实际运行时间和统计数据
verbose[boolean]显示计划额外信息
costs --显示代价
cpu--显示cpu使用
detail --打印节点信息
nodes--显示执行节点
num_nodes --显示节点数量
buffers --显示buffer使用
timing 显示耗时
plan --显示计划
format{text|xml|json|yaml} --文件格式
SQL算子
扫描算子
底层数据抽取,关键特征:输入数据,叶子节点,表达式过滤
扫描用户数据
Seqscan:顺序扫描存储引擎,基本算子,扫描行存表,务索引
Cstorescan:列存储引擎,基本算子
DfsScan:顺序扫描hdfs存储引擎
bitmapheap/indexscan:利用bitmap获取元组,返回结果集为一个bitmap
tidscan:通过tid获取元组,通过表的ctid字段进行过滤查找
indexscan:利用索引进行快速定位和查询
indexonlyscan:直接从索引返回元组,无需访问基表
foreignScan:外部表扫描, HDFS,GDS,OBS
扫描查询中间结果集
worktableScan:扫描中间结果集,查询过程中spillout的结果集
valuescan:扫描value列表
Stream:扫描网络算子,分布式数据库
subqueryscan:子查询扫描
CteScan:扫描commTableExpr。cte看成一个集合,with定义的子查询
functionScan:函数扫描,函数输出看成一个集合
关联算子
关键特征:多个输入关联方式
实现方式分3种
nestloop:下层2股数据流实现循环嵌套连接操作:inner,left-outer,. semi-join,anti-join
mergeJoin::下层2股数据流实现归并连接操作:inner,left-outer-jpin,right-outer-jpin,full-outer-join, semi-join,anti-join
HashJoin::下层2股数据流实现hash连接操作:inner,left-outer-jpin,right-outer-jpin,full-outer-join, semi-join,anti-join
l连接类型6种
inner join:内连接,s1和s2均满足的
left join
right join
full join
semi join:半连接,s1找到s2匹配的,仅输出s1
anti jooin;反链接,s1找不到s2匹配的,输出s1
控制算子
关键特征:用于控制数据流程
5种控制算子
result:顺序扫描行存储引擎,处理仅需一次计算的条件表达式或者insrt中的子句
modifyTable:insert、update,delete操作的算子
Append:多个关系集合的追加:union,union-all
MergeAppend:多个有序关系集合的追加:union,继承表
RecurisiveUnion:执行recursive subquery, 处理with recursive递归查询
物化算子
关键特征:扫描所有数据后返回
9种物化算子
Materialize:物化,缓冲节点结果集方便重复扫描
sort:下层数据进行排序。order by子句,mergejoin连接,sortagg分组,mergeappend集合,unqiue去重
group:下层已排序数据分组,gruop by分组
Agg:无序数据分组:count,sum,avg,max,min, distinct,union,group by子句
unique:下层数据去重,union去重,distinct子句
hash:下层数据缓存,存储到hash表:构造hashtable。配合hashjoin算子
setOp:下层数据缓存,处理intersect集合操作:intersect,except操作
windowagg窗口函数,row_num(),rank()
LockRows:处理行级锁, select for update
统计信息
统计信息保存在数据字典中,主要包括表,表分区,索引,索引分区,列,列直方图,重点关注表和索引上的统计信息,数据量和数据块数,
通过执行analyze更新统计信息
PG_STATISTICS存储表和索引的统计数据,管理员权限访问,
PG_STATS视图,存储PG_STATISTICS表里单列统计信息的访问
SQL调优工具-数据库内存参数调优
逻辑内存管理参数:max_process_memory
用于控制数据库可用内存的最大峰值
执行作业最终可用内存:max_process_memory-shared_memory(buffers)-cstore_buffers
影响作业内存的两个参数,shared buffers和cstore buffers
执行算子下盘参数:work_mem
扫描算子类参数调优
enable_***scan
seqscan; bitmapscan; indexonlyscan;indexscan;tidscan
l连接算子控制参数
enable_**join、ebale_nestloop
支持hashjoin,mergejoin,nestloop
分布式执行计划控制参数
enable_stream_operator/enable_fast_query_shipping/enable_light_proxy
SQL Plan Hint:手工干预sql执行计划选择
使用:select /*+[hint](value)*/ * from...
/*+[no]table scan(table)*/
/*[no] indexscan(table index)*/
/*+leading(t1(t2,t3))*/
分布式计划
下发sql语句的计划
原理:DN根据下推语句生成计划,执行结果在CN汇总
适用场景:各DN执行时数据无交互
下发sql计划的分布式计划
原理:CN根据语句生成计划,并将计划下发DN执行
适用场景:DN执行时有数据交互的复杂语句
下发部分SQL语句的分布式计划
原理:CN生成计划后,下推原语句部分语句至DN,执行结果发回CN,CN执行剩余计划
不满足上述计划的极少数场景
数据分布
HASH
Replication
List
Range
交易类业务调优思路
CN轻量化:enable_light_proxy,设置优化器是否对简单查询在CN上执行优化, 建库字符集utf8,默认ON
PBE: plan_cache_mode=(auto/force_generic_plac/force_custom_plan),支持计划缓存,减少优化器执行时间
减少分布式事务:DML指定分布键过滤条件时,下推单DN执行,事务本地提交,节省网络开销
减少数据重分布:选择关联字段或聚合字段做分布列,减少跨节点数据分布, 当前参数化路径不支持跨节点
交易类业务分布列选择原则
选择关联字段或聚合字段做分布列,查询尽量走参数化路径
选择离散值较多的列,保证均匀分布,避免木桶效应
满足前两条原则,不选择常量约束的列
混合负载类业务优化:配置SMP
SMP通过算子并行提升性能,资源获取时间,要求资源充足,CPU,内存,网络,IO,否则引起性能劣化
启用步骤:1)资源利用率观察小于50%, 2)执行set query_dop=1,再执行explain打出执行计划 3)执行完成后关闭query dop
query dop参数含义
=0 ,自适应,动态选取【1,8】
=-value,限制选取范围[1,value]
=value,强制选取dop为1或者value
混合负载类业务优化:数据倾斜调优
调整分布列方式解决,explain performance可查看是否存在倾斜迹象
发现有迹象,执行select table_skewness获取倾斜视图
计算层数据倾斜:执行过程中数据重分布导致的倾斜,可使用RLBT解决, 特性开关:skew_option
RLBT配置方法:
1-运行analyze收集统计信息即可2
2-通过hint指定,如/*+skew(table(column))[(value)]*/
3-内置规则自动识别:面向BI的outer join场景
触发RLBT后,计划中将出现skew join optimized by statistics字样
数据库日常运维
数据库连接管理
实例连接方式
DAS连接
无需使用IP,通过DATA ADMIN SERVICE(DAS)链接,易用,安全,高级,智能,推荐。
内网连接
内网IP,同一区域,同一VPC,单独使用内网IP 连接弹性云服务与GaussDB实例:安全性高,性能较好
公网连接
弹性公网IP, 单独绑定弹性公网IP连接EC2与GaussDB实例, 降低了安全性,建议迁移到同一VPC,内网连接
DAS连接GaussDB实例
步骤一:购买实例, 实例,网络配置,账号配置
步骤二:das连接实例,通过数据管理服务连接
内网:开始,购买实例,设置安全组,连接实例,结束
ECS与数据库在不同安全组需设置安全组规则
外网:开始,购买实例,绑定弹性公网IP,设置安全组,连接实例,结束
公网IP地址和公网出口宽带服务,公网IP绑定gaussDB
设置安全组规则,允许来自公网的主机访问
提供普通链接和SSL连接(加密提高安全性)
数据库导入导出
导入场景划分
元数据导入导出:gs_dump/gs_restore
小批量数据导入导出:copy
sql文本格式建立表定义:gsql元命令\copy
分布式场景大批量数据导入、导出:GDS
gs_dump/gs_restore
适用场景:导出单表定义,数据库对象定义,恢复数据库对象定义,避开业务高峰期,避免失败
工具使用
导出单表定义:gs_dump dbname -U user -W password -p port -s -t t1 -f /file.sql -F c
U 用户,W 密码,p端口,s对象定义,t表,f文件,F文件格式
p:纯文本
c:自定义
d:目录归档
t tar 归档格式
导出整个库对象定义:gs_dump dbname -p 16000 -s -f /file.sql
导出整库的对象和数据:gs_dump dbname -p 16000 -f /file.sql
gsrestore恢复数据库对象: gs_resotre -d db1 -p 16000 /file,sql
copy
适用场景
小数据量文本来源导入; 小数据量导出; 查询结果集导出
使用方法
文本导入:copy t1 from file.sql delimeter '^';
表数据导出:copy t1 to file.sql delimeter '^';
查询结果集导出
copy (select * from table ) to file.sql delimeter '^';
jdbc中使用copy:cpManager = new CopyManager(BaseConneciton conn); long n=cpManager.copyIN(copy xx from stdin with csv),filereader(file));
gsql
适用场景:文本格式对象定义的创建
使用方法:元命令导入导出:gsql -d db1 -p 16000 -U u1 -W pss -f file.sql
-d 数据库, \o 查询结果发送到文件 \i file中读取内容 \copy 数据的来源支持标准输入和文件
GDS(gauss data service)
解决分布式场景下大数据量的导入导出,通过DN并行,解决CN在分布式常规导入导出的瓶颈问题,
适用场景:分布式场景大数据量表,文本数据导入或大数据量表导出
GDS原理
CN只负责规划和下发,导入交给DN,释放CN节点资源
GDS进程负责数据文件切分,分发给DN实例
DN接受数据分片,根据分布列计算hash,确定归属DN, 属于自身责缓冲到本地,否则通过网络发送给其他DN
Foriegn Table:识别源文件的位置,格式,存放位置,编码格式,分隔符等信息,是关联数据文件与目标表的对象
GDS多线程并行导入,多个GDS并行导入,充分使用多DN并发
GDS使用
启动GDS:gds -d /input_data/ -p 10.186.251.85:8808 -H 0.0.0.0/0 -l /log/log.txt -D -t 2
-t 2并发线程数
创建外表:create foreign table t1_foreign(c1 int ,c2 int)) SERVER gsmpp_server OPTIONS(location ,'gsfs:10.186.251.85:8808/t1.txt'),format 'text',encoding 'utf8',delimiter'^',null '') per node reject limit value with error_t1_foreign;
执行导入:insert into t` select * from t1_foreign;
常见错误
invalid byte sequenece for encoding utf8, 0x00 : 0x00对utf8非法,用tr-s [\000],[\040*] <inputfile> outputfile
执行导出:insert into t1_foreign_output select * from t1;
导入最佳实践
数据倾斜校验:超过千万的表,先导入部分数据进行数据倾斜检查和调整分布列
拆分并行:拆分文件,GDS并行导入,
资源充足,配置对齐:内存,句柄,磁盘空闲大小
网络通畅:尽量使用万兆网, 上限400MB/s
部署个数:一个raid布1-2个GDS, GDS与DN比i1:3到1:6之间
备份恢复
概述:防止误操作,高可靠数据冗余
备份恢复分类
组织形式维度
物理备份:数据保留在数据库,性能高,空间占用率低
逻辑备份:通用格式,如csv,支持跨库和跨平台恢复
备份对象范围维度
集群备份-集群恢复
容灾场景
单对象、表备份-表级恢复
多对象,对标备份-表级恢复
重点对象单点备份和审计
库级备份-库级恢复
恢复对象维度
集群级恢复、实例级恢复、库级恢复、表级恢复
备份数据完整性
全量备份-全量恢复
增量备份-增量恢复
日志归档-PITR恢复
备份存储介质维度
本地磁盘、远端磁盘、NBU、OBS、SAN
基于OBS的集群级物理备份能力,采用分布式并行技术,还提供备份数据压缩,备份流控,短点续备高阶功能
备份类型
全量备份:所有目标数据进行备份,耗时时间长,与数据总量成正比,自身可以恢复完整数据库
增量备份:差分备份,指定时刻增量修改的数据,耗时短,增量数据成正比,与总量无关, 默认30min备份一次, 配合全量备份恢复完整库
如何执行备份
自动备份:扩容或大版本升级会进行一次自动备份, 指定保留期限
默认开启,保留7天
选择业务低峰期
全量备份一周内的每一天
增量备份30min一次
全量备份时间段:每隔一小时随机时间段
手动备份:会一直保存,需用户手动删除
常见问题
集群状态unavailable导致备份失败
备份过程出现进程重启,主备切换,导致备份失败
大版本升级过程中,全量和增量备份会失败;升级观察窗口可以成功
集群扩容或缩容,可能导致备份失败