【GaussDB国庆献礼】GaussDB 100 HA架构技术建议书(2)
3 数据库功能
3.1 表和索引
3.1.1 表的存储:segemnt和extent
(1)Segment对应一个表或索引,如果分区,则对应一个最小分区。
(2)Extent是一段连续的磁盘空间,当Segment没有空闲空间时,向表空间申请一个空闲的extent。
(3)Extent的默认大小为64K,使用大的extent可以提升全表扫描的效率。930版本支持动态extent。
3.1.2 表的存储:Page
页由Page head、tail校检码、row dir、row组成。
Ø Page head:页面ID、Last SCN、size、ITL count、extent链表前驱和后驱节点。
Ø Page tail:CRC校检码,用于完整性校检
Ø Row directory:Slot偏移地址字典,可以通过slot id查找slot在页中的位置。
Ø Row:数据行,对应表中的一条数据。
Rowid = File ID + Page ID + Slot ID,通过Rowid可以定位到一行数据。
3.1.3 表的分类
表的类型 | 类型说明 | 样例 |
普通表(Heap) | 数据全局可见,存储在普通表空间,支持分区和lob类型 | |
会话级全局临时表 | 数据会话级可见,存储在temp表空间,不支持分区和lob类型 | create global temporary table t1 ( sql_id varchar(100) primary key, sql_text varchar(1000) ) on commit preserve rows |
事务级全局临时表 | 数据事务级可见,存储在temp表空间,不支持分区和lob类型 | create global temporary table t2 ( sql_id varchar(100) primary key, sql_text varchar(1000) ) on commit delete rows |
本地临时表 | 表结构会话级可见,存储在temp表空间,不支持分区和lob类型,表名必须以#为前缀 | create temporary table #t3 ( sql_id varchar(100) primary key, sql_text varchar(1000) ) |
Nologging表 | 数据全局可见,存储在temp2空间,支持分区和lob类型 | create table t4 ( sql_id varchar(100) primary key, sql_text varchar(1000) ) nologging |
3.1.4 B树索引的结构
Ø 只支持B-Tree索引,不支持Hash、位图等其他类型的索引
Ø 树的顶层是根页,根页面存放下一层每个树枝节点的最小key值
Ø Key的顺序为升序,页面内升序搜索使用二分查找
Ø 树干节点的每个key值保存指向下层节点的指针(page id)
Ø 叶子节点每个key值存放指向数据行的指针(row id),所有key都保存索引字段值
Ø 扫描到叶子层后的横向扫描,是为了支持范围扫描
Ø 与Oracle不同,高斯的B-Tree索引中包含key为null的数据
3.2 常用数据库对象
对象 | 使用限制 | 比Oracle多的能力 |
表 | 1.索引列的定义长度最大为3900字节 2.不支持二级分区 3.不支持分区的合并、置换等高级能力 4.varchar最大长度是8000字节 | 1.不仅支持序列,还支持自增列 2.支持MySQL的二级制类型binary、varbinary和longblob 3.支持bool类型 4.支持数组、JSON类型 |
触发器 | 1.不支持语法referenceing new as new | 1.支持在会话级disable所有触发器 |
存储过程 | 1.不支持自定义类型、hash表 2.930版本开始支持package | NA |
视图 | 1.不支持对视图做DML操作 | NA |
序列 | NA | NA |
Job | 1.不支持修改Job的内容,需要重建 | NA |
时区 | 1.只支持数字形式时区'+12:00' | NA |
咨询锁 | NA | 1.不仅支持会话级,还支持事务级咨询锁 2.支持排他和共享咨询锁 |
同义词 | NA | NA |
3.3 常用系统函数&操作符
参见<<开发者指南>>。
3.4 常用高级包
包名 | 描述 |
用于对存储过程(含自定义函数,触发器)的运行过程调试。 | |
用于处理LOB类型数据。 | |
用于提供锁管理服务。 | |
用于执行定时任务功能。 | |
用于调试存储过程、函数,或者在zsql命令中显示信息。 | |
用于GS-Paxos主备维护的包。 | |
提供的内置随机数生成器,用于生成随机的数字、字符。 | |
用于执行SQL语句的包。 | |
标准包,用于事务管理、异常处理。 | |
用于优化统计的包。 | |
用于数据类型处理和计算的包。 |
3.5 常用性能视图
3.5.1 实例
视图名 | 视图说明 | 别名 |
DV_SYS_STATS | 实例级性能数据的累计值,包括SQL的每个步骤的执行时间、产生的redo、逻辑读、物理读等数据。 | V$SYSSTAT |
DV_SYS_EVENTS | 实例级等待事件的累计值,等待事件是重要的性能指标,一段时间的Top 等待时间反映了该时间段的性能瓶颈 | V$SYSTEM_EVENT |
DV_SYSTEM | 当前操作系统的CPU/MEM使用情况,该数据直接从操作系统读取,包括CPU使用和虚拟内存换入换出的累计值 | V$SYSTEM |
DV_WAIT_STATS | data buffer 中各类型的block的等待,对应buffer busy wait等待事件 | V$WAITSTAT |
3.5.2 内存
视图名 | 视图说明 | 别名 |
DV_BUFFER_POOL_STATS | 当前BUFFER_POOL的使用统计情况,显示空闲页、常驻页、脏页等数量 | V$BUFFER_POOL_STATISTICS |
DV_GMA | 当前申请的内存信息,高斯内存是预分配,和配置的参数一致 | V$SGA |
DV_GMA_STATS | 当前SGA内存的统计项,包括shared pool和large pool的详细统计 | V$SGASTAT |
DV_DC_POOLS | 当前DC池的情况 | V$DC_POOL |
DV_PL_MANAGER | 存储过程加载到内存的情况 | V$PL_MANAGER |
DV_LIBRARY_CACHE | 共享池中SQL语句的管理信息 | V$LIBRARYCACHE |
DV_TEMP_POOLS | 当前TEMP_POOL的分配情况 | V$TEMP_POOL |
DV_VM_FUNC_STACK | 未释放VM申请时的函数堆栈信息,当系统发生疑似VM泄露时,可以配置_MAX_VM_FUNC_STACK_COUNT,启动该视图能力 | V$VM_FUNC_STACK |
3.5.3 会话、连接和事务
视图名 | 视图说明 | 别名 |
DV_SESSIONS | 当前所有的会话情况 | V$SESSION |
DV_SESSION_EVENTS | 会话的所有的等待事件 | V$SESSION_EVENT |
DV_SESSION_WAITS | 会话当前的等待事件 | V$SESSION_WAIT |
DV_OPEN_CURSOR | 当前打开的游标状态 | V$OPEN_CURSOR |
DV_REACTOR_POOLS | 连接池和对应工作线程池信息 | V$REACTOR_POOL |
DV_SPINLOCKS | 当前所有会话对SPINLOCK的使用情况,spin_lock是自旋锁,锁住的语句太长开销比较大 一般是控制一个结构体变量在修改时不被别人修改 | V$SPINLOCK |
DV_TRANSACTIONS | 当前的事务信息 | V$TRANSACTION |
3.5.4 SQL
视图名 | 视图说明 | 别名 |
DV_SQLS | SQL的DML语句执行情况 | V$SQLAREA |
DV_SQL_POOL | 当前系统SQLPOOL使用情况 | V$SQLPOOL |
DV_LONG_SQL | 长SQL的日志 | V$LONGSQL |
3.5.5 锁
视图名 | 视图说明 | 别名 |
DV_LOCKS | 当前锁资源情况 | V$LOCK |
DV_LOCKED_OBJECTS | 锁对象的信息 | V$LOCKED_OBJECT |
DV_USER_ADVISORY_LOCKS | 使用中的会话级咨询锁信息 | V$USER_ADVISORY_LOCKS |
DV_LATCH | 当前结构锁的使用情况,latch一般是结构锁,有共享锁,排他锁之分,粒度大 | V$LATCH |
3.5.6 Segment
视图名 | 视图说明 | 别名 |
DV_SEGMENT_STATS | 数据库中的heap和index等对象的使用情况 | V$SEGMENT_STATISTICS |
DV_UNDO_SEGMENTS | undo segment队列的实时状态信息 | V$UNDO_SEGMENT |
DV_TEMP_UNDO_SEGMENT | 所有temp undo segment队列的实时状态信息 | V$TEMP_UNDO_SEGMENT |
3.5.7 HA
视图名 | 视图说明 | 别名 |
DV_ARCHIVE_GAPS | 备用数据库上的存档间隙的信息 | V$ARCHIVE_GAP |
3.6 常用SQL语法
参见<<开发者指南>>。
4 应用开发
4.1 用户表空间和schema
Ø 表空间EXTENTS参数
一个extent里包含的页面数。不指定EXTENTS时,默认一个extent包含8个页面。
增大单个extent的页面数量可以提高IO性能,但如果表空间下存在小表(数据量未达到一个extent大小),会导致空间浪费。
说明:930版本会实现动态extent,那么就不用设置该参数了。
Ø 表空间AUTOEXTEND
如果使用自动扩展,对大批量的insert会有一定程度的性能损失,如果对性能要求很高,建议不使用自动扩展。
Ø ALL-IN-MEMORY表空间
默认表空间都是页面通过databuff的hash寻址方式访问,带页面淘汰和加载的机制;内存表空间为了加速访问,把数据全部pin在内存不进行盘交换,并且使用pageid进行基于偏移的直接寻址。除系统表空间之外的所有表空间在创建时都支持指定ALL-IN-MEMORY属性。
Ø schema默认表空间
创建schema要指定默认表空间,schema和表空间最好一一对应,方便按照表空间物理备份,不强制要求。
技术建议:
1.EXTENT对IO影响非常大,如果使用的版本未实现动态EXTENT,建议调大表的EXTENT。
2. AUTOEXTEND对大批量的INSERT会有一定程度的性能损失,建议提前扩展好。
3.内存表需要指定ALL-IN-MEMORY表空间。
4.禁止使用SYSTEM表空间保存业务对象。
4.2 表的设计
4.2.1 表的设计一般原则
设计点 | 建议方案 | 可能产生的问题 |
单表(非分区表)的规模 | 数据量<5000万,空间占用<100G | 表过大会导致数据非常离散,根据索引扫描数据时物理读高,并且索引的层高也会变大 |
表/分区的数量 | 总数量<10万 | Segment过多会产生大量的统计信息,系统表空间会增大,同时share pool的DC占用也会变多,buffer pool需要保存Segment头,内存消耗会增大 |
约束 | 唯一、非空约束由数据库约束保证 | 如果由业务保证唯一和非空约束比较麻烦,容易产生垃圾数据 |
列的类型 | 1.时间类型用日期类型,不要使用字符串 2.长字符串使用clob,而不要用varchar | 时间类型使用字符串占用的空间多,处理也容易出错;列中包括长字符串容易出现行迁移和行链接 |
列的个数和长度 | 个数<200,行长度<8000字节 | 列过长容易出现行迁移和行链接,并且每个数据只能保留几条数据,索引扫描的效率会比较低 |
Extent的大小 | 当前还不支持动态extent,对于大表,Extent设置为1M或8M | 默认extent是64K,对大表做全表扫描时IO效率低,增大extent,一次IO可以扫描更多的数据块,减少IO次数 |
数据的更新 | 避免数据更新后变长,避免大量并发更新同一个数据块,避免对索引列的大量更新 | 如果把数据更新后变长,容易出现行迁移和ITL等待,需要调大PCTFREE;并发更新同一个数据块可能产生大量的buffer busy wait等待;大量更新索引列也会产生大量空块和索引倾斜,update效率也会降低 |
数据的删除 | 大批量数据的删除使用删除分区的方式,而不要用delete的方式 | 如果使用delete方式删除大量数据,不仅效率低,而且可能导致索引产生大量空块和索引倾斜的问题 |
4.2.2 分区的设计
分区类型 | 类型说明 | 适用场景 | 示例 |
Range | 用户创建分区,分区键大小从小到大,不能往中间插入新分区,分区键一般是date或number类型 | 适用日志、流水类大表,需要根据时间删除历史数据 | CREATE TABLE WSR$_LONGSQL1 ( SNAP_ID BINARY_INTEGER NOT NULL, CTIME DATE ) PARTITION BY RANGE(SNAP_ID) (PARTITION P_0 VALUES LESS THAN (1)) |
Interval | 用户只需要设定分区间隔和初始分区键值,根据插入的数据自动生成对应的分区,分区键一般是date或number类型 | 同Range分区,比Range分区使用更方便,用户不用提前创建分区,并且可以有数据时再创建分区而不用创建空分区 | CREATE TABLE WSR$_LONGSQL2 ( SNAP_ID BINARY_INTEGER NOT NULL, CTIME DATE ) PARTITION BY RANGE(SNAP_ID) INTERVAL(1) (PARTITION P_0 VALUES LESS THAN (1)) |
List | 分区键是离散值,分区需要用户创建 | 适用在分区键是离散值的场景 | CREATE TABLE WSR$_LONGSQL3 ( SNAP_ID BINARY_INTEGER NOT NULL, CTIME DATE ) PARTITION BY LIST (SNAP_ID) (PARTITION P_0 VALUES (1)) |
Hash | 用户设定分区键和分区数,可以自动生成分区,插入数据时根据hash算法选择对应的分区 | 适用于分区键取值非常多的场景,一般用于把数据隔离开,而不是为了根据分区删除数据,使用hash分区减少buffer busy wait的等待 | CREATE TABLE WSR$_LONGSQL4 ( SNAP_ID BINARY_INTEGER NOT NULL, CTIME DATE ) PARTITION BY HASH (SNAP_ID) PARTITIONS 16 |
4.2.3 索引的设计原则
设计原则 | 说明 |
分区表不要创建全局索引 | 分区表一般创建本地索引(使用local关键字)。如果创建了全局索引,当删除分区时会导致索引失效 |
不要创建无用的索引 | 索引会降低DML语句的性能,所以不要创建无用的索引 |
不要创建冗余的索引 | 例如下面两个索引,如果在userid, playlistid上创建了索引,就没有必要在userid上创建一个索引。 create index ix_ums_playcontentlist_userid on t_ums_userplaycontentlist (userid) create index ix_ums_playcontentlist_id on t_ums_userplaycontentlist (userid, playlistid) |
索引的key不宜过长 | 如果索引key过长,会导致索引树高度很大,索引查询效率会降低。对于组合索引,索引的列不宜过多。不要把长字符串列作为索引列,例如描述字段。 |
组合索引,要把高选择度的列放在前面 | 如下例所示,useraccount选择度远高于accounttype,所以应该把useraccount作为索引的首列,这样当查询条件中有useraccount而没有accounttype时仍能高效的使用索引。 create index ix_ums_usrordlib_account_type on t_ums_userorderlib (useraccount,accounttype) |
当需要对大数据量排序时,可以通过创建索引来避免排序 | 场景:分页查询需要查询歌曲(总数100万),没有查询条件,查询结果需要按照musicname排序,实际绝大部分的查询是前几页。 解决方案:在musicname创建索引,通过索引全扫描来避免排序,只要不是查询的数据非常靠后,效率就很高 |
一般不在选择率很低的列上创建索引 | 一般不在状态,用户类型这种取值很少的列上创建索引。但是,有些场景却可以创建这种索引。例如,当需要查询的那部分的取值在数据中的比例很低时或者使用rownum限制了每次只查询出一小批数据。总的原则是,只要一次查询的数据在数据中的比例非常小,那么就适合使用索引。这里之所以说“一次查询”,是因为符合条件的数据可能很多,但是可能使用rownum限制了每次只查100条。 |
如果where语句中不得不对查询列采用函数查询,如upper函数,需要建立相应函数索引 | 如果查询条件在列上使用了函数,那么直接在列上创建的索引是无法使用的,必须创建对应的函数索引。如下例所示。 create index ix_auditionauthlog_tonename on t_ums_auditionauthlog(upper(tonename)) tablespace ringidx |
4.2.4 表结构的修改
支持在线重建索引和修改表结构。索引的创建和重建当前不支持并行。
技术建议:
1.表和索引的设计对系统的性能非常关键,需要使用者理解存储结构和设计原则。
2.索引的设计一定要根据查询需求来设计。
3.分区是非常重要的特性,合理的使用分区可以大幅提升性能。
4.3 应用框架
Ø 兼容主流java连接池和Java框架
java连接池:c3p0、dbcp、druid;兼容hibenate、ibatis和mybatis。
Ø hibenate方言
选择Oracle方言:org.hibernate.dialect.OracleDialect。
4.4 数据库接口
支持C-API,JDBC,ODBC,PYTHON和GO客户端接口。
4.5 读写分离
JDBC支持多DN的读写分离,当URL中配置多DN时,可以通过URL中的属性标示来区分JDBC返回的连接是否是区分主机和备机。
Ø 配置支持多DN读写分离
连接串格式: jdbc:zenith:rw:@{ip:port }[ , ... ][?useRW={false|true}]
连接串支持指定多个DN的ip,由“,”分割,连接串中一定全部为DN节点。
当useRW属性配置为true时,则JDBC返回的连接可以是连接主机的也可以是连接备机的连接;当useRW为false时,则JDBC返回的连接只能是主机的连接。
技术建议:
1.对于非强一致性的查询,建议读备机,减轻主机的压力。
4.6 SQL
4.6.1 使用批量绑定接口
Ø 尽量避免逐条commit
高并发逐条commit会产生大量的log file sync等待,对性能影响较大。
Ø 使用绑定变量
当前不支持cursor sharing,如果不使用绑定变量,会产生大量的硬解析。
避免使用过多的绑定变量,不推荐insert语句使用几千个value的写法。
4.6.2 返回大数据量的分批处理
如果查询结果返回很多数据,设置fetch_size非常重要,如果fetch_size过小会导致交互次数多、查询效率低;如果fetch_size过大或者全部返回,客户端程序的内存可能会撑爆。
这个特性非常重要,应用程序在返回大数据量结果集时就不要分批查询了,只要合理的设置fetch_size就可以一次查询所有数据了,由数据库分批fetch。
高斯默认的fetch_size是100,可以在语句级修改,如果结果集较大,建议修改为1000以上。
Ø JDBC接口
java.sql.PreparedStatement.setFetchSize(int)
技术建议:
1.大批量的DML语句,建议使用批量绑定方式。
2.对于返回大结果集的查询,建议通过fetch_size分批处理,不建议业务分页查询。
3.不建议一个SQL过长或过于复杂。
4.7 提示(hint)
类型 | 提示名 | 使用说明 |
连接顺序 | leading | 指定某个表为驱动表,例如leading(a) |
ordered | 多表连接时指定表的连接顺序,按照from后面表的顺序连接,没有参数 | |
连接方式 | use_nl | 指定表的连接方式为嵌套循环,例如use_nl(a b),括号内顺序不重要,括号内支持多个表 |
use_hash | 指定表的连接方式为哈希连接,例如use_hash(a b),括号内顺序不重要,括号内支持多个表 | |
访问路径 | full | 指定对某个表全表扫描,例如full(a) |
index | 指定对某个表使用索引扫描,按照索引的排序方式,默认正序,例如index(a 索引名) | |
其他 | rule | 指定使用RBO优化器,不能有分区表等高级特性,不能和其他提示一起使用。 |
技术建议:
1.提示是基于RBO的,加了提示会自动变成RBO,所以加提示要慎重,要加全套提示。
5 运维与工具
5.1 数据库管理(DM)
Database Manager是一款基于Web的数据库监控工具,提供丰富的界面展示,可有效监
控多个集群数据库。通过管理员用户和普通用户区分查看和操作权限,对集群数据库
进行安全的监控和运维操作。
Database Manager提供的主要功能包括(但不限于):
Ø 安装集群
Ø 导入并监控集群
Ø 集群、主机和实例运行监控
Ø 数据库运行监控
Ø 故障诊断分析和上报
Ø 告警分析和上报
Ø 用户管理
Ø 查询监控和TOP查询取消
Ø 巡检
5.2 集群管理(CM)
GAUSS100 OLTP CM模块主要针对分布式数据库集群进行系统管理,整个框架包括对外命令、内部的逻辑仲裁、CM与ETCD的交互以及ETCD V3分布式数据管理。
CM模块各部分功能介绍:
(1)对外命令:该部分主要包括集群管理各种场景所需要的命令行参数,可供用户根据需要手动或者自动化执行所需场景功能,第二章针对各个命令会详细介绍,这里不做赘述。
(2)逻辑仲裁:该部分主要通过主备成员关系一致性仲裁,主备倒换(switchover/failover)自动化来维护主备副本间关系,凡是涉及数据库节点的异常处理,都需要经过数据库仲裁逻辑统一进行数据库仲裁判决谁是主。
(3)CM模块与ETCD交互:该部分主要介绍CM模块与ETCD如何交互,主要是指数据的交互,分布式数据主要存储在ETCD中,通过watch机制监控,CM向ETCD订阅相关数据,同时CM也可以修改并操作ETCD中的数据。
(4)CM内部ETCD数据管理:该部分主要涉及ETCD的相关知识点,重点介绍在CM模块内部ETCD是如何管理分布式数据的。
5.3 备份恢复
Ø 备份方式、级别
① 支持物理备份
通过复制物理文件的方式对数据库进行备份,以磁盘块为基本单位将数据从主机复制到备机,每次备份数据都是以一个扇区(512 Byte)为单位来进行备份。通过备份的数据文件及归档日志等文件,数据库可以进行完全恢复。物理备份速度快,一般被用作对数据进行备份和恢复,用于全量备份的场景。通过合理规划,可以低成本进行备份与恢复
② 支持全量备份
对某一时间点上的所有数据进行完全复制,并不依赖文件的“存档”属性来确定需要备份哪些文件,在备份过程中会清除所有文档的“存档”属性。这种备份方式的优点是只要用磁带,就可以恢复丢失的数据,因此极大的加快了系统或数据的恢复时间。它的缺点在于各个全量备份磁带中的备份数据存在大量的重复信息。另外,由于每次需要备份的数据量相当大,因此备份所需时间较长。
③ 支持多级增量备份
增量备份是相对于上一次备份而言的一种备份。
通过BACKUP命令进行增量备份时,它备份上一次备份后(包含全量备份、差异增量备份、累积增量备份),所有发生变化的文件。这种备份方式最显著的优点:没有重复的备份数据,因此备份的数据量不大,备份所需的时间较短。但增量备份的数据恢复比较麻烦,必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的磁带,就会造成恢复的失败),并且必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,这就极大地延长了恢复时间。增量备份只支持通过BACKUP命令完成。
Ø 备份支持压缩、并行、切分
① 压缩
在备份存储空间有限或者网络备份带宽有限的场景下,需要减小备份集大小,降低资源占用;备份时对备份集进行压缩,可一定程度上减小备份集大小。GaussDB 100支持zstd,lz4和zlib压缩算法对备份集进行压缩。压缩备份时可以指定压缩级别,取值范围为[1, 9],级别越高,压缩率越高,但速度也越慢,默认压缩级别为1。
② 并行、切分
当备份介质为磁盘时,可以开启多个并发线程进行备份,以提高备份速度。并发个数取值是[1, 8]范围内的整数。不指定并发数量时,将默认启动4个并发线程。并行备份时,可指定数据文件的切分阈值,合适的切分阈值可以有效提高并行备份效率。
Ø 支持PITR、指定方案(schema)恢复
① PITR(Point In Time Recovery)
基于时间点的恢复。依据物理备份文件加上Redo日志文件,恢复数据库到指定时间点。
通过备份集可以恢复到备份的时间点;如果备份之后产生的归档日志存在,通过继续回放归档日志,可以恢复到备份之后的时间点。
② 恢复指定schema
为了便于数据维护,可以将不同业务的数据使用不同的方案(schema)存储在数据库中,并且每个方案(schema)独立使用一个表空间。如果只有一个方案(schema)的数据损坏并需要修复,则可以通过工具ztrst实现基于全量备份文件只恢复指定方案(schema)的数据,加快恢复速度。
5.4 逻辑导入导出
5.4.1 dump/load
支持对单表的导出和导入,格式是CSV。
支持指定行列分隔符,支持多分隔符,导入支持并行。
5.4.2 exp/imp
Ø 导出格式
支持导出SQL文本和二进制方式,后者支持并行和压缩。
Ø 导出对象
支持按照用户、表、过滤条件导出数据。
支持只导出对象定义。
Ø 导入对象
导入可以转换表空间和用户名。
5.5 全量割接工具(datasync)
DataSync是GaussDB 100的数据迁移工具,致力于实现其他商业数据库向GaussDB 100高效、安全的数据同步。支持将Sybase、Oracle、MySQL、GaussDB 100 V100R003C10和SQL Server的数据迁移至GaussDB 100 V300R001数据库。
DataSync通过JDBC方式将数据导出为CSV格式,支持数据的导出、导入以及导出+导入。支持自动创建动态表、校验表结构以及使用触发器实现增量割接的能力。
5.6 逻辑复制(HDR)
支持异构数据库之间解析增量日志实现逻辑复制,支持双活。
5.7 图像化开发工具(DS)
Data Studio是一款GUI工具,可以通过它来连接数据库,调试执行SQL语句和存储过程。它支持GaussDB 100的基本特性,为数据库开发人员提供图形界面,显著提高构建应用程序的效率,并简化数据库开发及应用开发任务。
Data Studio主要为数据库开发人员提供以下功能:
浏览数据库对象。
创建和管理数据库对象(例如:数据库、user、表、索引)。
执行SQL语句和SQL脚本。
编辑和执行PL/SQL语句。
Data Studio的具体使用方法请参见随工具配套发布的《Data Studio用户手册》。
5.8 版本升级
支持一键式升级工具,目前还不支持滚动升级和热补丁。
5.9 SQL MAP
支持在线替换指定SQL的能力,用于规避性能问题。
--打开SQL映射功能开关。
ALTER SYSTEM SET enable_sql_map = true;
--创建一个SQL映射。
ALTER SQL_MAP (select count(*) from SYS_DUMMY) REWRITE TO (select count(1) as cnt from SYS_DUMMY);
--输入源SQL语句,实际上会映射成目标SQL语句来执行。
select count(*) from SYS_DUMMY;
CNT
--------------------
1
1 rows fetched.
5.10 性能分析工具
Ø WSR报告
Ø LongSQL日志或视图
Ø 性能视图
前面已经做过介绍,详情参考版本资料。
6 总结
本文系统的介绍了GaussDB 100HA架构的能力以及使用建议,可以指导用户快速的熟悉数据库。由于产品功能还在不断开发中,文中的描述可能跟实际有不一致的情况,需要获取对应版本的技术建议书。由于时间仓促,内容有限,文中内容难免会有疏漏错误,欢迎读者指正。
- 点赞
- 收藏
- 关注作者
评论(0)