diff --git a/app/.vitepress/src/data/blogs/blogs-zh.ts b/app/.vitepress/src/data/blogs/blogs-zh.ts index 19b48473392235be740c8697b5b238ef605c1c6b..a65ddf0a5793e90fb74070c336b26f275121379b 100644 --- a/app/.vitepress/src/data/blogs/blogs-zh.ts +++ b/app/.vitepress/src/data/blogs/blogs-zh.ts @@ -1,4 +1,124 @@ export default [ + { + date: '2024-05-21', + summary: '【openGauss技术文档】openGauss极致RTO日志处理流程简介', + archives: '2024-05', + img: '', + author: ['尼尔福斯'], + title: '【openGauss技术文档】openGauss极致RTO日志处理流程简介', + tags: ['openGauss'], + path: 'zh/blogs/尼尔福斯/【openGauss技术文档】openGauss极致RTO日志处理流程简介', + }, + { + date: '2024-05-30', + summary: '原来openGauss可以这样维护', + archives: '2024-05', + img: '', + author: ['二两烧麦'], + title: '原来openGauss可以这样维护', + tags: ['openGauss'], + path: 'zh/blogs/二两烧麦/原来openGauss可以这样维护', + }, + { + date: '2024-05-27', + summary: 'openGauss 6.0.0-RC1 dataVec向量数据库测试', + archives: '2024-05', + img: '', + author: ['风一样自由'], + title: 'openGauss 6.0.0-RC1 dataVec向量数据库测试', + tags: ['openGauss'], + path: 'zh/blogs/风一样自由/openGauss 6.0.0-RC1 dataVec向量数据库测试', + }, + { + date: '2024-05-24', + summary: 'openGauss 6.0.0-RC1逻辑复制特性测试', + archives: '2024-05', + img: '', + author: ['风一样自由'], + title: 'openGauss 6.0.0-RC1逻辑复制特性测试', + tags: ['openGauss'], + path: 'zh/blogs/风一样自由/openGauss 6.0.0-RC1逻辑复制特性测试', + }, + { + date: '2024-05-22', + summary: '记录一次openGauss空间膨胀的故障排查', + archives: '2024-05', + img: '', + author: ['金子'], + title: '记录一次openGauss空间膨胀的故障排查', + tags: ['openGauss'], + path: 'zh/blogs/金子/记录一次openGauss空间膨胀的故障排查', + }, + { + date: '2024-05-17', + summary: '【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评', + archives: '2024-05', + img: '', + author: ['马顺华'], + title: '【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评', + tags: ['openGauss'], + path: 'zh/blogs/shunwah/【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评', + }, + { + date: '2024-04-12', + summary: 'Yat测试工具使用教程', + archives: '2024-04', + img: '', + author: ['手机用户2629'], + title: 'Yat测试工具使用教程', + tags: ['openGauss'], + path: 'zh/blogs/shoujiyonghu2629/Yat测试工具使用教程', + }, + { + date: '2024-05-13', + summary: 'openGauss UniqueSQLMappingLock 异常等待导致CPU使用率100%故障分析', + archives: '2024-05', + img: '', + author: ['毕思博'], + title: 'openGauss UniqueSQLMappingLock 异常等待导致CPU使用率100%故障分析', + tags: ['openGauss'], + path: 'zh/blogs/bsb/openGauss UniqueSQLMappingLock 异常等待导致CPU使用率100%故障分析', + }, + { + date: '2024-04-25', + summary: 'openGauss的数据处理能力调优实践', + archives: '2024-04', + img: '', + author: ['大数据模型'], + title: 'openGauss的数据处理能力调优实践', + tags: ['openGauss'], + path: 'zh/blogs/大数据模型/openGauss的数据处理能力调优实践', + }, + { + date: '2024-04-25', + summary: '观测openGauss的行组、页、数据类型三者的关系', + archives: '2024-04', + img: '', + author: ['肖小可爱乐乐'], + title: '观测openGauss的行组、页、数据类型三者的关系', + tags: ['openGauss'], + path: 'zh/blogs/肖小可爱乐乐/观测openGauss的行组、页、数据类型三者的关系', + }, + { + date: '2024-04-22', + summary: 'openGauss6.0单点企业版部署_Centos7_x86', + archives: '2024-04', + img: '', + author: ['dongxiaojie'], + title: 'openGauss6.0单点企业版部署_Centos7_x86', + tags: ['openGauss'], + path: 'zh/blogs/dongxiaojie/openGauss6.0单点企业版部署_Centos7_x86', + }, + { + date: '2024-04-19', + summary: 'openGauss 6.0.0-RC1新特性:一站式交互安装初体验', + archives: '2024-04', + img: '', + author: ['宥谦'], + title: 'openGauss 6.0.0-RC1新特性:一站式交互安装初体验', + tags: ['openGauss'], + path: 'zh/blogs/宥谦/openGauss 6.0.0-RC1新特性:一站式交互安装初体验', + }, { date: '2023-08-25', summary: '一次线上查询结果问题分析诊断:Index Only Scan查询结果异常', diff --git a/app/zh/blogs/bsb/images/openGauss/pic1.png b/app/zh/blogs/bsb/images/openGauss/pic1.png new file mode 100644 index 0000000000000000000000000000000000000000..48d25e1981e1389f7f3ea9481a605723ede1b34b Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic1.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic10.png b/app/zh/blogs/bsb/images/openGauss/pic10.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7883c0bffb0d554421ef0916c200c5165cd022 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic10.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic11.png b/app/zh/blogs/bsb/images/openGauss/pic11.png new file mode 100644 index 0000000000000000000000000000000000000000..72239fd358bfca4c0b8c46119998ff185a824d09 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic11.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic12.png b/app/zh/blogs/bsb/images/openGauss/pic12.png new file mode 100644 index 0000000000000000000000000000000000000000..e83fb0da90a10797fa3e85a1a6d4316ec93e4d3e Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic12.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic13.png b/app/zh/blogs/bsb/images/openGauss/pic13.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe3e49d53d219591c2b160b83e23ed4299b664d Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic13.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic14.png b/app/zh/blogs/bsb/images/openGauss/pic14.png new file mode 100644 index 0000000000000000000000000000000000000000..e1dddec1d123c833dd68c2e2db828c9f1dfc1a2c Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic14.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic15.png b/app/zh/blogs/bsb/images/openGauss/pic15.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2171e4c78729ed1f99eef02ab7dd36152558d6 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic15.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic16.png b/app/zh/blogs/bsb/images/openGauss/pic16.png new file mode 100644 index 0000000000000000000000000000000000000000..6688c74e469ce4925a62e7d8e2366d2a4b8612dd Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic16.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic2.png b/app/zh/blogs/bsb/images/openGauss/pic2.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4737d688450080badecf4035e6f1ed8e7559a0 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic2.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic3.png b/app/zh/blogs/bsb/images/openGauss/pic3.png new file mode 100644 index 0000000000000000000000000000000000000000..baaa4fe11547dacf996c23e3fd393235fb454932 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic3.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic4.png b/app/zh/blogs/bsb/images/openGauss/pic4.png new file mode 100644 index 0000000000000000000000000000000000000000..453c58a1c3143096ac9dd1dde87041b4424c6338 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic4.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic5.png b/app/zh/blogs/bsb/images/openGauss/pic5.png new file mode 100644 index 0000000000000000000000000000000000000000..a73b9869e0679cf67b6f9bc9ac812b39749309ea Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic5.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic6.png b/app/zh/blogs/bsb/images/openGauss/pic6.png new file mode 100644 index 0000000000000000000000000000000000000000..118b54f578a988256a58802bebde9623e500b831 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic6.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic7.png b/app/zh/blogs/bsb/images/openGauss/pic7.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9ca4c115339e2830d3aba871534190cb7c467d Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic7.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic8.png b/app/zh/blogs/bsb/images/openGauss/pic8.png new file mode 100644 index 0000000000000000000000000000000000000000..11068fda016a8db2f872aae63528b6781d908171 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic8.png differ diff --git a/app/zh/blogs/bsb/images/openGauss/pic9.png b/app/zh/blogs/bsb/images/openGauss/pic9.png new file mode 100644 index 0000000000000000000000000000000000000000..655f74d7e1588080e3122f11106fe92c40327fc6 Binary files /dev/null and b/app/zh/blogs/bsb/images/openGauss/pic9.png differ diff --git "a/app/zh/blogs/bsb/openGauss UniqueSQLMappingLock \345\274\202\345\270\270\347\255\211\345\276\205\345\257\274\350\207\264CPU\344\275\277\347\224\250\347\216\207100%\346\225\205\351\232\234\345\210\206\346\236\220.md" "b/app/zh/blogs/bsb/openGauss UniqueSQLMappingLock \345\274\202\345\270\270\347\255\211\345\276\205\345\257\274\350\207\264CPU\344\275\277\347\224\250\347\216\207100%\346\225\205\351\232\234\345\210\206\346\236\220.md" new file mode 100644 index 0000000000000000000000000000000000000000..6feded176206b576ce7370352e5081a9e825983f --- /dev/null +++ "b/app/zh/blogs/bsb/openGauss UniqueSQLMappingLock \345\274\202\345\270\270\347\255\211\345\276\205\345\257\274\350\207\264CPU\344\275\277\347\224\250\347\216\207100%\346\225\205\351\232\234\345\210\206\346\236\220.md" @@ -0,0 +1,710 @@ +--- +title: 'openGauss UniqueSQLMappingLock 异常等待导致CPU使用率100%故障分析' + +date: '2024-05-13' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '毕思博' + +summary: '【openGauss技术文章征集】openGauss UniqueSQLMappingLock 异常等待导致CPU使用率100%故障分析' +--- + + +# 故障描述 + +2024 年 4 月 2 日上午10点00分到10点20分江苏电力某系统数据库CPU使用出现异常增长,平均达到了90%以上,峰值达到了100%;会话数也从10点20分开始持续升高,持续到10点28分会话数超过数据库最大连接数8000,业务会话受影响;10点50分数据库部分空闲会话kill,数据库可以连接,此时数据库会话数降低到6000左右;最终13点09分左右对数据库进行了重启操作,数据库连接数稳定在2000左右,CPU使用率也维持到50%左右,业务彻底恢复正常。 + +# 故障分析 + +## 环境描述 + +
+ +openGuass 3.0.3版本主备模式架构。 + +
+ +# 故障处理 + +![images](images/openGauss/pic1.png) + +- 10点00分到10点20分江苏电力某系统数据库CPU使用出现异常增长使用率高达100%。 + +- 持续到10点28分会话数超过数据库最大连接数8000,此时业务会话受影响,在10点20到10点28分这个时段,UniqueSQLMappingLock等待会话数持续增加,从最开始的199个UniqueSQLMappingLock升高到4259个UniqueSQLMappingLock。 + +- 10点50左右采取kill部分空闲的会话,数据库连接数降低到6000左右,业务可以正常连接数据库,CPU使用率降低到70%左右,此时UniqueSQLMappingLock等待降低为1500左右。 + +- 13点09分左右对数据库进行了重启操作,并且扩容了shared buffer大小,之后数据库性能恢复正常,CPU使用率回落至50%左右,UniqueSQLMappingLock等待彻底消失。 + + +# 故障现象 + + +![images](images/openGauss/pic2.png) + +![images](images/openGauss/pic3.png) + + +- 数据库主机09:05:00至10:00:00,主机的CPU平均使用率已经达到70%左右,峰值会达到90%。 + +- 数据库主机10:00:00至10:20:00,主机的CPU平均使用率已经达到90%左右,峰值会达到100%。这一负载与平日系统性能标准有显著偏差,平日系统CPU平均使用率业务繁忙期也就70%左右,峰值90%左右。 + +- 与此同时,内存、网络、IO等方面数据保持在正常范围内并无异常,系统主要的瓶颈还是CPU使用率较高,甚至峰值达到100%。 + +关于数据库主机CPU使用率100%的性能隐患: + +1、性能下降: 当CPU跑满时,服务器的处理能力已经达到极限,因此处理请求的速度变慢,响应时间延迟增加,这将直接影响应用程序不稳定。 + +2、其他资源受限: 当CPU负载高时,服务器上的其他资源,如内存、磁盘和网络带宽,可能会受到限制,从而影响整体性能。 + +该系统在10:00:00到10:20:00时段,该系统的主机CPU使用率接近100%,较高的CPU使用率可能导致主机运行状态不稳定,进而导致数据库的各种内部调度任务响应时长受到影响,各项Latch、Lock、SQL响应时长增加等,数据库可能也因此出现各种异常等待,例如10点20到10点28分时段的uniquesqlMappinglock等待。 + +**cpu 100%问题分析** + +![image](images/openGauss/pic4.png) + +数据库主机CPU使用率100%的时间段的等待事件:10点00分到10点20分时间段内数据库主要等待事件分类是on cpu、sort-fetch tuple和hashAgg-build hash,上述三个等待事件占据了数据库活动时间的63%以上,该等待事件主要由于出现大量top sql,大量的逻辑读 hash join 导致。 + +- 关于ON CPU等待:ON CPU等待主要是数据库运行相关SQL时候的IO读取写入(主要是逻辑读)、SQL解析、函数运算等消耗为主,我们希望数据库的主要等待事件是ON CPU为主,但是此时必须主机CPU使用率处于较低范围例如50%以下,如果此时主机CPU使用率依然较高,还是需要优化TOPSQL来降低ON CPU等待,进而降低系统主机的CPU使用率。 + + +- 关于sort-fetch tuple等待:表示是Sort算子做排序,fetch tuple表示Sort算子正在获取tuple,主要是SQL语句排序等消耗为主导致。 + + +- 关于hashAgg-build hash等待:build hash表示当前HashAgg算子正在建立哈希表,主要用于SQL语句HASH Join关联产生的等待。 + + +期间的主要TOPSQL优化分析如下:(后续TOPSQL重点优化,降低主机的CPU负载) + + +![image](images/openGauss/pic5.png) + +- 截取排名前面的TOPSQL语句全表扫描执行计划: + +1、全表扫描业务表: + +![image](images/openGauss/pic6.png) + +问题: + +该SQL语句需要全表扫描,该表达到3GB容量,SQL的语句where语句并无合适的条件,无法使用索引去过滤数据,高并发的SQL全表扫描会消耗的较多的系统资源(CPU、IO等资源)。 + +2、全表扫描dbe_perf.statement视图 + +系统内一直有对dbe_perf.statement视图去做周期性的查询,获取相关的SQL语句用于监控,该SQL执行时间较长,单次需要20秒以上: + +``` +SELECT user_name, + +left(query, + +100) AS query, + +n_calls, + +min_elapse_time, + +max_elapse_time, + +total_elapse_time, + +n_returned_rows, + +n_tuples_fetched, + +n_tuples_returned, + +n_tuples_inserted, + +n_tuples_updated, + +n_tuples_deleted, + +n_blocks_fetched, + +n_blocks_hit, + +n_soft_parse, + +n_hard_parse, + +db_time, + +cpu_time, + +execution_time, + +parse_time, + +plan_time, + +rewrite_time, + +pl_execution_time, + +pl_compilation_time, + +data_io_time, + +sort_count, + +sort_time, + +sort_mem_used, + +sort_spill_count, + +sort_spill_size, + +hash_count, + +hash_time, + +hash_mem_used, + +hash_spill_count, + +hash_spill_size + +FROM dbe_perf.statement + +WHERE last_updated > now()-600 limit 100; +``` + +**数据库会话数、等待事件分析** + + +10点开始CPU使用率持续较高,并且峰值达到了100%,会话数的进一步增加,进而超过会话数最大值8000,业务受到影响。 + +10点18分到10点28分的会话数变化趋势: + +- 10点18分会话数正常,连接会话数为2122; +- 10点20分会话数升高到2416(此时UniqueSQLMappinglock等待为199个); +- 10点24分会话数升高为5133(此时UniqueSQLMappingLock等待为2060); +- 10点28分会话数升高为8020(此时UniqueSQLMappingLock等待为4259); + +![image](images/openGauss/pic7.png) +![image](images/openGauss/pic8.png) +![image](images/openGauss/pic9.png) +![image](images/openGauss/pic10.png) + +- 关于UniqueSQLMappinglock 数据库等等事件: + + +UniqueSQLMappingLock在OpenGauss数据库中是用来控制对Unique SQL信息哈希表的并发访问的轻量级锁(LWLock)。Unique SQL是OpenGauss中用来追踪和统计数据库中执行的SQL语句的功能,它可以帮助数据库了解哪些SQL语句被执行,它们的执行频率,平均执行时间等信息。 + +在OpenGauss数据库中,Unique SQL信息是存储在一个全局哈希表中的。由于多个线程可能会同时尝试读取或更新这个哈希表中的信息,因此需要一个机制来保证对哈希表的访问是线程安全的。它确保在任何时候只有一个线程能够修改哈希表,而其他的线程必须等待直到UniqueSQLMappingLock锁被释放。 + +**数据库归化unique sql的相关参数介绍** + +- 关于instr_unique_sql_count参数: + +由于数据库在10点开始CPU持续升高,并且CPU使用率峰值达到了100%,此时数据库的归化SQL数量已经达到了instr_unique_sql_count数量250000,数据库将不会记录新的SQL都dbe_perf.statement视图中。为了收集更多的SQL语句来确认是否还有其他TOPSQL消耗较多的资源,数据库管理员在10点18分对数据库中的instr_unique_sql_count参数进行了调整,通过将该参数的值从250,000增加到300,000,能够扩大统计覆盖范围,可以记录更多的SQL语句。 + +![image](images/openGauss/pic11.png) + +之前也由于该业务系统数据库的业务SQL较多,为了更好的优化TOPSQL,也在线上调整该参数。这一调整基于文档的说明和之前的实践经验,已经证明这种方法能够有效地提高对资源密集型查询的识别能力,而不会牺牲数据库的稳定性或性能。 + +instr_unique_sql_count参数官方描述: + +参数说明: 控制系统中unique sql信息实时收集功能。配置为0表示不启用unique sql信息收集功能。 + +该值由大变小将会清空系统中原有的数据重新统计(备机不支持此能力);从小变大不受影响。 + +当系统中产生的unique sql条目数量(dbe_perf.statement/dbe_perf.summary_statement统计)大于instr_unique_sql_count时,若开启了unique sql自动淘汰(默认不开启,参数enable_auto_clean_unique_sql控制,默认该参数为off),则系统会按unique sql的更新时间由远到近自动淘汰一定比例的条目,使得新产生的unique sql信息可以继续被统计。若没有开启自动淘汰,则系统产生的新的unique sql信息将不再被统计。 + +默认值:100 + +取值范围:整型,0~2147483647 + +注意: + +在开启自动淘汰的情况下,如果该值设置的较小,可能会导致系统频繁的进行自动淘汰,有可能会影响数据库系统性能,所以实际场景中建议不要将该值设置的过小,建议值为200000。 + +在开启自动淘汰的情况下,如果该值设置的较大(例如38347922),清理过程中可能会引发大内存问题而无法清理。 + +- 关于unique SQL自动淘汰enable_auto_clean_unique_sql参数: + +由于开启unique SQL自动淘汰可能会引起wdr无法生成,因此该参数默认值也是off,默认不开启unique SQL自动淘汰任务。 + +enable_auto_clean_unique_sql参数官方描述: + +参数说明:当系统中产生的unique sql条目数量大于等于instr_unique_sql_count时,是否启用unique sql自动淘汰功能。 + +取值范围:布尔型 + +默认值:off + +注意: + +由于快照有部分信息是来源于unique sql,所以开启自动淘汰的情况下,在生成wdr报告时,如果选择的起始快照和终止快照跨过了淘汰发生的时间,会导致无法生成wdr报告。 + +track_activity_query_size参数官方描述: + +参数说明:设置用于跟踪每一个活动会话当前正在执行命令的字节数。 + +参数类型:POSTMASTER + +取值范围:整型,100~102400 + +该参数控制记录单个uniqueSQL的最大行长,默认值是1024,该设置会直接对每个SQL分配这么大的内存区域,即使SQL文本远远小于该参数,也会分配这么大的内存区域。该参数一般不建议调整的特别大,避免较多的内存消耗,对于大部分系统1024已经足够,如果需要记录更长的SQL语句到相关视图,可以做一些变更调整。 + +## 实验室模拟场景 + +**1、观察dbe_perf.statement查询耗时随着内存中unique sql条数增加变化曲线。测试过程中外部压力不变,通过构造空表的不同列的查询组合来模拟unique sql。 CPU使用率为60%左右。** + +![image](images/openGauss/pic12.png) + +**2. dbe_perf.statement 查询时间随着内存中 unique sql数量越来越大,查询时间出现明显上涨。** + +![image](images/openGauss/pic13.png) + + +``` +20240409-11:05:14 ---> 20240409-11:05:15 Total:1 seconds Count: 60 + +20240409-11:05:25 ---> 20240409-11:05:26 Total:1 seconds Count: 2211 + +20240409-11:05:36 ---> 20240409-11:05:37 Total:1 seconds Count: 4483 + +20240409-11:05:47 ---> 20240409-11:05:48 Total:1 seconds Count: 6779 + +20240409-11:05:58 ---> 20240409-11:06:00 Total:2 seconds Count: 8983 + +20240409-11:06:10 ---> 20240409-11:06:12 Total:2 seconds Count: 11032 + +20240409-11:06:22 ---> 20240409-11:06:24 Total:2 seconds Count: 13319 + +20240409-11:06:34 ---> 20240409-11:06:37 Total:3 seconds Count: 15558 + +20240409-11:06:47 ---> 20240409-11:06:50 Total:3 seconds Count: 17905 + +20240409-11:07:00 ---> 20240409-11:07:03 Total:3 seconds Count: 20125 + +20240409-11:07:13 ---> 20240409-11:07:20 Total:7 seconds Count: 22668 + +20240409-11:07:30 ---> 20240409-11:07:35 Total:5 seconds Count: 25578 + +20240409-11:07:45 ---> 20240409-11:07:50 Total:5 seconds Count: 27989 + +20240409-11:08:00 ---> 20240409-11:08:05 Total:5 seconds Count: 30584 + +20240409-11:08:15 ---> 20240409-11:08:20 Total:5 seconds Count: 32969 + +20240409-11:08:30 ---> 20240409-11:08:35 Total:5 seconds Count: 35520 + +20240409-11:08:45 ---> 20240409-11:08:51 Total:6 seconds Count: 37889 + +20240409-11:09:01 ---> 20240409-11:09:08 Total:7 seconds Count: 40435 +``` + +**3. 参数 track_activity_query_size 由 51200 调整到 1024 后, 相同测试条件下,dbe_perf.statement 查询耗时如下。可以看到参数 track_activity_query_size 调小后,查询耗时比较稳定,且数据库中未出现 【UniqueSQL】相关报错。** + +![image](images/openGauss/pic14.png) + +``` +20240409-11:09:18 ---> 20240409-11:09:28 Total:10 seconds Count: 42989 + +20240409-11:09:38 ---> 20240409-11:09:47 Total:9 seconds Count: 46176 + +20240409-11:09:57 ---> 20240409-11:10:06 Total:9 seconds Count: 49260 + +20240409-11:10:16 ---> 20240409-11:10:25 Total:9 seconds Count: 52019 + +20240409-11:10:35 ---> 20240409-11:10:44 Total:9 seconds Count: 54992 + +20240409-11:10:54 ---> 20240409-11:11:03 Total:9 seconds Count: 58054 + +20240409-11:11:13 ---> 20240409-11:11:24 Total:11 seconds Count: 60582 + +20240409-11:11:34 ---> 20240409-11:11:44 Total:10 seconds Count: 63705 + +20240409-11:11:54 ---> 20240409-11:12:06 Total:12 seconds Count: 66616 + +20240409-11:12:16 ---> 20240409-11:12:27 Total:11 seconds Count: 69596 + +20240409-11:12:37 ---> 20240409-11:12:58 Total:21 seconds Count: 72765 + +20240409-11:13:08 ---> 20240409-11:13:23 Total:15 seconds Count: 77477 + +20240409-11:13:33 ---> 20240409-11:13:47 Total:14 seconds Count: 80971 + +20240409-11:13:57 ---> 20240409-11:14:16 Total:19 seconds Count: 84445 + +20240409-11:14:26 ---> 20240409-11:14:47 Total:21 seconds Count: 88784 + +20240409-11:14:57 ---> 20240409-11:15:12 Total:15 seconds Count: 93375 + +20240409-11:15:22 ---> 20240409-11:15:37 Total:15 seconds Count: 96583 + +20240409-11:15:47 ---> 20240409-11:16:04 Total:17 seconds Count: 99840 + +20240409-11:16:14 ---> 20240409-11:16:55 Total:41 seconds Count: 100001 + +20240409-11:39:18 ---> 20240409-11:39:18 Total:0 seconds Count: 262 + +20240409-11:39:28 ---> 20240409-11:39:29 Total:1 seconds Count: 2304 + +20240409-11:39:39 ---> 20240409-11:39:39 Total:0 seconds Count: 4404 + +20240409-11:39:49 ---> 20240409-11:39:49 Total:0 seconds Count: 6479 + +20240409-11:39:59 ---> 20240409-11:40:00 Total:1 seconds Count: 8597 + +20240409-11:40:10 ---> 20240409-11:40:10 Total:0 seconds Count: 10722 + +20240409-11:40:20 ---> 20240409-11:40:21 Total:1 seconds Count: 12875 + +20240409-11:40:31 ---> 20240409-11:40:32 Total:1 seconds Count: 15052 + +20240409-11:40:42 ---> 20240409-11:40:42 Total:0 seconds Count: 17215 + +20240409-11:40:52 ---> 20240409-11:40:52 Total:0 seconds Count: 19341 + +20240409-11:41:02 ---> 20240409-11:41:03 Total:1 seconds Count: 21491 + +20240409-11:41:13 ---> 20240409-11:41:14 Total:1 seconds Count: 23664 + +20240409-11:41:24 ---> 20240409-11:41:24 Total:0 seconds Count: 25813 + +20240409-11:41:34 ---> 20240409-11:41:35 Total:1 seconds Count: 28042 +``` + + +原理解释: + +调大 instr_unique_sql_count 后,内存的 hash 表又可以写入,业务 SQL 执行过程中需要向 hashtabl写入数据,需要以 EXCLUSIVE 模式申请 UniqueSQLMappingLock ,会与查询dbe_perf.statement语句产生锁竞争。 + +下图是调整后业务时延随时间的变化图,可以看到业务有周期性的长时延,这与dbe_perf.statement的周期性查询有关。当查询dbe_perf.statement时,会导致业务SQL 执行时间显著上升。这与之前故障环境修改参数后产生大量超时报错现象上是一致的。 + + +![images](images/openGauss/pic15.png) + +``` +20240409-11:41:45 ---> 20240409-11:41:46 Total:1 seconds Count: 30121 + +20240409-11:41:56 ---> 20240409-11:41:56 Total:0 seconds Count: 32407 + +20240409-11:42:06 ---> 20240409-11:42:07 Total:1 seconds Count: 34571 + +20240409-11:42:17 ---> 20240409-11:42:18 Total:1 seconds Count: 36753 + +20240409-11:42:28 ---> 20240409-11:42:29 Total:1 seconds Count: 38906 + +20240409-11:42:39 ---> 20240409-11:42:39 Total:0 seconds Count: 41053 + +20240409-11:42:49 ---> 20240409-11:42:50 Total:1 seconds Count: 43223 + +20240409-11:43:00 ---> 20240409-11:43:01 Total:1 seconds Count: 45391 + +20240409-11:43:11 ---> 20240409-11:43:12 Total:1 seconds Count: 47534 + +20240409-11:43:22 ---> 20240409-11:43:23 Total:1 seconds Count: 49730 + +20240409-11:43:33 ---> 20240409-11:43:34 Total:1 seconds Count: 52040 + +20240409-11:43:44 ---> 20240409-11:43:45 Total:1 seconds Count: 54351 + +20240409-11:43:55 ---> 20240409-11:43:56 Total:1 seconds Count: 56530 + +20240409-11:44:06 ---> 20240409-11:44:07 Total:1 seconds Count: 58729 + +20240409-11:44:17 ---> 20240409-11:44:18 Total:1 seconds Count: 61033 + +20240409-11:44:28 ---> 20240409-11:44:29 Total:1 seconds Count: 63353 + +20240409-11:44:39 ---> 20240409-11:44:40 Total:1 seconds Count: 65690 + +20240409-11:44:50 ---> 20240409-11:44:51 Total:1 seconds Count: 67955 + +20240409-11:45:01 ---> 20240409-11:45:03 Total:2 seconds Count: 70251 + +20240409-11:45:13 ---> 20240409-11:45:14 Total:1 seconds Count: 72667 + +20240409-11:45:24 ---> 20240409-11:45:25 Total:1 seconds Count: 74946 + +20240409-11:45:35 ---> 20240409-11:45:37 Total:2 seconds Count: 77300 + +20240409-11:45:47 ---> 20240409-11:45:48 Total:1 seconds Count: 79649 + +20240409-11:45:58 ---> 20240409-11:45:59 Total:1 seconds Count: 81971 + +20240409-11:46:09 ---> 20240409-11:46:10 Total:1 seconds Count: 84411 + +20240409-11:46:20 ---> 20240409-11:46:22 Total:2 seconds Count: 86796 + +20240409-11:46:32 ---> 20240409-11:46:33 Total:1 seconds Count: 89126 + +20240409-11:46:43 ---> 20240409-11:46:45 Total:2 seconds Count: 91533 + +20240409-11:46:55 ---> 20240409-11:46:56 Total:2 seconds Count: 93995 + +20240409-11:47:07 ---> 20240409-11:47:08 Total:1 seconds Count: 96388 + +20240409-11:47:18 ---> 20240409-11:47:20 Total:2 seconds Count: 98816 + +20240409-11:47:30 ---> 20240409-11:47:31 Total:1 seconds Count: 100000 +``` + + +一旦内存中的 unique sql 重新达到设置的最大值,业务 SQL 就不会再去更新内存中 hash 表,也就与查询 dbe_perf.statement 不会有锁冲突,业务查询时延恢复到正常值。从下图可以看出unique sql达到最大值后,不再受dbe_perf.statement查询的影响。 + +![images](images/openGauss/pic16.png) + +
+ +# 故障结论 + +此次问题的根源为大量TOPSQL导致主机CPU使用率偏高,并且最终达到100%(特别大量全表扫描SQL),在CPU不足情况下数据库中SQL在执行过程中持有获取的锁时间将会加剧,业务SQL越跑越慢,连接数也会进一步的增加,系统出现大量的UniqueSQLMappingLock等待,并且最终超过数据库最大连接数8000,从而影响业务正常运行。 + +由于数据库目前的unique SQL数量已经达到了instr_unique_sql_count参数,不会记录新的SQL语句到数据库中。数据库管理员考虑到CPU使用率100%的风险,在线修改instr_unique_sql_count参数从250000为300000,以便可以收集更多的SQL语句来优化TOPSQL和降低CPU使用率,该参数之前也在线调整过并无异常,故障后也多次模拟在线修改该参数也并未触发异常,并且官方给出的文档中也并没有提及该参数修改可能会遇到相关风险和案例。 + +后续关于该参数instr_unique_sql_count修改和等待事件UniqueSQLMappingLock的关系模拟之后发现: + +如果CPU系统本身负载较高,业务程序并发较大; +instr_unique_sql_count设置的较大,系统捕捉的uniqueSQL也就更多,并且track_activity_query_size设置的也比较大(本系统设置的102400),则instr_unique_sql_count*track_activity_query_size就是uniqueSQL部分的内存消耗为23.8GB(102400*250000/(1024*1024*1024))。 + +如果数据库在线调整instr_unique_sql_count参数期间,还有相关的UniqueSQLMappingLock资源请求发生(例如周期性的查询dbe_perf.statement视图获取相关SQL进行监控,该视图查询会请求UniqueSQLMappingLock资源),则可能触发和加剧更严重的等待竞争,例如出现严重的UniqueSQLMappingLock等待、on CPU等待。 + +**总体分析**: 基于目前的信息判断本次会话数超过最大连接数的主要原因还是主机CPU使用率达到100%诱因,此时导致数据库出现了较多的ON CPU、sort-fetch tuple和hashAgg-build hash等待;系统内的instr_unique_sql_count参数是250000,track_activity_query_size之前被调整为102400,这个设置导致uniqueSQL区域内存非常大,达到了23GB,系统内还有周期性的查询dbe_perf.statement视图(该视图就是uniqueSQL区域对应的视图,由于uniqueSQL达到了23GB,此时查询该视图就导致特别消耗资源,需要时间接近20秒以上还查询不出来)数据获取SQL语句来监控,如果此时调整instr_unique_sql_count参数,则可能进一步加剧系统负载,出现更为严重的UniqueSQLMappingLock和on cpu等待,进而达到数据库最大连接数8000,严重影响业务运行。 + +
+ +# 优化建议 + +- 降低数据库的CPU负载优化业务SQL,确保CPU不会长时间处于高压力状态。当CPU承受过大压力时,数据库的整体性能可能会受到影响,包括但不限于数据块的访问、SQL语句的处理、WAL缓冲区的写入等关键操作的延迟。 + +- instr_unique_sql_count变更规范:高CPU使用率场景下也不建议在线修改instr_unique_sql_count参数,避免在线修改参数触发openGauss数据库相关版本的未知缺陷或者不足(当前openGauss数据库目前版本是3.0.3版本,目前社区最新LTS版本是5.0.0版本)。 + +- 停机修改track_activity_query_size参数从102400降低到4096,为原来的4%,此时uniqueSQL区域将大幅度降低,也避免dbe_perf.statement视图查询时候出现的性能瓶颈。 + +
+ +**附:数据库相关名词解释** + + +1、uniqueSQLMappingLock等待:uniqueSQLMapping等待是用户保护数据库的uniquesql hash table,openGauss数据库中每个SQL语句会对应一个uniquesql,关于uniquesql解释如下: + +用户执行SQL语句时,每一个SQL语句文本都会进入解析器(Parser),生成“解析树”(parse tree)。遍历解析树中各个结点,忽略其中的常数值,以一定的算法结合树中的各结点,计算出来一个整数值,用来唯一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID相同的SQL语句属于同一个“Unique SQL”。 + +例如,用户先后输入如下两条SQL语句: + +select * from t1 where id = 1; + +select * from t1 where id = 2; + +这两条SQL语句除了过滤条件的常数值不同,其他地方都相同,由此生成的解析树的拓扑结构完全相同,故Unique SQL ID也相同。因此两条语句属于如下同一个Unique SQL: + +select * from t1 where id = ?; + +GaussDB、Opengauss内核会对所有上面形式的SQL语句汇总统计信息,通过视图呈现给用户。通过这种方式,可以排除一些无关的常量值的干扰,获得某一类SQL语句的统计数据,为性能分析和问题定位提供数值依据。 + +2、instr_unique_sql_count参数:该参数控制unique SQL数量最大值,如果超过该数值(不开启SQL 自动淘汰),则数据库不再记录新的SQL语句。 + +3、enable_auto_clean_unique_sql参数:该参数控制unique SQL自动淘汰特性是否开启,由于开启unique SQL自动淘汰可能会引起wdr无法生成,因此该参数默认值也是off,默认不开启unique SQL自动淘汰任务。 + +4、track_activity_query_size参数:该参数控制记录单个uniqueSQL的最大行长,默认值是1024,该设置会直接对每个SQL分配这么大的内存区域,即使SQL文本远远小于该参数,也会分配这么大的内存区域,该参数一般不建议调整的特别大,避免较多的内存消耗,对于大部分系统1024已经足够,如果需要记录更长的SQL语句到相关视图,可以做一些变更调整。 + +如果uniqueSQL超过track_activity_query_size该值,会导致数据库很多视图例如pg_stat_activity、db_perf.statement(uniqueSQL对应的视图)记录SQL出现截断,例如如下SQL测试用例 + +``` +修改track_activity_query_size为100(该参数最小只能设置为100) + +openGauss=# show track_activity_query_size; + +track_activity_query_size + +--------------------------- + +100 + +(1 row) + +构造一个较大长度的uniqueSQL: + +openGauss=# CREATE TABLE employee ( + +openGauss(# emp_id INT PRIMARY KEY, + +openGauss(# emp_name VARCHAR(100), + +openGauss(# emp_address VARCHAR(255), + +openGauss(# emp_phone VARCHAR(20), + +openGauss(# emp_email VARCHAR(100), + +openGauss(# emp_salary NUMERIC(10,2), + +openGauss(# emp_hire_date DATE, + +openGauss(# emp_department VARCHAR(50), + +openGauss(# emp_manager_id INT, + +openGauss(# emp_status VARCHAR(20), + +openGauss(# emp_birthday DATE, + +openGauss(# emp_gender CHAR(1), + +openGauss(# emp_marital_status VARCHAR(20), + +openGauss(# emp_position VARCHAR(50), + +openGauss(# emp_experience_years INT, + +openGauss(# emp_education VARCHAR(100), + +openGauss(# emp_skills TEXT, + +openGauss(# emp_certifications TEXT, + +openGauss(# emp_languages TEXT, + +openGauss(# emp_emergency_contact_name VARCHAR(100), + +openGauss(# emp_emergency_contact_phone VARCHAR(20), + +openGauss(# emp_emergency_contact_relationship VARCHAR(50), + +openGauss(# emp_spouse_name VARCHAR(100), + +openGauss(# emp_spouse_phone VARCHAR(20), + +openGauss(# emp_children_names TEXT, + +openGauss(# emp_bank_name VARCHAR(100), + +openGauss(# emp_bank_account_number VARCHAR(50), + +openGauss(# emp_bank_routing_number VARCHAR(50), + +openGauss(# emp_birthplace VARCHAR(100), + +openGauss(# emp_nationality VARCHAR(50), + +openGauss(# emp_ethnicity VARCHAR(50), + +openGauss(# emp_disability_status VARCHAR(50), + +openGauss(# emp_start_date DATE, + +openGauss(# emp_end_date DATE, + +openGauss(# emp_contract_type VARCHAR(50), + +openGauss(# emp_work_location VARCHAR(100), + +openGauss(# emp_work_schedule VARCHAR(50), + +openGauss(# emp_supervisor_id INT, + +openGauss(# emp_last_review_date DATE, + +openGauss(# emp_next_review_date DATE, + +openGauss(# emp_performance_rating NUMERIC(3,2), + +openGauss(# emp_comments TEXT, + +openGauss(# emp_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + +openGauss(# emp_updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + +openGauss(# ); + +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "employee_pkey" for table "employee" + +CREATE TABLE + +查看uniqueSQL对应的视图:create table对应的语句出现截断 + +openGauss=# select distinct query from dbe_perf.statement; + +query + +----------------------------------------------------------------------------------------------------- + +show track_activity_query_size; + +select name, setting from pg_settings where name in (?) + +set max_query_retry_times=0; + +SELECT pg_catalog.gs_password_notifytime() + +select distinct query from dbe_perf.statement; + +select ?, ?, t.* from dbe_perf.global_statio_all_indexes t + +create table t01(id int); + +select ?, ?, t.* from dbe_perf.summary_stat_user_functions t + +select ?, ?, t.* from dbe_perf.summary_stat_all_indexes t + +select ?, ?, t.* from dbe_perf.global_statio_all_sequences t + +select + + +?; + +CREATE TABLE employee ( + + +emp_id INT PRIMARY KEY, + + +emp_name VARCHAR(100), + + +emp_address VARC + +select ?, ?, t.* from dbe_perf.global_stat_all_indexes t + +select + + +?,? from pg_class limit ?; + +show track_activity_query; + +set lockwait_timeout=10000 ; + +select ?, ?, t.* from dbe_perf.summary_stat_all_tables t + +SELECT DATNAME FROM PG_DATABASE; + +set client_encoding to 'SQL_ASCII' + +analyze snapshot.tables_snap_timestamp ; + +select ?, ?, t.* from dbe_perf.global_statio_all_tables t + +SELECT SESSIONID, TEMPID, TIMELINEID FROM PG_DATABASE D, PG_STAT_GET_ACTIVITY_FOR_TEMPTABLE() AS S + +select ?, ?, t.* from dbe_perf.class_vital_info t + +SELECT pg_catalog.intervaltonum(pg_catalog.gs_password_deadline()) + +SELECT VERSION() + +select ?, ?, t.* from dbe_perf.global_stat_all_tables t + +select ?, ?, t.* from dbe_perf.global_stat_user_functions t + +set allow_concurrent_tuple_update='off'; + +select ?, ?, t.* from dbe_perf.summary_statio_all_indexes t + +SET connection_info = '{"driver_name":"libpq","driver_version":"(openGauss 3.0.3 build 46134f73) co + +select ?, ?, t.* from dbe_perf.summary_statio_all_sequences t + +select ?, ?, t.* from dbe_perf.summary_statio_all_tables t + +SELECT NSPNAME FROM PG_NAMESPACE WHERE NSPNAME LIKE ? + +(33 rows) +``` + diff --git a/app/zh/blogs/dongxiaojie/images/pic.png b/app/zh/blogs/dongxiaojie/images/pic.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5af355a2e312630dcff0d7692a506a4d83ae55 Binary files /dev/null and b/app/zh/blogs/dongxiaojie/images/pic.png differ diff --git "a/app/zh/blogs/dongxiaojie/openGauss6.0\345\215\225\347\202\271\344\274\201\344\270\232\347\211\210\351\203\250\347\275\262_Centos7_x86.md" "b/app/zh/blogs/dongxiaojie/openGauss6.0\345\215\225\347\202\271\344\274\201\344\270\232\347\211\210\351\203\250\347\275\262_Centos7_x86.md" new file mode 100644 index 0000000000000000000000000000000000000000..7fcafa35a752565fc25ee54b21bea8531f313d96 --- /dev/null +++ "b/app/zh/blogs/dongxiaojie/openGauss6.0\345\215\225\347\202\271\344\274\201\344\270\232\347\211\210\351\203\250\347\275\262_Centos7_x86.md" @@ -0,0 +1,1143 @@ +--- +title: 'openGauss6.0单点企业版部署_Centos7_x86' + +date: '2024-04-22' + +tags: ['openGauss 技术文章征集', 'openGauss', '安装部署'] + +archives: '2024-04' +category: 'blog' +author: '董小姐' + +summary: '【openGauss技术文章征集】—openGauss6.0单点企业版部署_Centos7_x86' +--- + + +本文档环境:CentOS7.9 x86_64 4G1C40G python2.7.5 交互式初始化环境方式 + +# **openGauss介绍** + +openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。 + +openGauss社区版本分为长期支持版本和创新版本: + +- 长期支持版本 (LTS) ——规模上线使用,发布间隔周期为1年,提供3年社区支持。 + +- 社区创新版本 (Preview) ——联创测试使用,发布间隔周期为1年,提供6个月社区支持。 + +openGauss支持单机部署和单机HA部署两种部署方式。单机部署时,可在一个主机部署多个数据库实例,但为了数据安全,不建议用户这样部署。单机HA部署支持一台主机和最少一台备机,备机一共最多8台的配置方式。 + +**说明**: 通过openGauss提供的脚本安装时,只允许在单台物理机部署一个数据库系统。如果您需要在单台物理机部署多个数据库系统,建议您通过命令行安装,不需要通过openGauss提供的安装脚本执行安装。 + +# **openGauss 6.0介绍** + +**openGauss 6.0.0-RC1 是社区最新发布的创新版本,版本生命周期为 0.5 年。**(创新版本命名:由原方案 XX.1.0 Preview (例:5.1.0 preview),调整为现方案 XX.0.0-RCx),本次发布包含 2 个数据库服务端安装版本:企业版、轻量版,用户可根据使用场景需要下载不同版本,并基于此进行场景化验证,提前发现问题并反馈社区,社区将在下个 LTS 版本发布前进行问题修复,openGauss 6.0.0 LTS 版本将在 2024 年 9 月 30 日进行发布。 + +openGauss 6.0.0-RC1 自 2023 年 9 月 30 日启动版本开发,历时 6 个月开发周期,凝聚社区 1232 名开发者,累计合入 PR 2794 个,与之前版本特性功能保持兼容,在内核能力、Datapod 三层资源池化架构、DataKit 数据全生命周期管理平台、生态兼容性等方面全面增强。 + +## **内核能力增强** + +
+ +### **企业级特性** + +
+ +存储过程增强:支持存储过程覆盖率测试并输出 html 报告,同时允许创建 procedure 时忽略依赖关系进行创建。 开箱最优:提供 gs_perfconfig 工具辅助对 openGauss 进行性能调整,基于环境信息与业务信息,自动调整操作系统以及数据库参数,达到开箱性能即最优。 其他能力增强:支持龙芯平台编译,支持中文日志;安装易用性提升,支持一站式交互安装,并解除对 root 用户的依赖。 + + +### **内核四高能力** + +
+ +**高性能** + + + +分区表性能:在多分区表场景(大于 3000 分区)下,TPCC 数据导入耗时下降 13%,TPCC 性能提升 30%;分区表数据操作(查询、插入、更新、删除等)耗时下降 50%。 主备复制性能:支持 UWAL 组件,利用 RDMA 的 CPU 卸载、内核 Bypass、零拷贝优势,由远程内存直接访问网卡,将 WAL 记录由单边操作传输至远端备库的持久化存储设备,加速主备 XLog 复制;基于 SCM 加速日志持久化,提供 append 语义,大 IO 后拆分后多并发写入,加速 IO 落盘。整体性能提升大于 20%。 + + +**高可用** + +支持异步备升主数据找回能力, 新增 gs_retrieve 工具实现对旧主未同步到异步备的数据通过逻辑解码的方式找回,满足异步备升主场景 RPO≈0。 + +**高智能** + +新增 dataVec 向量数据库插件,作为为专有大模型的向量数据存储和检索的底座,支持向量数据的存储、 相似度计算,支持针对向量数据建立索引(IVFFLAT),加速查询。 + +**高安全** + +在鲲鹏服务器上,通过 CPU 加解密指令实现对国密 SM4 算法加速,性能提升约 5%。 + + +## **DataPod 三层资源池化架构持续创新** + +
+ +### **支持 SPQ 多机并行查询框架** + +基于资源池化架构所有节点都共享集群内的资源,支持生成多机执行计划,并将计划分发到各节点执行,查询节点可汇聚各节点数据实现所有读节点并行查询,充分发挥集群的 OLAP 能力,使资源池化同时具备较强的 TP 和 AP 能力,满足资源池化(一主两备)场景下 TPC-H&TPC-DS 相比单节点 SMP 提升大于 2.6 倍。 + + + +### **新增 DMS 资源统计视图** +query_all_drc_info:支持收集 DMS 资源池中所有的页面信息和锁信息;get_instr_wait_event:支持收集 DMS 相关命令字的等待时延等信息;query_node_reform_info_from_dms:支持收集 DMS 中 reform 流程相关的状态信息。 + +### **DSS 功能增强** +DSS 支持 NoF/NoF+协议,支持该协议的 IOFence、文件读写、查询设备信息、适配 CM 和 OM 等能力,用于对接支持该协议的磁盘阵列,典型业务下相比采用 SCSI3 协议的 TPCC 性能提升 10%。 DSS 服务端支持创建线程池;DSS 支持黑匣子诊断,提高运维能力。 + +### **容灾能力增强** + +集群内高可用:支持 XLog 按需回放,实时解析 XLog 构建页面多版本恢复链,在主机故障时备机快速对外提供服务,实现典型业务负载下 RTO<10s; 集群间高可用:容灾支持两种方式,基于 Dorado 同步复制实现主备双集群方案,适用于百公里级别的同城双中心容灾场景,支持 RPO=0,典型业务负载下 RTO<30s; 基于流复制的主备双集群方案,可灵活部署,适用于同城或异地容灾场景。 + +
+ +## **DataKit 数据全生命周期管理平台能力增强** + +
+ + +### **迁移能力** + + +- 兼容性评估:支持从 MySQL 源库、文件、业务进程中解析和采集 SQL 并输出兼容性报告,支持展示不兼容 SQL 的初始位置,便于快速定位业务不兼容点。对 Mybatis/iBatis ORM 框架评估,提取 SQL 正确率高于 99.5%。 + + +- 前置检测:数据迁移增加前置检测机制,包括:三方件 kafka 服务可用性、磁盘空间、源端和目的端数据库可用性、连接用户权限、数据库参数、大小写参数、目的端数据库 B 兼容性模式等检测,支持迁移前调整内核参数。 + + +- 增量迁移:增量迁移支持 JDBC 超时重连、流量控制、新增按表回放方式,可根据不同业务场景选择事务级并行回放和表级并行回放。 + + +- 反向迁移:反向迁移支持 JDBC 超时重连、流量控制、自定义设置迁移结束后是否保留逻辑复制槽。 + + + +### **对象管理** + +- 数据开发插件:支持查看/修改用户/角色;SQL 语句支持选中导出;新增对触发器、外部表、定时任务的操作;支持数据库断连后自动重连、配置自动断连时间。 + + + +### **智能运维** + +- 实例监控插件:增加新指标;优化采集架构,支持二级指标采集,可采集多个实例的指标。 +- 智能诊断插件:增加诊断经验,包括:索引推荐、SMP 并行查询、作业阻塞分析。 +- 日志检索插件:增加 CM 日志采集,支持 lucene 语法搜索。 +- 智能参数调优插件:结合机器学习方法,有效利用当前负载信息和数据库历史性能表现,推荐一组性能最优的参数。具体包括:支持负载特征分析,从用户负载中抽取出负载特征,多角度精准刻画负载;支持负载生成,根据配置项,生成指定规则的负载 SQL;支持离线调优、在线调优和在线微调,通过多种模式给出最优参数。 + +### **安装部署** + +优化实例监控代理/服务端安装、日志检索代理/服务端安装,支持 SQL 诊断代理安装路径可选;支持资源池化双集群部署,支持安装、切换和状态查询操作。 + +
+ +## **生态兼容性增强** + +
+ +### **MySQL 兼容** + + +MySQL 语法兼容性增强,完善系统函数、关键字、自定义变量、别名、JDBC 等驱动数据类型表现等兼容;MySQL 协议兼容增强,新增 dolphin_hot_standby GUC 参数,控制是否可以使用 MySQL 协议兼容端口连接备机,实现用户应用近似零修改迁移。 + + + +## **安装前准备** + +
+ +### **软硬件要求** + +仅作参考,自测环境低一些也可以,本文档是CentOS7.9 x86_64 4G1C40G的配置 + +**硬件环境** + +[表1 硬件环境要求](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/%E5%87%86%E5%A4%87%E8%BD%AF%E7%A1%AC%E4%BB%B6%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.html#zh-cn_topic_0283136474_zh-cn_topic_0241802565_zh-cn_topic_0085434629_zh-cn_topic_0059782022_t62cd0eed17004265b1b8ad98f302a4bc) 列出了openGauss服务器应具备的最低硬件要求。在实际产品中,硬件配置的规划需考虑数据规模及所期望的数据库响应速度。请根据实际情况进行规划。 + +表 1 硬件环境要求 + +| 项目 | 配置描述 | +| ---- | ---------------------- | +| 内存 | 功能调试建议32GB以上。
性能测试和商业部署时,单实例部署建议128GB以上。
复杂的查询对内存的需求量比较高,在高并发场景下,可能出现内存不足。此时建议使用大内存的机器,或使用负载管理限制系统的并发。 +|CPU | 性能测试和商业部署时,建议1×16核 2.0GHz。
CPU超线程和非超线程两种模式都支持。
说明:
个人开发者最低配置2核4G, 推荐配置4核8G。目前,openGauss仅支持ARM服务器和基于X86_64通用PC服务器的CPU。 +|硬盘 | 用于安装openGauss的硬盘需最少满足如下要求:
-至少1GB用于安装openGauss的应用程序。
- 每个主机需大约300MB用于元数据存储。
- 预留70%以上的磁盘剩余空间用于数据存储。
建议系统盘配置为Raid1,数据盘配置为Raid5,且规划4组Raid5数据盘用于安装openGauss。有关Raid的配置方法在本手册中不做介绍。请参考硬件厂家的手册或互联网上的方法进行配置,其中Disk Cache Policy一项需要设置为Disabled,否则机器异常掉电后有数据丢失的风险。
openGauss支持使用SSD盘作为数据库的主存储设备,支持SAS接口和NVME协议的SSD盘,以RAID的方式部署使用。 +| 网络要求 | 300兆以上以太网。
建议网卡设置为双网卡冗余bond。有关网卡冗余bond的配置方法在本手册中不做介绍。请参考硬件厂商的手册或互联网上的方法进行配置。
该文档只采用了1块网卡。 +| + + + +**软件环境** + +表 2 软件环境要求 + +
+ +| 软件类型 | 配置描述| +| ---- | ------------ | +| Linux操作系统| **ARM**:
openEuler 20.3LTS(推荐采用此操作系统)
麒麟V10
Asianux 7.5
**X86:**
openEuler 20.3LTS
CentOS 7.6
Asianux 7.6说明:当前安装包只能在英文操作系统上安装使用。 +|Linux文件系统| 剩余inode个数 > 15亿(推荐)| +|工具|bzip2| +|Python| openEuler:支持Python 3.7.X, Python 3.9.X
CentOS:支持Python 3.6.X
麒麟:支持Python 3.7.X
Asianux:支持Python 3.6.X说明:python需要通过--enable-shared方式编译。 + +若用户修改过系统python版本,则在安装数据库之前,还需手动安装下列python模块(pip安装即可)。 + + +|psutil|netifaces|cffi|pycparser|cryptography|pynacl|bcrypt|paramiko| +| ---- | ---- |---- |---- |---- |---- |---- |---- | + +并且在预安装时,需要加上--unused-third-party选项。 + + +**软件依赖要求** + +openGauss的软件依赖要求如[表3 软件依赖要求所示。](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/%E5%87%86%E5%A4%87%E8%BD%AF%E7%A1%AC%E4%BB%B6%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.html#zh-cn_topic_0283136474_table1212531681911) + +建议使用上述操作系统安装光盘或者源中,下列依赖软件的默认安装包,若不存在下列软件,可参看软件对应的建议版本。 + +表 3 软件依赖要求 + +|所需软件| 建议版本| +| ---- | --------| +|libaio-devel| 建议版本:0.3.109-13| +|flex |要求版本:2.5.31 以上 | +|bison |建议版本:2.7-4 | +|ncurses-devel| 建议版本:5.9-13.20130511| +|glibc-devel|建议版本:2.17-111| +|patch|建议版本:2.7.1-10| +|redhat-lsb-core|建议版本:4.1| +|readline-devel|建议版本:7.0-13 +|libnsl(openEuler+x86环境中)|建议版本 :2.28-36 +| + +**系统参数配置** + +**操作系统主机命名(可选)** + +如果采用默认主机名,可忽略该步骤,默认的主机名localhost.localdomain,xml文件中的主机名也需要改成localhost.localdomain + + +``` +hostnamectl set-hostname opendb01 +``` + +**/etc/hosts配置(可选)** + +如果采用默认主机名,可忽略该步骤,预安装会自动追加127.0.0.1 localhost #Gauss OM IP Hosts Mapping + +``` +cp /etc/hosts /etc/hosts.bak +cat >>/etc/hosts<> /etc/security/limits.conf << "EOF" +#add by openGauss +root soft as unlimited +omm soft as unlimited +root hard as unlimited +omm hard as unlimited +root soft nproc unlimited +omm soft nproc unlimited +root hard nproc unlimited +omm hard nproc unlimited +EOF +``` + +**关闭透明页** + +``` +echo never > /sys/kernel/mm/transparent_hugepage/enabled +echo never > /sys/kernel/mm/transparent_hugepage/defrag + +--加入开机启动 +echo ' +echo never > /sys/kernel/mm/transparent_hugepage/enabled +echo never > /sys/kernel/mm/transparent_hugepage/defrag' >>/etc/rc.local +chmod +x /etc/rc.local +``` + +**防火墙配置** + +``` +systemctl stop firewalld.service +systemctl disable firewalld.service +``` +如果启用防火墙需进行如下配置: + +如果数据库端口和ssh端口不是15400和22,需视情况更改 +``` +firewall-cmd --zone=public --add-port=15400/tcp --permanent +firewall-cmd --zone=public --add-port=22/tcp --permanent +firewall-cmd --reload +``` + **selinux配置** + + ``` + sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config +setenforce 0 +``` + +**关闭 numa和禁用透明大页** + +``` +sed -i "s/quiet/quiet numa=off transparent_hugepage=never/g" /etc/default/grub +grub2-mkconfig -o /etc/grub2.cfg +``` + +**设置字符集参数** + +``` +echo "export LANG=en_US.UTF-8" >> /etc/profile +source /etc/profile +``` + +**设置时区和时间** + + +如果服务器时间和当前时间相差8小时或者12小时,需要查看时区,分析是否决定更改。 + +**非可视化更改步骤** + +``` +--查看当前时间 +[root@opendb01 ~]# date +Fri Apr 19 14:15:52 CST 2024 + +--查看当前时区 +[root@localhost ~]# timedatectl + Local time: Fri 2024-04-19 14:16:08 CST + Universal time: Fri 2024-04-19 06:16:08 UTC + RTC time: Fri 2024-04-19 06:16:07 + Time zone: Asia/Shanghai (CST, +0800) + NTP enabled: n/a +NTP synchronized: no + RTC in local TZ: no + DST active: n/a + +--更改时区 执行tzselect命令 + +root@HKSZF-ZW-172-19-146-176:/topsoft# tzselect +Please identify a location so that time zone rules can be set correctly. +Please select a continent, ocean, "coord", or "TZ". + 1) Africa + 2) Americas + 3) Antarctica + 4) Asia + 5) Atlantic Ocean + 6) Australia + 7) Europe + 8) Indian Ocean + 9) Pacific Ocean +10) coord - I want to use geographical coordinates. +11) TZ - I want to specify the time zone using the Posix TZ format. + +--找到Asia,输入4,回车 +Please select a country whose clocks agree with yours. + 1) Afghanistan 18) Israel 35) Palestine + 2) Armenia 19) Japan 36) Philippines + 3) Azerbaijan 20) Jordan 37) Qatar + 4) Bahrain 21) Kazakhstan 38) Russia + 5) Bangladesh 22) Korea (North) 39) Saudi Arabia + 6) Bhutan 23) Korea (South) 40) Singapore + 7) Brunei 24) Kuwait 41) Sri Lanka + 8) Cambodia 25) Kyrgyzstan 42) Syria + 9) China 26) Laos 43) Taiwan +10) Cyprus 27) Lebanon 44) Tajikistan +11) East Timor 28) Macau 45) Thailand +12) Georgia 29) Malaysia 46) Turkmenistan +13) Hong Kong 30) Mongolia 47) United Arab Emirates +14) India 31) Myanmar (Burma) 48) Uzbekistan +15) Indonesia 32) Nepal 49) Vietnam +16) Iran 33) Oman 50) Yemen +17) Iraq 34) Pakistan + +--找到china,输入9,回车 +Please select one of the following time zone regions. +1) Beijing Time +2) Xinjiang Time + +--找到北京时间,输入1,回车 +Please select one of the following time zone regions. +1) Beijing Time +2) Xinjiang Time + +--选择yes,输入1,回车 +The following information has been given: + + China + Beijing Time + +Therefore TZ='Asia/Shanghai' will be used. +Selected time is now: Wed Jan 24 21:40:32 CST 2024. +Universal Time is now: Wed Jan 24 13:40:32 UTC 2024. +Is the above information OK? +1) Yes +2) No + +--更新设置 +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + +--查看是否更改成功 +root@HKSZF-ZW-172-19-146-176:/topsoft# date +Fri Apr 19 14:15:52 CST 2024 + +[root@localhost ~]# timedatectl + Local time: Fri 2024-04-19 14:16:08 CST + Universal time: Fri 2024-04-19 06:16:08 UTC + RTC time: Fri 2024-04-19 06:16:07 + Time zone: Asia/Shanghai (CST, +0800) + NTP enabled: n/a +NTP synchronized: no + RTC in local TZ: no + DST active: n/a + +``` +**可视化更改步骤** + +``` +--查看当前时间 +[root@opendb01 ~]# date +Fri Apr 19 14:43:11 CST 2024 + +--查看当前时区 +[root@localhost ~]# timedatectl + Local time: Fri 2024-04-19 14:43:31 CST + Universal time: Fri 2024-04-19 06:43:31 UTC + RTC time: Fri 2024-04-19 06:43:30 + Time zone: Asia/Shanghai (CST, +0800) +``` + +在可视化界面中查看 + +选择进入 Applications -> System Tools -> Settings -> Details -> Date & Time + + + +调整时间 + +点击“Date & Time”行中任意位置,弹出弹窗,调整时间为当前北京时间,再关闭弹窗,即保存。 + + + +再次使用命令查看,本地时间已显示为北京时间 + + +``` +[root@localhost ~]# timedatectl + Local time: Fri 2024-04-19 14:43:31 CST + Universal time: Fri 2024-04-19 06:43:31 UTC + RTC time: Fri 2024-04-19 06:43:30 + Time zone: Asia/Shanghai (CST, +0800) + NTP enabled: n/a +NTP synchronized: no + RTC in local TZ: no + DST active: n/a + +``` + +**关闭swap交换内存(可选)** + + +关闭swap交换内存是为了保障数据库的访问性能,避免把数据库的缓冲区内存淘汰到磁盘上。 如果服务器内存比较小,内存过载时,可打开swap交换内存保障正常运行。 + +``` +swapoff -a +``` + +**关闭RemoveIPC** + +在各数据库节点上,关闭RemoveIPC。CentOS操作系统默认为关闭,可以跳过该步骤。 + +1. 修改/etc/systemd/logind.conf文件中的“RemoveIPC”值为“no”。a. 使用VIM打开logind.conf文件。 + +``` +--更改后的/etc/systemd/logind.conf +vim /etc/systemd/logind.conf +RemoveIPC=no + +--更改后的 +vim /usr/lib/systemd/system/systemd-logind.service +RemoveIPC=no + +--重新加载配置参数 +systemctl daemon-reload +systemctl restart systemd-logind + +--检查修改是否生效 +loginctl show-session | grep RemoveIPC +systemctl show systemd-logind | grep RemoveIPC +``` + +**关闭HISTORY记录(可选)** + + +为避免指令历史记录安全隐患,需关闭各主机的history指令。 + +``` +更改/etc/profile中HISTSIZE值 +vim /etc/profile +HISTSIZE默认值为1000 更改为 HISTSIZE=0 + +--生效 +source /etc/profile +``` + +**配置yum源** + +将操作系统镜像上传至/opt目录下 + +``` +mount /opt/*.iso /mnt/ +cat << EOF >> /etc/fstab +/dev/sr0 /mnt iso9660 loop 0 0 +EOF + +mkdir -p /etc/yum.repos.d/bak +mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak +cat >> /etc/yum.repos.d/os.repo <<"EOF" +[OS1] +name=OS +baseurl=file:///mnt +enabled=1 +gpgcheck=0 +EOF +``` + +**安装依赖包** + +``` +yum install -y bzip2 libaio-devel flex bison ncurses-devel glibc-devel \ +patch redhat-lsb-core readline-devel + +注意:openEuler+x86环境中 yum install -y libnsl kylinV10中无redhat-lsb-core,如果是Centos +操作系统采用如下步骤: + + +--kylinV10 操作系统下安装依赖包如下: +yum install -y bzip2 libaio-devel flex bison ncurses-devel glibc-devel \ +patch readline-devel +``` + +**python版本升级** + + + +python版本如果是3.6.x,可跳过该步骤 + +python版本2.7.5需升级至3.6.x版本,centos7 用python3.6 ,欧拉20用python3.7,其实不需要去编译安装python,直接用操作系统自带的包管理器yum install python3或dnf install python3,装上去就是对应的版本了。切不要编译安装,不然跳坑,预安装时报错。 + +``` +--查看python版本 +[root@opendb01 ~]# python --version +Python 2.7.5 + +[root@opendb01 ~]# python3 --version +python3命令找不到 + +--采用yum方式安装操作系统自带的包管理器中的python3 +yum install python3 + +--再次查看python版本 +[root@opendb01 ~]# python --version +Python 2.7.5 + +[root@opendb01 ~]# python3 --version +Python 3.6.8 +``` + +**创建用户及用户组(可选)** + + +可以创建也可以不创建,自行操作 +``` +--创建用户组dbgrp +groupadd dbgrp + +--创建用户组dbgroup下的普通用户omm,并设置密码为Gauss_234 +useradd -g dbgrp omm +passwd omm +``` + +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性,安装脚本在安装过程中会自动按照用户指定内容创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + +|用户/组名|所属类型|规划建议| +|--------|--------|-------| +|dbgrp |操作系统|建议规划单独的用户组,例如dbgrp。
[初始化安装环境](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.html)时,由-G参数所指定的安装用户所属的用户组。该用户组如果不存在,则会自动创建,也可提前创建好用户组。在执行gs_preinstall脚本时会检查权限。gs_preinstall脚本会自动赋予此组中的用户对安装目录、数据目录的访问和执行权限。
创建dbgrp用户组命令:
groupadd dbgrp| +|omm|操作系统|建议规划用户用于运行和维护openGauss,例如omm。
[初始化安装环境](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.html)时,由-U参数所指定和自动创建的操作系统用户,如果已经存在该用户,请清理该用户或更换初始化用户。从安全性考虑,对此用户的所属组规划如下:
所属组:dbgrp| +| + +在安装openGauss过程中root用户运行 openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz中scripts目录中的“gs_preinstall”时,会创建与安装用户同名的数据库用户,即数据库用户omm。此用户具备数据库的最高操作权限,此用户初始密码由用户指定。 + + +**目录规划** + +``` +--创建存放安装包的目录 +mkdir -p /topsoft/soft/openGauss +chmod 777 -R /topsoft/soft + +--创建目录 目录会自动创建,如果创建安装种会报错 +mkdir -p /topsoft/huawei/install/app #数据库安装目录 +mkdir -p /topsoft/huawei/log/omm #日志目录 +mkdir -p /topsoft/huawei/tmp #临时文件目录 +mkdir -p /topsoft/huawei/install/om #数据库工具目录 +mkdir -p /topsoft/huawei/corefile #数据库core文件目录 +``` + +**下载并上传安装包** + +登录openGauss开源社区,选择对应平台的企业版安装包。 + +![image.png](images/pic.png) + + + +上传至/topsoft/soft/openGauss目录,安装包“openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz”和配置文件“cluster_config.xml”都上传至上一步所创建的目录中。 + + +**配置单节点XML文件** + +安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场景配置对应的XML文件。 + +
+ +关于如何配置XML文件,详细请参见创建[XML配置文件](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%88%9B%E5%BB%BAXML%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html)。 + +
+ +将cluster_config.xml上传至/topsoft/soft/openGauss目录,安装包“openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz”和配置文件“cluster_config.xml”都上传至上一步所创建的目录中。 + +
+ +为确保成功安装,检查hostname与/etc/hostname是否一致。预安装过程中,会对hostname进行检查。 + +
+ +默认端口5432,若待用自定义端口,更改xml文件中的端口号 + +
+ +**官方XML文件模板** + +
+ +``` +cat cluster_config.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**根据官方模板更改后的xml文件** + +``` +cat cluster_config.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**解压安装包** + +
+ + +对于个人开发者或非企业级环境,下载极简安装包(不安装OM等组件)即可。本文档采用的是企业版安装,因此安装OM等组件 + +注意:安装包“openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz”和配置文件“cluster_config.xml”需在同一目录中,本文档是/topsoft/soft/openGauss目录。 + +``` +--进入安装包所在目录 +[root@opendb01 ~]# cd /topsoft/soft/openGauss/ +[root@localhost openGauss]# ls -l +total 130712 +-rw-r--r--. 1 root root 1905 Jan 27 08:31 cluster_config.xml +-rw-r--r--. 1 root root 133842584 Jan 27 08:30 openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz + +--解压openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz安装包 +tar -xvf openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz + +--查看解压后的文件 +[root@localhost ~]# cd /topsoft/soft/openGauss/ +[root@localhost openGauss]# ls -lS +total 293248 +-rw-r--r--. 1 root root 149449208 Apr 19 15:02 openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz +-rw-r--r--. 1 root root 104672194 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +-rw-r--r--. 1 root root 23122340 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +-rw-r--r--. 1 root root 22466710 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.tar.gz +-rw-------. 1 root root 541779 Mar 31 12:14 upgrade_sql.tar.gz +-rw-r--r--. 1 root root 1882 Apr 19 15:01 cluster_config.xml +-rw-r--r--. 1 root root 109 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.sha256 +-rw-r--r--. 1 root root 65 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.sha256 +-rw-r--r--. 1 root root 65 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.sha256 +-rw-------. 1 root root 65 Mar 31 12:14 upgrade_sql.sha256 + + +参数说明: +-S :按文件类型排序 + +--继续解压openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz 数据库工具包 企业版安装需要解压该包极简版不需要 +tar -xvf openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz + +--查看解压后的文件 script目录中生成gs_preinstall等各种OM工具脚本 +-total 293260 +-rw-r--r--. 1 root root 149449208 Apr 19 15:02 openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz +-rw-r--r--. 1 root root 104672194 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +-rw-r--r--. 1 root root 23122340 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +-rw-r--r--. 1 root root 22466710 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.tar.gz +-rw-------. 1 root root 541779 Mar 31 12:14 upgrade_sql.tar.gz +drwxr-xr-x. 19 root root 4096 Mar 31 12:15 lib +drwxr-xr-x. 11 root root 4096 Mar 31 12:15 script +-rw-r--r--. 1 root root 1882 Apr 19 15:01 cluster_config.xml +-rw-r--r--. 1 root root 109 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.sha256 +-rw-r--r--. 1 root root 65 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.sha256 +-rw-r--r--. 1 root root 65 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.sha256 +-rw-------. 1 root root 65 Mar 31 12:14 upgrade_sql.sha256 +-rw-r--r--. 1 root root 36 Mar 31 12:15 version.cfg + +``` + +- 在执行前置脚本gs_preinstall时,需要规划好openGauss配置文件路径、安装包存放路径、程序安装目录、实例数据目录,后续普通用户使用过程中不能再更改这些路径。 + +- 运行前置脚本gs_preinstall准备安装环境时,脚本内部会自动将openGauss配置文件、解压后的安装包同步拷贝到其余服务器的相同目录下。 + +- 在执行前置脚本或者互信前,请检查/etc/profile文件中是否包含错误输出信息,如果存在错误输出,需手动处理。 + +**使用gs_preinstall初始化安装环境** + +安装环境的初始化包含上传安装包和XML文件(二者需在同一目录)、解压安装包、使用gs_preinstall准备好安装环境。 + +分2种场景初始化,自行选择。 + + +**准备安装用户及环境** + +创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs_preinstall准备好安装用户及环境。在执行前置脚本gs_preinstall时,需要规划好openGauss配置文件路径、安装包存放路径、程序安装目录、实例数据目录,后续普通用户使用过程中不能再更改这些路径。 + +安装前置脚本gs_preinstall可以协助用户自动完成如下的安装环境准备工作: + +- 自动设置Linux内核参数以达到提高服务器负载能力的目的。这些参数直接影响数据库系统的运行状态,请仅在确认必要时调整。openGauss所设置的Linux内核参数取值请参见配置操作系统参数。 + +- 脚本内部会自动将openGauss配置文件、安装包拷贝到openGauss主机的相同目录下。 + +- openGauss安装用户、用户组不存在时,自动创建安装用户以及用户组。 + +- 读取openGauss配置文件中的目录信息并创建,将目录权限授予安装用户。 + +- 只能使用root用户执行gs_preinstall命令 + +- 在执行前置脚本或者互信前,请检查/etc/profile文件中是否包含错误输出信息,如果存在错误输出,需手动处理。 + +注意:如果是openEuler(openEuler 20.03)的操作系统,执行如下命令打开performance.sh文件,用#注释sysctl -w vm.min_free_kbytes=112640 &> /dev/null,键入“ESC”键进入指令模式,执行**:wq**保存并退出修改。 + +``` +vi /etc/profile.d/performance.sh +``` + +**场景1:采用交互模式执行前置** + +``` +场景1:采用交互模式执行前置 +``` + +这里设置:omm用户密码omm + +预安装脚本执行的详细过程如下: + +``` +[root@localhost script]# ./gs_preinstall -U omm -G dbgrp -X /topsoft/soft/openGauss/cluster_config.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Setting host ip env +Successfully set host ip env. +Are you sure you want to create the user[omm] (yes/no)? +Please enter password for cluster user. +Password: +Please enter password for cluster user again. +Password: +Generate cluster user password files successfully. + +Successfully created [omm] user on all nodes. +Preparing SSH service. +Successfully prepared SSH service. +Checking OS software. +Successfully check os software. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/topsoft/soft/openGauss/script/gs_checkos -i A -h opendb01 --detail". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Setting user environmental variables. +Successfully set user environmental variables. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Core file +Successfully set core path. +Setting pssh path +Successfully set pssh path. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +No need to set ARM Optimization. +Fixing server package owner. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + +**问题处理** + + +**python3: No such file or directory** + +``` +--问题描述 +采用交互模式执行前置时报错/usr/bin/env: python3: No such file or directory +[root@opendb01 script]# ./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/cluster_config.xml +/usr/bin/env: python3: No such file or directory + +--解决办法 +采用上面办法进行python版本升级 +--查看python版本 +[root@opendb01 ~]# python --version +Python 2.7.5 + +[root@opendb01 ~]# python3 --version +python3命令找不到 + +--采用yum方式安装操作系统自带的包管理器中的python3 +yum install python3 + +--再次查看python版本 +[root@opendb01 ~]# python --version +Python 2.7.5 + +[root@opendb01 ~]# python3 --version +Python 3.6.8 +``` + +**[GAUSS-52400] : Installation environment does not meet the desired result** + + +**执行安装** + +使用gs_install安装openGauss。安装脚本gs_install必须以前置脚本中指定的omm执行,否则,脚本执行会报错。 + +/topsoft/soft/openGauss/cluster_config.xml为openGauss配置文件的路径。在执行过程中,用户需根据提示输入数据库的密码,密码具有一定的复杂度,为保证用户正常使用该数据库,请记住输入的数据库密码。这里设置为Topnet@123 + +设置的密码要符合复杂度要求: + +- 最少包含8个字符,最多包含16个字符。 + +- 不能和用户名、当前密码(ALTER)、或当前密码反序相同。 + +- 至少包含大写字母(A-Z)、小写字母(a-z)、数字、非字母数字字符(限定为~!@#$%^&*()-_=+\|[{}];:,<.>/?)四类字符中的三类字符。 + +注意事项: + +- openGauss支持字符集的多种写法:gbk/GBK、UTF-8/UTF8/utf8/utf-8和Latine1/latine1。 + +- 安装时若不指定字符集,默认字符集为SQL_ASCII,为简化和统一区域loacle默认设置为C,若想指定其他字符集和区域,请在安装时使用参数gsinit-parameter="–locale=LOCALE"来指定,LOCALE为新数据库设置缺省的区域。 + +- 默认端口5432 + +``` +--赋予配置文件777的权限,因为安装脚本gs_install必须以前置脚本中指定的omm执行 +chmod 777 /topsoft/soft/openGauss/cluster_config.xml +chmod 777 /topsoft/soft + +--切换用户 omm为前置脚本gs_preinstall中-U参数指定的用户 +su - omm + +--查看配置文件/etc/profile中的语言参数 +[omm@opendb01 dn_6001]$ cat /etc/profile | grep LANG +export LANG=en_US.UTF-8 + +--查看系统支持UTF-8编码的区域 + locale -a|grep utf8 + +--执行安装脚本 +gs_install -X /topsoft/soft/openGauss/cluster_config.xml --gsinit-parameter="--locale=en_US.utf8" + +``` + +安装过程中会生成ssl证书,证书存放路径为{gaussdbAppPath}/share/sslcert/om,其中{gaussdbAppPath}为openGauss配置文件中指定的程序安装目录。 + +``` +[omm@opendb01 om]$ cd /topsoft/huawei/install/app/share/sslcert/om +[omm@opendb01 om]$ ls -l +total 64 +-rw-------. 1 omm dbgrp 4399 Apr 19 15:15 cacert.pem +-rw-------. 1 omm dbgrp 4402 Apr 19 15:15 client.crt +-rw-------. 1 omm dbgrp 1766 Apr 19 15:15 client.key +-rw-------. 1 omm dbgrp 56 Apr 19 15:15 client.key.cipher +-rw-------. 1 omm dbgrp 1217 Apr 19 15:15 client.key.pk8 +-rw-------. 1 omm dbgrp 24 Apr 19 15:15 client.key.rand +-rw-------. 1 omm dbgrp 10921 Apr 19 15:15 openssl.cnf +-rw-------. 1 omm dbgrp 4402 Apr 19 15:15 server.crt +-rw-------. 1 omm dbgrp 1766 Apr 19 15:15 server.key +-rw-------. 1 omm dbgrp 56 Apr 19 15:15 server.key.cipher +-rw-------. 1 omm dbgrp 24 Apr 19 15:15 server.key.rand + +``` + + +日志文件路径下会生成两个日志文件:“gs_install-YYYY-MMDD_HHMMSS.log”和“gs_local-YYYY-MM-DD_HHMMSS.log”。 + + +``` +/topsoft/huawei/log/omm/omm/om/gs_install-2024-04-19_151222.log +``` + +详细过程如下: + +``` +[omm@opendb01 ~]$ gs_install -X /topsoft/soft/openGauss/cluster_config.xml --gsinit-parameter="--locale=en_US.utf8" +Parsing the configuration file. +Successfully checked gs_uninstall on every node. +Check preinstall on every node. +Successfully checked preinstall on every node. +Creating the backup directory. +Successfully created the backup directory. +begin deploy.. +Installing the cluster. +begin prepare Install Cluster.. +Checking the installation environment on all nodes. +begin install Cluster.. +Installing applications on all nodes. +Successfully installed APP. +begin init Instance.. +encrypt cipher and rand files for database. +Please enter password for database: +Please repeat for database: +begin to create CA cert files +The sslcert will be generated in /topsoft/huawei/install/app/share/sslcert/om +NO cm_server instance, no need to create CA for CM. +Non-dss_ssl_enable, no need to create CA for DSS +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Successfully deleted instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Check consistence of memCheck and coresCheck on database nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +The cluster status is Normal. +Successfully started cluster. +Successfully installed application. +end deploy.. + +``` + +**问题处理 字符集不是UTF8** + + +``` +--问题描述 +安装完成后登录数据库查看数据库时字符集不是UTF8 + +--原因 +执行安装时未指定字符集参数,,未指定字符集参数执行安装时字符集默认是SQL_ASCII + +--解决办法 +--查看配置文件/etc/profile中的语言参数 +[omm@opendb01 dn_6001]$ cat /etc/profile | grep LANG +export LANG=en_US.UTF-8 + +-- +``` + +**访问数据库** + +连接数据库的客户端工具包括gsql、应用程序接口(如JDBC)。 + + +- gsql是openGauss自带的客户端工具。[使用gsql连接](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/%E4%BD%BF%E7%94%A8gsql%E8%AE%BF%E9%97%AEopenGauss.html) 数据库,可以交互式地输入、编辑、执行SQL语句。 + +- 用户可以使用标准的数据库[应用程序接口](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/%E4%BD%BF%E7%94%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%8E%A5%E5%8F%A3%E8%AE%BF%E9%97%AEopenGauss.html)-(如JDBC),开发基于openGauss的应用程序。 + +``` +--查看进程 +[omm@opendb01 ~]$ ps -ef | grep gaussdb +omm 7669 1 8 07:18 ? 00:01:45 /topsoft/huawei/install/app/bin/gaussdb -D /topsoft/huawei/install/data/dn +或 +[omm@opendb01 ~]$ gs_ctl query -D /topsoft/huawei/install/data/dn +[2024-01-28 07:40:02.099][9092][][gs_ctl]: gs_ctl query ,datadir is /topsoft/huawei/install/data/dn + HA state: + local_role : Normal + static_connections : 0 + db_state : Normal + detail_information : Normal + + Senders info: +No information + Receiver info: +No information + +``` + +**本地连接数据库** + +gsql是openGauss提供的在命令行下运行的数据库连接工具。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节只介绍如何使用gsql连接数据库,关于gsql使用方法的更多信息请参考《工具与命令参考》中“客户端工具 > gsql”章节。 + +缺省情况下,客户端连接数据库后处于空闲状态时会根据参数[session_timeout](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DatabaseReference/%E5%AE%89%E5%85%A8%E5%92%8C%E8%AE%A4%E8%AF%81_postgresql-conf.html#zh-cn_topic_0237124696_zh-cn_topic_0059778664_see4820fb6c024e0aa4c56882aeae204a)的默认值自动断开连接。如果要关闭超时设置,设置参数[session_timeout](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DatabaseReference/%E5%AE%89%E5%85%A8%E5%92%8C%E8%AE%A4%E8%AF%81_postgresql-conf.html#zh-cn_topic_0237124696_zh-cn_topic_0059778664_see4820fb6c024e0aa4c56882aeae204a)为0即可。默认为0表示关闭超时设置 + +以操作系统用户omm登录数据库主节点。 + +``` +su - omm +法一: +gsql -d postgres -p 15400 + +参数说明: +-d 连接的数据库名称, +-p 数据库主节点的端口号 + +法二: +gsql -d "host=127.0.0.1 port=15400 dbname=postgres user=omm password=Topnet@123" + + +--登录后如下: +[omm@localhost ~]$ gsql -d postgres -p 15400 +gsql ((openGauss 5.0.1 build 33b035fd) compiled at 2023-12-15 20:19:06 commit 0 last mr ) +Non-SSL connection (SSL connection is recommended when requiring high-security) +Type "help" for help. + +openGauss=# \l+ + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | + Description +-----------+-------+----------+------------+------------+-------------------+-------+------------+-------------- +------------------------------ + postgres | omm | UTF8 | en_US.utf8 | en_US.utf8 | | 13 MB | pg_default | default admin +istrative connection database + template0 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +| 13 MB | pg_default | default templ +ate for new databases + | | | | | omm=CTc/omm | | | + template1 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +| 13 MB | pg_default | unmodifiable +empty database + | | | | | omm=CTc/omm | | | +(3 rows) + +--查看数据库状态 +[omm@localhost ~]$ gs_om -t status +----------------------------------------------------------------------- + +cluster_name : dbCluster +cluster_state : Normal #“Normal”表示数据库可正常使用 +redistributing : No + +--创建数据库 不能是en_US.utf8不然报错 +openGauss=# create database test with encoding 'utf8' template = template0; +CREATE DATABASE +``` + +**查数据库版本** + +``` +--法一 +安装目录下查看 +cat /topsoft/huawei/install/app/version.cfg +``` + +[参考链接1](https://cloud.tencent.com/developer/article/1822337) + +[参考链接2](https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83.html) diff --git "a/app/zh/blogs/shoujiyonghu2629/Yat\346\265\213\350\257\225\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/app/zh/blogs/shoujiyonghu2629/Yat\346\265\213\350\257\225\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..c7aa7c1b32fbd0bd77624d493677ddfa66bafe2e --- /dev/null +++ "b/app/zh/blogs/shoujiyonghu2629/Yat\346\265\213\350\257\225\345\267\245\345\205\267\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -0,0 +1,383 @@ +--- +title: 'Yat测试工具使用教程' + +date: '2024-04-12' + +tags: ['openGauss', '测试用例'] + +archives: '2024-04' +category: 'blog' +author: '手机用户2629' + +summary: 'Yat测试工具使用教程' +--- + +本文主要介绍Yat测试框架的安装和使用,文中介绍了基本的安装方法,用例编写,调度文件编写,配置文件修改和用例执行,用户可根据文中示例进行简单的用例编写和了解Yat框架的使用。 + +# 1. 安装 + +## 1.1 基本环境 + +
+ +基本环境要求: Java 1.8+,Python 3.6+; + +
+ +## 1.2 下载安装 + +
+ +从openGauss社区拉取Yat测试框架代码 + +
+ +### 1.2.1 生成安装包 + +
+ +(1)在linux环境里可直接在yat-master目录下执行一下命令生成安装包 + +``` +chmod 755 gradlew +./gradlew pack +``` + +(2)也可在windows里用IDEA以Gradle项目打开,右边栏点击Gradle->yat->other->pack生成安装包 + +![image](image/openGauss/pic1.png) + +![image](image/openGauss/pic2.png) + +![image](image/openGauss/pic3.png) + + +上传到服务器指定位置用安装包进行安装 + + +### 1.2.2 安装 + + +install脚本涉及安装python第三方包列表: + +``` +xlrd,requests,pyyaml,click,openpyxl,paramiko,scp,jinjia2,paramunittest,pytest +``` + +install脚本使用pip安装上述三方包,需要用户环境pip环境已安装 + +``` +tar zxf yat-*** + +python3 install -F +``` + + +-F是强制覆盖安装,由于安装三方库较多且运行中使用python系统包,建议以root用户安装,后续在不同的用户路径下初始化测试套,以root运行。 + +### 1.2.3 安装后检查版本 + + +yat version或者yat info检查是否显示相关信息 + +# 2. 使用 + + +## 2.1 创建测试套模板 + +Yat可直接初始化测试套模板,执行如下命令初始化一个新的测试套: + +``` +yat suite init -d test-suite-name +``` + +test-suite-name是要创建的测试套名称,一般取要测试特性的名称,执行此命令后创建一个测试套目录,目录下包含若干目录和文件。 + +## 2.2 测试套目录解释 + +进入测试套目录,可以看到以下目录 + +![image](image/openGauss/pic4.png) + +其中conf文件夹下主要包含configure.yml(运行时配置要求,包含用例名要求,用例大小要求,用例总数要求等),nodes.yml(测试套运行数据库连接信息),macro.yml(python用例中的一些变量配置,例如:用例中需要使用db示例路径,需要在此增加相应的键值对) + + +![image](image/openGauss/pic5.png) + +lib文件夹初始化后不存在,需要手动mkdir创建lib文件夹,放入驱动文件,在nodes.yml中使用哪种数据库的jdbc驱动就需要加入到此路径下 + +![image](image/openGauss/pic6.png) + +log文件夹是运行后生成的运行结果日志,其中context.yml包含运行中获取的上下文信息,error.log是运行一个执行器执行测试,yat.diff是结果对比日志,yat.log是运行每条用例的结果,ok表示与预期相符,er表示执行有误或者与预期不符 + +![image](image/openGauss/pic7.png) + + +result文件夹是运行后生成的用例执行结果,可在此目录下查看用例执行步骤和结果 + +schedule文件夹是统一管理调度文件的目录,执行运行命令指定某一调度文件,可执行串行按调度文件顺序执行用例 + +except文件夹是统一存放期望的目录,与testcase相同层级的放置except,yat运行后用执行结果和except进行对比来判断用例是否执行成功 + +testcase文件夹是统一放置用例的目录,可以分功能分模块放置用例,yat运行时根据调度文件执行testcase位置读取用例去数据库执行 + + +## 2.3 编写用例 + +
+ +### 2.3.1 现支持的用例类型有: + +
+ +sql用例,以.sql结尾的用例 + +shell单元测试用例,以.u.sh结尾的用例 + +python单元测试用例,以.py结尾的用例 + +go单元测试用例,以test.go结尾的用例 + +c++单元测试用例,以.cc结尾的用例,用例写法符合gtest框架 + +groovy用例,以.groovy结尾的用例,用例必须时一个junit用例 + +spock用例,以.spec.groovy结尾的用例,用例写法符合spock框架 + +### 2.3.2 用例编写 + +在上述操作的目录中,做如下操作: + +``` +cd test-suite-name + +touch testcase/datatype.sql +``` + +文件内容如下: + +``` +drop table if exists t_longblob_001; +create table t_longblob_001(field_name longblob); +insert into t_longblob_001 values('01010'); +set bytea_output=escape; +select * from t_binary_001; +``` + + +## 2.4 调度文件编写 + +基于上述目录,在schedule目录中新建调度文件: + +schedule/datatype.schd + +``` +test:datatype +``` + +其中test:后跟的是用例对于testcase层级的相对路径 + +也支持其他用例,例如: + +create_table.sql: + + +``` +create table t_longblob_001(field_name longblob); +``` + + +select.py: + +``` +def select(node): + + result = node.sh('select * from t_longblob_001').ok() + + Assert.equals(result, '') + +``` + +cleanup.sql: + + +``` +drop table t_longblob_001; +``` + + +同时也可指定其他维度的调度例如: + + +``` +setup: create_table + +group: select + +cleanup: cleanup +``` + +## 2.5 修改连接节点配置文件 + +由上文可知,nodes.yml存放的节点信息,配置如下: + +``` +default: + host: '192.168.0.118' + db: + url: 'jdbc:opengauss://host:port/dbname' + driver: 'org.opengauss.Driver' + username: 'username' + password: 'password' + port: 1111 + name: 'dbname' + ssh: + port: 22 + username: 'username' + password: 'password' + +``` + +## 2.6 驱动安装 + + +上述建立lib放置驱动文件是局部安装,对于该测试套生效 + +同样也支持多个测试套共享JDBC驱动的场景 + +多个测试套同一层级建立common目录,创建lib文件夹,放置驱动对于多个测试套生效 + +同样支持全局安装,默认yat安装路径/usr/local/yat目录中,执行一下命令即可全局生效: + +``` +cp ****.jar /usr/local/yat/java +chmod a+r ~/lib/*.jar +echo `export YAT_LIB_PATH=$HOME/LIB` >> ~/.bashrc +source ~/.bashrc +``` + +## 2.7 执行测试套 + +进入测试套目录,执行 + +``` +cd test-suite-name + +yat suite run -s schedule/**.schd --color 2>/dev/null +``` + + +其中--color 2>/dev/null指定输出格式不包含连接信息打印,主要输出运行信息,若遇到无结果等情况可去掉该参数检查连接是否正常 + +同时也支持任意路径执行,但是要指定测试套执行 + + +``` +yat suite run -d /***/***/test-suite-name +``` + + +## 2.8 常用操作命令 + +查看yat帮助说明 + +``` +yat --help +``` + + +其中yat子命令也可查看自己的帮助命令 + +``` +yat suite --help + +yat playbook --help +``` + +# 3 常见问题解决 + +## 3.1提示core dump不是绝对路径 + + +``` +yat suite check error: + + * core dump pattern path |/***** is not a absolute path + +Error:yat suite check failed +``` + +解决办法: + +``` +echo "* soft core unlimited" >>/etc/security/limits.conf + + echo "* hard core unlimited" >>/etc/security/limits.conf + + mkdir -p /data/core + + chmod 777 /data/core + + echo "/data/core/core-%e-%u-%s-%t-%h" > /proc/sys/kernel/core_pattern + +``` + +提示core文件权限不够,执行修改core文件权限 + + +## 3.2 提示驱动找不到 + +``` +java.lang.ClassNotFoundException:org.postgresql.Driver +``` + +解决办法参考2.6节 + +## 3.3 运行时无法连接数据库 + +修改数据库远程连接信息,对于openGauss数据库,修改数据库实例里的postgresql.conf,修改监听地址为: + +``` +listen_addresses = 'localhost,{yat所在机器的host}' +``` + + +在实例里的pg_hba.conf加上: + + +``` +host {yat配置database名} {yat配置username名} {yat所在机器host}/32 sha256 +``` + + +执行完以上操作需要重启生效,重启后执行sql -d {yat配置database名} -U {yat配置username名} -h {yat所在机器host} -p *** -r检查是否可以远程访问数据库 + +## 3.4 python用例调试 + +对于openGauss已开源用例,在此对其中python用例有些用法进行解释: + +(1)例如python用例要使用远程连接和一些ssh操作,在用例中使用utils对公共部分进行封装,用户在实际使用中可导入要使用的node信息,即可引用utils相应的node操作,比较常用的例如excute_sql,restart_db等操作,在使用中要保证该utils模块在testcase层级下才可引用,同时要确保node配置信息正确,否则使用该node相应方法时会报错; + +(2) 对于python用例,运行步骤打印输出在测试套层级下的root.log,根据步骤打印信息进行排查,同时也可在result里直接定位报错位置进行排查,在编写python用例时要符合pytest测试规范,setup内实现变量声明,testmain实现测试功能,teardown实现后置清理操作; + +(3)对于功能复杂的python用例需要在关键步骤输出日志,以便在结果排查。同时在python用例断言判断要使用准确的结果进行判断,尽量使用结果中的关键信息进行判断; + +## 3.5 sql用例期望 + +sql用例的期望要放置expect,对于期望报错的功能点,由于输出了可变的信息如连接信息,需要在期望中对关键信息进行模糊匹配: + +(1)例如错误信息使用?.*ERROR: invalid input syntax for integer: "null .*匹配; + +(2)存在一些表格样式的差异,可用.*进行匹配; + +(3)同时对于一些结果未知的数据类型,也可用正则表达式进行数据类型匹配,比如random_bytes函数测试,对于结果用数字加字母进行正则匹配; + + + + + + + + + + diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic1.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic1.png new file mode 100644 index 0000000000000000000000000000000000000000..ec07659b689076946496912522119e9ab376d81e Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic1.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic2.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic2.png new file mode 100644 index 0000000000000000000000000000000000000000..43972eabd9345bd92079d2fbce40c21e381c28e6 Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic2.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic3.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic3.png new file mode 100644 index 0000000000000000000000000000000000000000..f259abe2562b0bde21e52c77e45814bc2aad84b2 Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic3.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic4.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic4.png new file mode 100644 index 0000000000000000000000000000000000000000..9345d4555e7cfa155c78def0bf75097d96e5baa5 Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic4.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic5.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic5.png new file mode 100644 index 0000000000000000000000000000000000000000..72a3fa161b701ba942415cb69dcf239c63507ecd Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic5.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic6.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic6.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ef322f6e8035980b6243d1dc7a10b46a23ace7 Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic6.png differ diff --git a/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic7.png b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic7.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfa7da0e023769ccc49c7c688f4c203c5c2ebe9 Binary files /dev/null and b/app/zh/blogs/shoujiyonghu2629/image/openGauss/pic7.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic1.png b/app/zh/blogs/shunwah/image/openGauss/pic1.png new file mode 100644 index 0000000000000000000000000000000000000000..79e7f50b27d3a7b09479bbb77ac4bc2728aa0b70 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic1.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic10.png b/app/zh/blogs/shunwah/image/openGauss/pic10.png new file mode 100644 index 0000000000000000000000000000000000000000..f9769f6c20c29db9210e18e7489625abe2c0c1fb Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic10.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic11.png b/app/zh/blogs/shunwah/image/openGauss/pic11.png new file mode 100644 index 0000000000000000000000000000000000000000..d67bf3ae8cab691ca67689989bf917f4eb6d6b84 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic11.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic12.png b/app/zh/blogs/shunwah/image/openGauss/pic12.png new file mode 100644 index 0000000000000000000000000000000000000000..b49a9ab9bf1247300474651fb76f4cd77f5256f2 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic12.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic13.png b/app/zh/blogs/shunwah/image/openGauss/pic13.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7df9f1917efa2b76e7f19f9bed9724006d5214 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic13.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic14.png b/app/zh/blogs/shunwah/image/openGauss/pic14.png new file mode 100644 index 0000000000000000000000000000000000000000..db52c8e87d51a2156c4e6bb9dc6775a4232eeadf Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic14.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic15.png b/app/zh/blogs/shunwah/image/openGauss/pic15.png new file mode 100644 index 0000000000000000000000000000000000000000..63b87fc22e1814580224205978032cd42227d81a Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic15.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic16.png b/app/zh/blogs/shunwah/image/openGauss/pic16.png new file mode 100644 index 0000000000000000000000000000000000000000..b665997725232b459a7ac01fa6079e6edf86e413 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic16.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic17.png b/app/zh/blogs/shunwah/image/openGauss/pic17.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2cecdabffe54fd30f576733b8ecb32b2ee518f Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic17.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic18.png b/app/zh/blogs/shunwah/image/openGauss/pic18.png new file mode 100644 index 0000000000000000000000000000000000000000..b637e1fe982be66eb16206482add565e37cb5470 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic18.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic19.png b/app/zh/blogs/shunwah/image/openGauss/pic19.png new file mode 100644 index 0000000000000000000000000000000000000000..33b8f8c07d405c9b57878a5f99202ecaf33d356e Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic19.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic2.png b/app/zh/blogs/shunwah/image/openGauss/pic2.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b85188fb1011a3016bbb78e208b4d7c09e73d7 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic2.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic20.png b/app/zh/blogs/shunwah/image/openGauss/pic20.png new file mode 100644 index 0000000000000000000000000000000000000000..b140f91c907469340542462aa3e476117a3d85c2 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic20.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic21.png b/app/zh/blogs/shunwah/image/openGauss/pic21.png new file mode 100644 index 0000000000000000000000000000000000000000..4a82c64ad69bb09ff42d89db8a36f90472be25e1 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic21.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic22.png b/app/zh/blogs/shunwah/image/openGauss/pic22.png new file mode 100644 index 0000000000000000000000000000000000000000..62b2a29475693aeb7a607824bd27a936c395e4c7 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic22.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic23.png b/app/zh/blogs/shunwah/image/openGauss/pic23.png new file mode 100644 index 0000000000000000000000000000000000000000..224fe71b3a04cc3d4eb7d926858b81846e1719f8 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic23.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic3.png b/app/zh/blogs/shunwah/image/openGauss/pic3.png new file mode 100644 index 0000000000000000000000000000000000000000..0a273955258247f452060ef815e142f160edca56 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic3.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic4.png b/app/zh/blogs/shunwah/image/openGauss/pic4.png new file mode 100644 index 0000000000000000000000000000000000000000..a074663bb6cf700d97bbd701a4d5c38eb5bf74f9 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic4.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic5.png b/app/zh/blogs/shunwah/image/openGauss/pic5.png new file mode 100644 index 0000000000000000000000000000000000000000..65661deeefcc46aca6e2043de5d44d80facfda4e Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic5.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic6.png b/app/zh/blogs/shunwah/image/openGauss/pic6.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3175841a4a5845a80e259a2fcd748687e4664e Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic6.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic7.png b/app/zh/blogs/shunwah/image/openGauss/pic7.png new file mode 100644 index 0000000000000000000000000000000000000000..b059e78cbe08ea0aa8e44d3121483e3d7770b55a Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic7.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic8.png b/app/zh/blogs/shunwah/image/openGauss/pic8.png new file mode 100644 index 0000000000000000000000000000000000000000..fb217d297359046f763cd09525dbe3299879e62f Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic8.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss/pic9.png b/app/zh/blogs/shunwah/image/openGauss/pic9.png new file mode 100644 index 0000000000000000000000000000000000000000..647351e6548b342a84b5a1fac7163cfdf9e0ff05 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss/pic9.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic1.png b/app/zh/blogs/shunwah/image/openGauss2/pic1.png new file mode 100644 index 0000000000000000000000000000000000000000..592ddce948a2ddfea6c51d32b3baa52f123e021b Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic1.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic10.png b/app/zh/blogs/shunwah/image/openGauss2/pic10.png new file mode 100644 index 0000000000000000000000000000000000000000..4641ca967d799f0837aade3605ec626339c487a9 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic10.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic11.png b/app/zh/blogs/shunwah/image/openGauss2/pic11.png new file mode 100644 index 0000000000000000000000000000000000000000..d39c25678d3e2cdac196ceb93a2fa7387bef4fbf Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic11.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic12.png b/app/zh/blogs/shunwah/image/openGauss2/pic12.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e0021eb6c9588ace4bc4da9f36226fd72b41a9 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic12.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic13.png b/app/zh/blogs/shunwah/image/openGauss2/pic13.png new file mode 100644 index 0000000000000000000000000000000000000000..0d94cb5414641654fe2c2c773c48974f2625dbc7 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic13.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic14.png b/app/zh/blogs/shunwah/image/openGauss2/pic14.png new file mode 100644 index 0000000000000000000000000000000000000000..9658beacd7a933553e10be1e3880a971a62b563b Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic14.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic15.png b/app/zh/blogs/shunwah/image/openGauss2/pic15.png new file mode 100644 index 0000000000000000000000000000000000000000..bde3e40ac8e536d7b62296da0cff57e2855562ab Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic15.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic16.png b/app/zh/blogs/shunwah/image/openGauss2/pic16.png new file mode 100644 index 0000000000000000000000000000000000000000..d0de6ce109848b163d4e6b5a4021096f67543709 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic16.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic17.png b/app/zh/blogs/shunwah/image/openGauss2/pic17.png new file mode 100644 index 0000000000000000000000000000000000000000..c841c629ee4416296617f551d4d4f77eef62b56c Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic17.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic18.png b/app/zh/blogs/shunwah/image/openGauss2/pic18.png new file mode 100644 index 0000000000000000000000000000000000000000..66371c81774a977969303f0b33ab1174f042d09b Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic18.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic19.png b/app/zh/blogs/shunwah/image/openGauss2/pic19.png new file mode 100644 index 0000000000000000000000000000000000000000..44edf96957ae69738397dd5e2a746706636039b9 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic19.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic2.png b/app/zh/blogs/shunwah/image/openGauss2/pic2.png new file mode 100644 index 0000000000000000000000000000000000000000..18461053130557c93cb1685a4723e3545c57d439 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic2.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic20.png b/app/zh/blogs/shunwah/image/openGauss2/pic20.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ba272dd58d533d838562d711c899e0538707cc Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic20.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic21.png b/app/zh/blogs/shunwah/image/openGauss2/pic21.png new file mode 100644 index 0000000000000000000000000000000000000000..2927a308a8a5f967dfd4bc58453975e0aedc5776 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic21.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic22.png b/app/zh/blogs/shunwah/image/openGauss2/pic22.png new file mode 100644 index 0000000000000000000000000000000000000000..52b7b7c9de5bde820fce5dc6ae586d470f1873a6 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic22.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic23.png b/app/zh/blogs/shunwah/image/openGauss2/pic23.png new file mode 100644 index 0000000000000000000000000000000000000000..0dae601e2e337540d01e64589e53d04f9935808a Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic23.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic24.png b/app/zh/blogs/shunwah/image/openGauss2/pic24.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8d56320407f109d4885f8e443cc9e5b07c9f0a Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic24.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic25.png b/app/zh/blogs/shunwah/image/openGauss2/pic25.png new file mode 100644 index 0000000000000000000000000000000000000000..7f38431ab79174283f5bfc9a17b06dd065da671e Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic25.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic26.png b/app/zh/blogs/shunwah/image/openGauss2/pic26.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2fc9c3767e47f4114ee1c19246dabe56943631 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic26.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic27.png b/app/zh/blogs/shunwah/image/openGauss2/pic27.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc21464c780496ddc1e3ed2d211d0f60fc83c21 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic27.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic28.png b/app/zh/blogs/shunwah/image/openGauss2/pic28.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee46ae88e0ceaf2f5b84d04100cf56fbe5e7fbb Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic28.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic29.png b/app/zh/blogs/shunwah/image/openGauss2/pic29.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4543a2399821a4ccd54936e91d60a95a8bde41 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic29.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic3.png b/app/zh/blogs/shunwah/image/openGauss2/pic3.png new file mode 100644 index 0000000000000000000000000000000000000000..17162c2bc222ef4403c66e855dfb644450c26bdd Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic3.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic30.png b/app/zh/blogs/shunwah/image/openGauss2/pic30.png new file mode 100644 index 0000000000000000000000000000000000000000..27be6b05c304fa1538a9b274d681d759d9bfddef Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic30.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic31.png b/app/zh/blogs/shunwah/image/openGauss2/pic31.png new file mode 100644 index 0000000000000000000000000000000000000000..87a8e3a7fbe1bd75af5b7a3d03e881dccbc749a1 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic31.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic32.png b/app/zh/blogs/shunwah/image/openGauss2/pic32.png new file mode 100644 index 0000000000000000000000000000000000000000..c1df1d006a49f7e13ff2681c7eaa898b6c2ecdb7 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic32.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic33.png b/app/zh/blogs/shunwah/image/openGauss2/pic33.png new file mode 100644 index 0000000000000000000000000000000000000000..000e529ff26fcc94ed6ec2bc884557ab872bf670 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic33.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic4.png b/app/zh/blogs/shunwah/image/openGauss2/pic4.png new file mode 100644 index 0000000000000000000000000000000000000000..72c1ed0d6c60e9847cf5ec9110397c8c3043b097 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic4.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic5.png b/app/zh/blogs/shunwah/image/openGauss2/pic5.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf860e623e57a314e302ae352ce146881e463a2 Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic5.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic6.png b/app/zh/blogs/shunwah/image/openGauss2/pic6.png new file mode 100644 index 0000000000000000000000000000000000000000..46521dc53b7790c3244b9e02875275d829fffbde Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic6.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic7.png b/app/zh/blogs/shunwah/image/openGauss2/pic7.png new file mode 100644 index 0000000000000000000000000000000000000000..feecf68454d8b207f4e845636e7544e5964a2dcd Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic7.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic8.png b/app/zh/blogs/shunwah/image/openGauss2/pic8.png new file mode 100644 index 0000000000000000000000000000000000000000..802852854c7ad964b2187200d1805feb976e2c0c Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic8.png differ diff --git a/app/zh/blogs/shunwah/image/openGauss2/pic9.png b/app/zh/blogs/shunwah/image/openGauss2/pic9.png new file mode 100644 index 0000000000000000000000000000000000000000..981e17cf54809ac2faa4f83be5de27466405c90e Binary files /dev/null and b/app/zh/blogs/shunwah/image/openGauss2/pic9.png differ diff --git "a/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221openGauss 6.0.0\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205\346\265\213\350\257\204.md" "b/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221openGauss 6.0.0\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205\346\265\213\350\257\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..a0e0d5d70b2a5394c9a87c9adf71e5ec244056cc --- /dev/null +++ "b/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221openGauss 6.0.0\346\226\260\347\211\210\346\234\254\345\256\211\350\243\205\346\265\213\350\257\204.md" @@ -0,0 +1,473 @@ +--- +title: '【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评' + +date: '2024-05-17' + +tags: ['openGauss', '版本安装', '技术文章征集'] + +archives: '2024-05' +category: 'blog' +author: '马顺华' + +summary: '【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评' +--- + + + +从事运维管理工作多年,目前就职于某科技有限公司,熟悉运维自动化、OceanBase部署运维、MySQL 运维以及各种云平台技术和产品。并已获得OceanBase认证OBCA、OBCP 证书、OpenGauss社区认证结业证书、崖山DBCA证书、亚信AntDBCA证书、翰高HDCA认证、GBase 8a|GBase 8c 证书。OceanBase & 墨天轮第二、三、四届技术征文大赛,多次获得 一、二、三 等奖,在openGauss 第五届、第六届技术征文大赛中多次获奖。时常在墨天轮发布原创技术文章,并多次被首页推荐。 + +![image](image/openGauss/pic1.png) + + +# 前言 + +近日,备受瞩目的openGauss 6.0.0版本正式上线,作为国产数据库的佼佼者,openGauss一直致力于为用户提供高效、稳定的数据库解决方案。恰逢openGauss社区举办的第七届openGauss技术文章征集活动正式开启,我有幸亲身体验了这一新版本,并在此分享我的安装及使用测评。 + +# 一、安装体验 +openGauss 6.0.0版本在安装方面进行了重大改进,推出了全新的一站式交互安装功能。这一功能极大地简化了安装流程,降低了用户的学习成本。在安装过程中,用户只需通过交互界面输入数据库的相关信息,系统便会自动生成xml配置文件,并自动进行数据库的初始化安装。相比之前的版本,这一改变无疑是一大亮点。 + +在实际安装过程中,我按照提示逐步操作,整个过程流畅无阻。值得一提的是,openGauss 6.0.0版本还解除了对root用户的依赖,进一步提升了安装的安全性。安装完成后,我成功启动了数据库服务,并进行了基本的测试。 + +# 二、使用体验 + +性能优化:openGauss 6.0.0版本在性能方面进行了优化,特别是在主备复制方面。通过实际测试,我发现新版本在数据同步和故障恢复方面表现优异,能够满足大多数业务场景的需求。 + +中文日志支持:新版本还增加了中文日志支持功能,这一功能对于国内用户来说非常实用。通过查看中文日志,用户可以更直观地了解数据库的运行状态和错误信息,从而更快速地定位问题并进行修复。 + +多版本支持:openGauss 6.0.0版本提供了企业版和轻量版两个安装版本供用户选择。企业版适用于大规模、高性能的业务场景,而轻量版则更加适合小规模、轻量级的应用。这种多版本的支持策略使得openGauss能够满足不同用户的需求。 + +# 三、安装准备 + +本章详细介绍openGauss极简安装的环境准备和配置,极简安装包括单节点安装和一主一备节点安装,请在安装之前仔细阅读本章的内容。如果已完成本章节的配置,请忽略。 + +## 1、获取安装包 + +openGauss开源社区上提供了安装包的获取方式。 + +``` +https://opengauss.org/zh/download/ +``` + +![image](image/openGauss/pic2.png) + + +**本次试验环境如下:(根据实际软硬件情况,选择不同的安装包)** + +架构 :x86x_64 + +操作系统:Centos 7.6 + +软件包:openGauss_6.0.0-RC1 极简版 + +## 2、下载到服务器 + +``` +[root@worker1 soft]# ls +openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +[root@worker1 soft]# +``` + +![image](image/openGauss/pic3.png) + + +## 3、系统环境配置 + + +### 3.1 目前仅支持在防火墙关闭的状态下进行安装。 + + +``` +[root@worker1 soft]# sestatus +SELinux status: disabled +[root@worker1 soft]# +[root@worker1 soft]# systemctl status firewalld +● firewalld.service - firewalld - dynamic firewall daemon + Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) + Active: inactive (dead) + Docs: man:firewalld(1) +[root@worker1 soft]# +``` + + +![image](image/openGauss/pic4.png) + + +### 3.2 设置字符集参数 + +将各数据库节点的字符集设置为相同的字符集,可以在/etc/profile文件中添加“export LANG=XXX”(XXX为Unicode编码)。 + +en_US.UTF-8 + +``` +[root@worker1 soft]# echo 'export LANG=en_US.UTF-8' >>/etc/profile +[root@worker1 soft]# +``` + +![image](image/openGauss/pic5.png) + + +### 3.3 关闭RemoveIPC + + +在各数据库节点上,关闭RemoveIPC。CentOS操作系统默认为关闭,可以跳过该步骤。 +RemoveIPC=no + +![image](image/openGauss/pic6.png) + + +### 3.4 关闭HISTORY记录 + + +HISTSIZE=0 + + +![image](image/openGauss/pic7.png) + + +## 4、创建用户和组 + + +### 4.1 创建用户组dbgroup。 + + +![image](image/openGauss/pic8.png) + + +``` +[root@worker1 ~]# +[root@worker1 ~]# groupadd dbgroup +[root@worker1 ~]# +``` + +![image](image/openGauss/pic9.png) + + + +### 4.2 创建用户组dbgroup下的普通用户omm,并设置普通用户omm的密码。 + + +``` +[root@worker1 ~]# useradd -g dbgroup omm +[root@worker1 ~]# passwd omm +Changing password for user omm. +New password: +Retype new password: +passwd: all authentication tokens updated successfully. +[root@worker1 ~]# +``` + +# 四、单节点安装 + + +前提条件 + +已完成用户组和普通用户的创建。 +所有服务器操作系统和网络均正常运行。 +普通用户必须有数据库包解压路径、安装路径的读、写和执行操作权限,并且安装路径必须为空。 +普通用户对下载的openGauss压缩包有执行权限。 +安装前请检查指定的openGauss端口是否被占用,如果被占用请更改端口或者停止当前使用端口进程。 + + +## 1、用户登录 + +使用普通用户登录到openGauss包安装的主机,解压openGauss压缩包到安装目录(假定安装目录为/opt/software/openGauss,请用实际值替换)。 + +``` +[root@worker1 soft]# ls +openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +[root@worker1 soft]# tar -jxf openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 -C /opt/software/openGauss/ +[root@worker1 soft]# +``` + +![image](image/openGauss/pic10.png) + + +如果报错没有权限 + +``` +[omm@worker1 soft]$ tar -jxf openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 -C /opt/software/openGauss/ +tar: ./bin: Cannot mkdir: Permission denied +tar: ./bin: Cannot mkdir: Permission denied +``` + +![image](image/openGauss/pic11.png) + + +切换为root用户后添加权限就可以了 + +``` +[root@worker1 opt]# chown omm:dbgroup /opt/software/openGauss/ +[root@worker1 opt]# chmod 755 /opt/software/openGauss/ +``` + + +![image](image/openGauss/pic12.png) + + +## 2、解压 + + +假定解压包的路径为/opt/software/openGauss,进入解压后目录下的simpleInstall。 + +``` +[root@worker1 soft]# cd /opt/software/openGauss/simpleInstall +[root@worker1 simpleInstall]# ls +finance.sql install.sh README.md school.sql +[root@worker1 simpleInstall]# +``` + +![image](image/openGauss/pic13.png) + + +## 3、脚本安装 + + +执行install.sh脚本安装openGauss。 + +``` +[root@worker1 simpleInstall]# sh install.sh -w "openGauss666" &&source ~/.bashrc +[step 1]: check parameter +Error: can not install openGauss with root +[root@worker1 simpleInstall]# +``` + + +**安装报错** + +``` +[omm@worker1 simpleInstall]$ sh install.sh -w "openGauss666" &&source ~/.bashrc +[step 1]: check parameter +[step 2]: check install env and os setting +On systemwide basis, the maximum number of SEMMNI is not correct. the current SEMMNI value is: 128. Please check it. +The required value should be greater than 321. You can modify it in file '/etc/sysctl.conf'. +[omm@worker1 simpleInstall]$ +``` + + +**解决办法:** + + +用root登录修改所需的值应大于321,然后执行sysctl -p + +``` +[root@worker1 ~]# +[root@worker1 ~]# sysctl -w kernel.sem="250 85000 250 330" +kernel.sem = 250 85000 250 330 +[root@worker1 ~]# +``` + +![image](image/openGauss/pic14.png) + + +**再次执行install.sh脚本安装openGauss。** + +``` +[omm@worker1 simpleInstall]$ sh install.sh -w "openGauss666" &&source ~/.bashrc + +[2024-05-17 16:39:10.010][7802][][gs_ctl]: done +[2024-05-17 16:39:10.010][7802][][gs_ctl]: server started (/opt/software/openGauss/data/single_node) +import sql file +Would you like to create a demo database (yes/no)? +``` + +## 4、完成安装 + +![image](image/openGauss/pic15.png) + + +## 5、检查安装进程 + + + +安装执行完成后,使用ps和gs_ctl查看进程是否正常。 + + +``` +[omm@worker1 simpleInstall]$ +[omm@worker1 simpleInstall]$ ps ux | grep gaussdb +omm 7805 2.2 2.8 6267816 922936 ? Ssl 16:39 0:04 /opt/software/openGauss/bin/gaussdb -D /opt/software/openGauss/data/single_node +omm 8180 0.0 0.0 110480 908 pts/0 S+ 16:42 0:00 grep --color=auto gaussdb +[omm@worker1 simpleInstall]$ + +``` + +![image](image/openGauss/pic16.png) + + +ps ux | grep gaussdb +gs_ctl query -D /opt/software/openGauss/data/single_node + +### 5.1 执行ps命令,显示类似如下信息: + +omm 24209 11.9 1.0 1852000 355816 pts/0 Sl 01:54 0:33 /opt/software/openGauss/bin/gaussdb -D /opt/software/openGauss/single_node +omm 20377 0.0 0.0 119880 1216 pts/0 S+ 15:37 0:00 grep --color=auto gaussdb + +### 5.2 执行gs_ctl命令,显示类似如下信息: + + +``` +[2024-05-17 16:43:24.482][8256][][gs_ctl]: gs_ctl query ,datadir is /opt/software/openGauss/data/single_node + HA state: + local_role : Normal + static_connections : 0 + db_state : Normal + detail_information : Normal + + Senders info: +No information + Receiver info: +No information +[omm@worker1 simpleInstall]$ +``` + +![image](image/openGauss/pic17.png) + + +# 五、数据库的增删改查 + + +## 1、连接本地连接数据库 + +``` +[omm@worker1 single_node]$ gsql -d postgres -p 5432 -C +gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr ) +Non-SSL connection (SSL connection is recommended when requiring high-security) +Type "help" for help. + +openGauss=# +``` + +![image](image/openGauss/pic18.png) + +登录端口可以查看 postgresql.conf文件 + +``` +[omm@worker1 single_node]$ cat postgresql.conf |grep port +port = 5432 # (change requires restart) +#ssl_renegotiation_limit = 0 # amount of data between renegotiations, no longer supported + # supported by the operating system: + +``` + + +![image](image/openGauss/pic19.png) + + +## 2、创建数据库 + +数据库安装完成后,默认生成名称为postgres的数据库。您需要自己创建一个新的数据库。 + +``` +openGauss=# CREATE DATABASE database_openGauss; +CREATE DATABASE +openGauss=# +``` + +![image](image/openGauss/pic20.png) + + +## 3、查看数据库 + + +### 3.1 使用“\l”用于查看已经存在的数据库。 + + +\l + +``` +openGauss=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +--------------------+-------+----------+-------------+-------------+------------------- + database_opengauss | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + finance | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + postgres | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + school | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + template0 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm + template1 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm +(6 rows) + +openGauss=# +``` + + +![image](image/openGauss/pic21.png) + + +### 3.2 使用 “\c + 数据库名” 进入已存在数据库。 + +\c dbname + +``` +openGauss=# +openGauss=# \c database_opengauss +Non-SSL connection (SSL connection is recommended when requiring high-security) +You are now connected to database "database_opengauss" as user "omm". +database_opengauss=# +``` + +![image](image/openGauss/pic22.png) + +## 4、修改数据库 + +ALTER DATABASE database_opengauss RENAME TO new_name666; + +``` +openGauss=# ALTER DATABASE database_opengauss RENAME TO new_name666; +ALTER DATABASE +openGauss=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-------------+-------+----------+-------------+-------------+------------------- + finance | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + new_name666 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + postgres | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + school | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + template0 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm + template1 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm +(6 rows) + +openGauss=# + +``` + +![image](image/openGauss/pic23.png) + + +## 5、删除数据库 + + +``` +openGauss=# +openGauss=# DROP DATABASE new_name666 ; +DROP DATABASE +openGauss=# \l + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-----------+-------+----------+-------------+-------------+------------------- + finance | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + postgres | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + school | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | + template0 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm + template1 | omm | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/omm + + | | | | | omm=CTc/omm +(5 rows) + +openGauss=# +``` + + +# 总结 + + +openGauss 6.0.0版本在安装和使用方面都带来了很大的改进和优化。一站式交互安装功能极大地简化了安装流程,降低了用户的学习成本;性能优化和中文日志支持功能则进一步提升了数据库的稳定性和易用性。通过实际测试,我认为openGauss 6.0.0版本是一款非常优秀的国产数据库产品,值得广大用户尝试和使用。 + + +最后,我要感谢openGauss社区举办的第七届openGauss技术文章征集活动,让我有机会分享我的使用体验。同时,我也期待openGauss在未来能够继续推出更多优秀的版本和功能,为国产数据库的发展做出更大的贡献。 + + diff --git "a/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221\344\270\200\347\253\231\345\274\217\345\256\211\350\243\205openGauss 6.0.0\344\274\201\344\270\232\347\211\210.md" "b/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221\344\270\200\347\253\231\345\274\217\345\256\211\350\243\205openGauss 6.0.0\344\274\201\344\270\232\347\211\210.md" new file mode 100644 index 0000000000000000000000000000000000000000..354184df11325f34c75be377227c938dd1ec2caa --- /dev/null +++ "b/app/zh/blogs/shunwah/\343\200\220\347\254\254\344\270\203\345\261\212openGauss\346\212\200\346\234\257\346\226\207\347\253\240\345\276\201\351\233\206\343\200\221\344\270\200\347\253\231\345\274\217\345\256\211\350\243\205openGauss 6.0.0\344\274\201\344\270\232\347\211\210.md" @@ -0,0 +1,916 @@ +--- +title: '【第七届openGauss技术文章征集】一站式安装openGauss 6.0.0企业版' + +date: '2024-05-31' + +tags: ['openGauss', '版本安装', '技术文章征集'] + +archives: '2024-05' +category: 'blog' +author: 'shunwah' + +summary: '【第七届openGauss技术文章征集】一站式安装openGauss 6.0.0企业版' +--- + + + +从事运维管理工作多年,目前就职于某科技有限公司,熟悉运维自动化、OceanBase部署运维、MySQL 运维以及各种云平台技术和产品。并已获得OceanBase认证OBCA、OBCP 证书、OpenGauss社区认证结业证书、崖山DBCA证书、亚信AntDBCA证书、翰高HDCA认证、GBase 8a|GBase 8c 证书。OceanBase & 墨天轮第二、三、四届技术征文大赛,多次获得 一、二、三 等奖,在openGauss 第五届、第六届技术征文大赛中多次获奖。时常在墨天轮发布原创技术文章,并多次被首页推荐。 + +![image](image/openGauss2/pic1.png) + + +# 前言 + +一站式交互安装功能:openGauss 6.0.0版本在安装方面进行了重大改进,推出了全新的一站式交互安装功能。这一功能极大地简化了安装流程,降低了用户的学习成本。用户只需通过交互界面输入数据库的相关信息,系统便会自动生成xml配置文件,并自动进行数据库的初始化安装。 + +
+ +# 一、安装准备 + +
+ +本章详细介绍了安装openGauss的环境准备和配置,请在安装之前仔细阅读本章的内容。如果已完成本章节的配置,请进入“安装openGauss”章节。 + + +**企业版安装** + +企业版安装的主要使用主体为企业或对数据库性能要求较高的个人,安装流程比较复杂,功能更全。 + +**安装准备** + +本章详细介绍了安装openGauss的环境准备和配置,请在安装之前仔细阅读本章的内容。如果已完成本章节的配置,请进入“安装openGauss”章节。 + +**了解安装流程** + +本章节通过流程图简要介绍openGauss的安装流程。 + +**获取安装包** + +openGauss开源社区上提供了安装包的获取方式。 + +**准备软硬件安装环境** + + +本章节描述安装前需要进行的环境准备。 + +**了解安装用户及用户组** + + +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性,安装脚本在安装过程中会自动按照用户指定内容创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + + +# 二、获取安装包 + + +openGauss开源社区上提供了安装包的获取方式。 + + +## 1、从openGauss开源社区下载对应平台的安装包。 + + +**a.通过 登录openGauss开源社区,选择对应平台的企业版安装包。** + +``` +https://opengauss.org/zh/download/ +``` + +![image](image/openGauss2/pic2.png) + + +**b.单击“立即下载”。** + + +![image](image/openGauss2/pic3.png) + + + +## 2、检查安装包。 + + +``` +[root@worker1 soft]# ls +openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +[root@worker1 soft]# +``` + + +![image](image/openGauss2/pic4.png) + + +## 3、解压安装包 + +检查安装目录及文件是否齐全。在安装包所在目录执行以下命令: + +tar -zxvf openGauss-x.x.x-openEuler-64bit-all.tar.gz + + +``` +[root@worker1 soft]# tar -zxvf openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz +openGauss-6.0.0-RC1-CentOS-64bit-cm.tar.gz +openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +openGauss-6.0.0-RC1-CentOS-64bit-cm.sha256 +openGauss-6.0.0-RC1-CentOS-64bit-om.sha256 +openGauss-6.0.0-RC1-CentOS-64bit.sha256 +upgrade_sql.tar.gz +upgrade_sql.sha256 +[root@worker1 soft]# +``` + +![image](image/openGauss2/pic5.png) + + +## 4、执行ls命令,显示类似如下信息: + + +ls -lb + + +``` +[root@worker1 soft]# ls -lb +total 293248 +-rw-r--r-- 1 root root 149449208 May 29 13:55 openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz +-rw-r--r-- 1 root root 109 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.sha256 +-rw-r--r-- 1 root root 22466710 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit-cm.tar.gz +-rw-r--r-- 1 root root 65 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.sha256 +-rw-r--r-- 1 root root 23122340 Mar 31 12:15 openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +-rw-r--r-- 1 root root 65 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.sha256 +-rw-r--r-- 1 root root 104672194 Mar 31 12:16 openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 +-rw------- 1 root root 65 Mar 31 12:14 upgrade_sql.sha256 +-rw------- 1 root root 541779 Mar 31 12:14 upgrade_sql.tar.gz +[root@worker1 soft]# +``` + + +![image](image/openGauss2/pic6.png) + + +继续解压OM安装包,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs_preinstall等各种OM工具脚本。 + +tar -zxvf openGauss-x.x.x-openEuler-64bit-om.tar.gz + + +``` +[root@worker1 opt]# tar -zxvf openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +``` + + +![image](image/openGauss2/pic7.png) + + +## 5、修改安装包目录权限 + +``` +[root@worker1 ~]# +[root@worker1 ~]# chmod 755 -R /opt/software +[root@worker1 ~]# +``` + + + +![image](image/openGauss2/pic8.png) + + +# 三、准备软硬件安装环境 + +本章节描述安装前需要进行的环境准备。 + +介绍openGauss的软硬件环境要求。建议部署openGauss的各服务器具有等价的软硬件配置。 + +**1、内存:功能调试建议32GB以上。** + +性能测试和商业部署时,单实例部署建议128GB以上。 + +复杂的查询对内存的需求量比较高,在高并发场景下,可能出现内存不足。此时建议使用大内存的机器,或使用负载管理限制系统的并发。 + +**2、CPU:功能调试最小1×8核,2.0GHz。** + +性能测试和商业部署时,单实例部署建议1×16核,2.0GHz。 + +CPU超线程和非超线程两种模式都支持。 + +目前,openGauss仅支持ARM服务器和基于x86_64通用PC服务器的CPU。 + +**3、硬盘** + +用于安装openGauss的硬盘需最少满足如下要求: + +至少1GB用于安装openGauss的应用程序。 + +每个主机需大约300MB用于元数据存储。 + +预留70%以上的磁盘剩余空间用于数据存储。 + +建议系统盘配置为RAID1,数据盘配置为RAID5,且规划4组RAID5数据盘用于安装openGauss。有关RAID的配置方法在本手册中不做介绍。请参考硬件厂家的手册或互联网上的方法进行配置,其中Disk Cache Policy一项需要设置为Disabled,否则机器异常掉电后有数据丢失的风险。 + +openGauss支持使用SSD盘作为数据库的主存储设备,支持SAS接口和NVME协议的SSD盘,以RAID的方式部署使用。 + +**4、软件环境要求** + +ARM: + +openEuler 20.03LTS(推荐采用此操作系统) + +openEuler 22.03LTS + +麒麟V10 + +Asianux 7.5 + +x86: + +openEuler 20.03LTS + +openEuler 22.03LTS + +CentOS 7.6 + +Asianux 7.6 + +说明: + +1、当前安装包只能在英文操作系统上安装使用; + +2、OM工具已经支持对基于openEuler/Centos等商业操作系统的安装使用,具体配置信息可以查看OM中的osid.conf文件。 + +openEuler:支持>=Python 3.6.X且<=Python 3.10.X + +CentOS:支持>=Python 3.6.X且<=Python 3.10.X + +麒麟:支持Python 3.7.X + +Asianux:支持Python 3.6.X + +说明: + +python需要通过–enable-shared方式编译。 + +在CentOS 7上安装Python 3,可以按照以下步骤进行: + + +**5、安装Python 3.X** + + +5.1. 检查当前Python版本 + + +首先,检查CentOS 7是否自带Python环境以及版本信息,可以使用以下命令: + +``` +[root@worker1 soft]# python --version +Python 2.7.5 +[root@worker1 soft]# +``` + +![image](image/openGauss2/pic9.png) + + +CentOS 7一般默认安装的是Python 2.x版本。 + +5.2. 安装Python 3依赖包 + + +在编译安装Python 3之前,需要安装一些依赖包。这些依赖包包括各种开发库和工具,例如zlib、bzip2、openssl等。可以使用yum命令来安装这些依赖包: + + +``` +[root@worker1 soft]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc libffi-devel +``` + +![image](image/openGauss2/pic10.png) + +5.3. 下载Python 3源码包 + +访问Python官方网站(https://www.python.org/downloads/source/)下载所需的Python 3版本的源码包,如Python 3.11.x。 + + +![image](image/openGauss2/pic11.png) + + +5.4. 上传或下载源码包到CentOS 7 + +如果已经在本地下载了源码包,可以使用scp命令或WinSCP等工具将源码包上传到CentOS 7服务器上。或者,你也可以直接在CentOS 7上使用wget命令下载源码包。 + +5.5. 解压源码包 + +使用tar命令解压下载的源码包: + +``` +[root@worker1 soft]# tar -zxf Python-3.10.14.tgz +[root@worker1 soft]# cd Python-3.10.14/ +[root@worker1 Python-3.10.14]# +``` + + +![image](image/openGauss2/pic12.png) + + +5.6. 编译和安装Python 3 + +进入解压后的目录,并执行configure脚本进行配置,然后编译和安装Python 3。 + + +``` +[root@worker1 soft]# cd Python-3.10.14/ +[root@worker1 Python-3.10.14]# ./configure --prefix=/usr/local/python3 --enable-shared --enable-optimizations + ``` + +![image](image/openGauss2/pic13.png) + +![image](image/openGauss2/pic14.png) + + +``` +[root@worker1 Python-3.10.4]# make +[root@worker1 Python-3.10.4]#make install +``` + + + + + +![image](image/openGauss2/pic15.png) + + +其中,–prefix参数指定了Python 3的安装目录,/usr/local/python3是一个常见的选择。–enable-shared选项确保Python 3以共享库的形式安装。–enable-optimizations是可选的,用于启用编译优化。 + +5.7. 配置环境变量(可选) + + +如果安装目录不在系统的默认路径中,需要配置PATH环境变量以包含Python 3的bin目录。 + +``` + +[root@worker1 Python-3.10.14]# +[root@worker1 Python-3.10.14]# echo 'export PATH=/usr/local/python3/bin:$PATH' >> ~/.bash_profile +[root@worker1 Python-3.10.14]# source ~/.bash_profile +[root@worker1 Python-3.10.14]# +``` + +![image](image/openGauss2/pic16.png) + +或者,对于bash shell,也可以将上述export语句添加到~/.bashrc文件中。 + +5.8. 验证安装 + + +安装完成后,使用以下命令验证Python 3是否安装成功: + + +![image](image/openGauss2/pic17.png) + +``` +[root@worker1 Python-3.10.14]# +[root@worker1 Python-3.10.14]# python3 --version +Python 3.10.14 +[root@worker1 Python-3.10.14]# +``` + +如果输出显示了Python 3的版本号,则表示安装成功。 + +以上步骤涵盖了CentOS 7上安装Python 3的基本流程。需要注意的是,具体的安装步骤和命令可能会因Python版本和系统环境的不同而略有差异。 +软件依赖要求 +openGauss的软件依赖要求如表3所示。 + +建议使用上述操作系统安装光盘或者源中,下列依赖软件的默认安装包,若不存在下列软件,可参看软件对应的建议版本。 + + +**6、软件依赖要求** + +所需软件、建议版本 + +libaio-devel + +建议版本:0.3.109-13 + +readline-devel + +建议版本:7.0-13 + +libnsl(openEuler+x86环境中) + +建议版本:2.28-36 + +修改操作系统配置 参考极简版设置 +注意: + +以下动作需要以root用户进行操作,操作完成后请及时注销root用户,避免误操作。 + + +``` +[root@worker1 script]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc libffi-devel +``` + + +7、系统初始化设置,参考上一篇文章: + +【第七届openGauss技术文章征集】openGauss 6.0.0新版本安装测评: + +# 四、配置安装用户及用户组 + +为了实现安装过程中安装帐户权限最小化,及安装后openGauss的系统运行安全性,安装脚本在安装过程中会自动按照用户指定内容创建安装用户,并将此用户作为后续运行和维护openGauss的管理员帐户。 + +建议规划单独的用户组,例如dbgrp。 + +初始化安装环境时,由-G参数所指定的安装用户所属的用户组。该用户组如果不存在,则会自动创建,也可提前创建好用户组。在执行gs_preinstall脚本时会检查权限。gs_preinstall脚本会自动赋予此组中的用户对安装目录、数据目录的访问和执行权限。 + +## 1、创建dbgrp用户组命令: + +``` +[root@worker1 soft]# groupadd dbgrp +[root@worker1 soft]# +``` + +![image](image/openGauss2/pic18.png) + + +建议规划用户用于运行和维护openGauss,例如omm。 + +初始化安装环境时,由-U参数所指定和自动创建的操作系统用户,如果已经存在该用户,请清理该用户或更换初始化用户。从安全性考虑,对此用户的所属组规划如下: + + +## 2、创建用户 omm 所属组:dbgrp + +``` +[root@worker1 soft]# useradd -g dbgrp omm +[root@worker1 soft]# passwd omm +Changing password for user omm. +New password: +Retype new password: +passwd: all authentication tokens updated successfully. +[root@worker1 soft]# +``` + +![image](image/openGauss2/pic19.png) + + +在安装openGauss过程中运行“gs_preinstall”时,会创建与安装用户同名的数据库用户,即数据库用户omm。此用户具备数据库的最高操作权限,此用户初始密码由用户指定。 + +# 五、一站式安装openGauss + + +创建XML配置文件 + +安装openGauss前需要创建cluster_config.xml文件。cluster_config.xml文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场景配置对应的XML文件。 + +**初始化安装环境** + +为了保证openGauss的正确安装,请首先对主机环境进行配置。 + +**执行安装** + +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 + +**安装验证** + +**安装openGauss** + +1、一站式安装指南 + +本章详细介绍openGauss的一站式安装,通过交互式方便用户快速配置xml文件,大大减少用户安装数据库的时间。 如果使用一站式安装,那么就可以直接跳过创建xml配置文件和初始化安装。 + + +``` +[root@worker1 soft]# ls +lib openGauss-6.0.0-RC1-CentOS-64bit-cm.tar.gz openGauss-6.0.0-RC1-CentOS-64bit.sha256 upgrade_sql.sha256 +openGauss-6.0.0-RC1-CentOS-64bit-all.tar.gz openGauss-6.0.0-RC1-CentOS-64bit-om.sha256 openGauss-6.0.0-RC1-CentOS-64bit.tar.bz2 upgrade_sql.tar.gz +openGauss-6.0.0-RC1-CentOS-64bit-cm.sha256 openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz script version.cfg +[root@worker1 soft]# tar -zxvf openGauss-6.0.0-RC1-CentOS-64bit-om.tar.gz +``` + +![image](image/openGauss2/pic20.png) + +如果使用中文界面来安装,需要检查当前本地字符集是否支持中文(如:zh_CN.UTF-8) + +**操作步骤** + +使用root或普通用户,下载软件包并解压,到script目录下,执行 +./gs_preinstall -U omm -G dbgroup --one-stop-install --sep-env-file=ENVFILE + +报错,没有安装Python3 +解决办法,安装Python3 + +**再次执行** + +``` +[root@worker1 script]# ls +base_diff gs_backup gs_collector gs_install gs_preinstall gs_sshexkey impl osid.conf ssh ssh-keygen +base_utils gs_check gs_ddr gs_om gspylib gs_uninstall __init__.py os_platform ssh-add transfer.py +config gs_checkos gs_dropnode gs_perfconfig gs_sdr gs_upgradechk killall py_pstree.py ssh-agent upgrade_checker +domain_utils gs_checkperf gs_expansion gs_postuninstall gs_ssh gs_upgradectl local scp ssh-copy-id +[root@worker1 script]# ./gs_preinstall -U omm -G dbgroup --one-stop-install --sep-env-file=ENVFILE +``` + +![image](image/openGauss2/pic21.png) + + +其中–sep-env-file是环境分离时使用,如果不使用环境分离,可以去掉该参数。 + +执行后,首先程序会根据本地的默认字符集,程序根据配置的语言设置会显示对应语言的导航栏,用户在导航栏选择使用哪种语言来进行下面的安装(支持:中文,英文) +可以通过如下命令来查看本地操作系统的语言设置: + +echo $LANG + +如果系统显示值包含"en_US",则导航栏为英文 + +``` +[root@worker1 script]# ./gs_preinstall -U omm -G dbgroup --one-stop-install --sep-env-file=ENVFILE +Please choose whether to generate an XML file with one click navigation in English or Chinese? +>> 1) chinese + 2) english +------------------------------- +Please enter 1/2 for selection, the default option is 1) Chinese: +``` + + +![image](image/openGauss2/pic22.png) + + +如果系统显示值包含"zh_CN",则为中文语言,导航栏会显示中文内容。否则,您可以执行如下命令修改语言设置为中文: + + +``` +[root@worker1 script]# echo $LANG +en_US.UTF-8 +[root@worker1 script]# export LANG=zh_CN.UTF-8 +[root@worker1 script]# echo $LANG +zh_CN.UTF-8 +[root@worker1 script]# +``` + +![image](image/openGauss2/pic23.png) + + +请选择是英文还是中文导航一键式生成xml文件? + +``` +[root@worker1 script]# ./gs_preinstall -U omm -G dbgrp --one-stop-install --sep-env-file=ENVFILE +请选择是英文还是中文导航一键式生成xml文件? +>> 1) 中文 + 2) 英文 +------------------------------- +请输入1/2进行选择,默认选项为1)中文: +``` + +![image](image/openGauss2/pic24.png) + + +请输入xml的路径和文件名(默认:./cluster.xml) +用户输入的xml文件路径如果存在,会对判断该输入是否有非法字符,是否是文件,当前用户是否有权限;如果输入xml文件路径不存在,那么不会判断;默认生成的cluster.xml文件默认会在解压包路径下script/base_utils/template/cluster.xml。 + +请输入数据库安装目录(默认:/opt/openGauss/install) +用户输入的数据库安装目录如果存在,会判断该目录是否有非法字符,是否是一个空目录,当前用户是否有权限操作;如果目录不存在,那么不会判断。 + +请输入数据库端口(默认:15000) +数据库端口在1024-65535之间,并且输入必须是数字。 + +请选择是否主备部署 +用户可以选在主备部署或单机部署,如果单机部署默认会将本地ip和hostname写入xml中,后面的流程跳过;如果主备部署继续后面的流程。 + +请选择是否部署资源池化 +用户选择部署或不部署资源池化,如果部署,默认会部署CM;如果不部署,继续后面的流程 + +请选择是否部署CM +用户选择部署CM或不部署CM + +请输入cmserver端口(默认:15400) +用户输入的端口在1024-65535之间,必须是数字,不能和上面配置的数据库的端口重复,并且cm端口和数据库端口距离至少间隔10。 + +请输入节点数量,最多支持一主八备,即9个节点(默认是一主两备,3个节点) +用户输入节点数量在1-9之间,必须是数字 + +请输入主机节点IP和节点名称(如:192.168.0.1 hostname1;192.168.0.2 hostname2) +用户输入的节点ip和名称,首先数量必须一致,ip和hostname之间用空格分隔,每一组ip hostname之间用分号分隔;其次输入的ip不能重复。 + +生成的xml路径是: /xxx/script/base_utils/template/cluster.xml +默认生成的xml路径在script/base_utils/template/cluster.xml + +xml的内容 + +``` +------------------------------- +请输入1/2进行选择,默认选项为1)中文:1 +请输入xml的路径和文件名(默认:./cluster.xml): +请输入数据库安装目录(默认:/opt/openGauss/install): +请输入数据库端口(默认:15000): +请选择是否主备部署? +>> 1) 主备部署 + 2) 单机部署 +------------------------------- +请输入 1/2 进行选择,默认选项是 1)主备部署2 +输入完成 +生成的xml路径是: /soft/script/base_utils/template/cluster.xml +xml内容是: + + + + + + + + + + + + + + + + + + + + + + + + + + + +请确认xml的内容是否正确,正确输入yes;如需修改xml内容请自行修改,然后输入yes确认yes +``` + + +![image](image/openGauss2/pic25.png) + +``` +请确认xml的内容是否正确,正确输入yes;如需修改xml内容请自行修改,然后输入yes确认yes +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Setting host ip env +Successfully set host ip env. +Are you sure you want to create the user[omm] (yes/no)? yes +[GAUSS-50305] : The user is not matched with the user group. + +[root@worker1 script]# +``` + + +![image](image/openGauss2/pic26.png) + + +# 六、执行安装 + +执行前置脚本准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 +检查安装包和openGauss配置文件在规划路径下是否已存在,如果没有,重新执行预安装,确保预安装成功,再执行以下步骤。 + +使用gs_preinstall准备好安装环境。若为共用环境需加入–sep-env-file=ENVFILE参数分离环境变量,避免与其他用户相互影响,ENVFILE为用户自行指定的环境变量分离文件的路径,可以为一个空文件。 + +## 1、用户互信 + +采用交互模式执行前置,并在执行过程中自动创建操作系统root用户互信和omm用户互信: +./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/cluster_config.xml [–sep-env-file=ENVFILE] + +omm为数据库管理员(也是运行openGauss的操作系统用户),dbgrp为运行openGauss的操作系统用户的群组名称,/opt/software/openGauss/cluster_config.xml为openGauss配置文件路径。在执行过程中,用户根据提示选择是否创建互信,并输入操作系统root用户或omm用户的密码。 + + +``` +[root@worker1 script]# ./gs_preinstall -U omm -G dbgrp -X /soft/script/base_utils/template/cluster.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Setting host ip env +Successfully set host ip env. +Are you sure you want to create the user[omm] (yes/no)? yes +Preparing SSH service. +Successfully prepared SSH service. +Checking OS software. +Successfully check OS software. +Checking OS version. +Successfully checked OS version. +Checking cpu instructions. +Successfully checked cpu instructions. +``` + +![image](image/openGauss2/pic27.png) + + +## 2、检查健康状态 + + +检查服务器的OS参数的目的是为了保证数据库正常通过预安装,并且在安装成功后可以安全高效的运行。详细的检查项目请参见《工具与命令参考》中的“服务端工具 > gs_checkos”工具的“表1 操作系统检查项”。 + +``` +[root@worker1 script]# /soft/script/gs_checkos -i A -h worker1 -X /soft/script/base_utils/template/cluster.xml --detail +Checking items: + A1. [ OS version status ] : Normal + [worker1] + centos_7.4.1708_64bit + + A2. [ Kernel version status ] : Normal + The names about all kernel versions are same. The value is "3.10.0-693.el7.x86_64". + A3. [ Unicode status ] : Normal + The values of all unicode are same. The value is "LANG=en_US.UTF-8". + A4. [ Time zone status ] : Normal + The informations about all timezones are same. The value is "+0800". + A5. [ Swap memory status ] : Normal + The value about swap memory is correct. + A6. [ System control parameters status ] : Warning + [worker1] + Warning reason: variable 'net.ipv4.tcp_retries1' RealValue '3' ExpectedValue '5'. + Warning reason: variable 'net.ipv4.tcp_syn_retries' RealValue '6' ExpectedValue '5'. + Check_SysCtl_Parameter warning. + + A7. [ File system configuration status ] : Warning + [worker1] + Warning reason: variable 'max user processes' RealValue '32000' ExpectedValue 'unlimited' + + A8. [ Disk configuration status ] : Normal + The value about XFS mount parameters is correct. + A9. [ Pre-read block size status ] : Normal + The value about Pre-read block size is correct. + A10.[ IO scheduler status ] : Normal + The value of IO scheduler is correct. + A11.[ Network card configuration status ] : Warning + [worker1] +BondMode Null + Warning reason: network 'ens192' 'mtu' RealValue '1500' ExpectedValue '8192' + + A12.[ Time consistency status ] : Warning + [worker1] + The NTPD not detected on machine and local time is "2024-05-31 16:07:24". + + A13.[ Firewall service status ] : Normal + The firewall service is stopped. + A14.[ THP service status ] : Normal + The THP service is stopped. +Total numbers:14. Abnormal numbers:0. Warning numbers:4. +[root@worker1 script]# + +``` + + +![image](image/openGauss2/pic28.png) + +omm用户需要拥有安装包所在目录及子目录的权限。 + + +## 3、登录到openGauss的主机,并切换到omm用户。 + +``` +[root@worker1 script]# su - omm +上一次登录:三 5月 29 23:02:41 CST 2024pts/0 上 +[omm@worker1 ~]$ +``` + + +![image](image/openGauss2/pic29.png) + + +说明: + +omm指的是前置脚本gs_preinstall中-U参数指定的用户。 + +安装脚本gs_install必须以前置脚本中指定的omm执行,否则,脚本执行会报错。 + +openGauss在海思高版本芯片上编译的不能在海思低版本芯片的服务器上运行,比如Hi620编译的版本不能在Hi1616环境上运行。 + +使用gs_install安装openGauss。若为环境变量分离的模式安装的数据库需要source环境变量分离文件ENVFILE。 + +source ENVFILE(若为环境变量分离的模式) +gs_install -X /opt/software/openGauss/cluster_config.xml + + +``` +[omm@worker1 script]$ ls +base_diff gs_backup gs_collector gs_install gs_preinstall gs_sshexkey impl osid.conf ssh ssh-keygen +base_utils gs_check gs_ddr gs_om gspylib gs_uninstall __init__.py os_platform ssh-add transfer.py +config gs_checkos gs_dropnode gs_perfconfig gs_sdr gs_upgradechk killall py_pstree.py ssh-agent upgrade_checker +domain_utils gs_checkperf gs_expansion gs_postuninstall gs_ssh gs_upgradectl local scp ssh-copy-id +[omm@worker1 script]$ ./gs_install -X /soft/script/base_utils/template/cluster.xml +``` + + +/opt/software/openGauss/cluster_config.xml为openGauss配置文件的路径。在执行过程中,用户需根据提示输入数据库的密码,密码具有一定的复杂度,为保证用户正常使用该数据库,请记住输入的数据库密码。 + +安装过程中会生成ssl证书,证书存放路径为{gaussdbAppPath}/share/sslcert/om,其中{gaussdbAppPath}为openGauss配置文件中指定的程序安装目录。 + +日志文件路径下会生成两个日志文件:“gs_install-YYYY-MMDD_HHMMSS.log”和“gs_local-YYYY-MM-DD_HHMMSS.log”。 + +说明: +openGauss支持字符集的多种写法:gbk/GBK、UTF-8/UTF8/utf8/utf-8和Latine1/latine1。 + +安装时若不指定字符集,默认字符集为SQL_ASCII,为简化和统一区域loacle默认设置为C,若想指定其他字符集和区域,请在安装时使用参数–gsinit-parameter="–locale=LOCALE"来指定,LOCALE为新数据库设置缺省的区域。 + +**4、用户要将数据库编码格式初始化为UTF-8** + +用locale -a |grep utf8命令查看系统支持UTF-8编码的区域,如下: + +[omm@worker1 script]$ ~> locale -a|grep utf8 +显示类似如下信息,其中en_US.utf8表示区域en_US支持UTF-8编码。 + +``` +en_SG.utf8 +en_US.utf8 +``` + +![image](image/openGauss2/pic30.png) + +根据需要选择区域,如en_US.utf8,初始化数据库时加入–locale=en_US.utf8选项进行安装,示例如下: + +``` +[omm@worker1 script]$ ./gs_install -X /soft/script/base_utils/template/cluster.xml --gsinit-parameter="--locale=en_US.utf8" + +``` + +安装执行成功之后,需要手动删除主机root用户的互信,即删除openGauss数据库各节点上的互信文件。 + +rm –rf ~/.ssh + +## 5、执行安装: + + +``` +[omm@worker1 script]$ source ENVFILE +[omm@worker1 script]$ ./gs_install -X /soft/script/base_utils/template/cluster.xml +Parsing the configuration file. +Successfully checked gs_uninstall on every node. +Check preinstall on every node. +Successfully checked preinstall on every node. +Creating the backup directory. +Successfully created the backup directory. +begin deploy.. +Installing the cluster. +begin prepare Install Cluster.. +Checking the installation environment on all nodes. +begin install Cluster.. +Installing applications on all nodes. +Successfully installed APP. +begin init Instance.. +encrypt cipher and rand files for database. +Please enter password for database: +Please repeat for database: +begin to create CA cert files +The sslcert will be generated in /opt/openGauss/install/app/share/sslcert/om +NO cm_server instance, no need to create CA for CM. +Non-dss_ssl_enable, no need to create CA for DSS +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Successfully deleted instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Check consistence of memCheck and coresCheck on database nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +The cluster status is Normal. +Successfully started cluster. +Successfully installed application. +end deploy.. +[omm@worker1 script]$ +``` + +![image](image/openGauss2/pic31.png) + +## 6、安装验证 + +通过openGauss提供的gs_om工具可以完成数据库状态检查。 +以omm用户身份登录服务器。 + +执行如下命令检查数据库状态是否正常,“cluster_state ”显示“Normal”表示数据库可正常使用。 + +``` +[omm@worker1 script]$ +[omm@worker1 script]$ gs_om -t status +----------------------------------------------------------------------- + +cluster_name : Cluster_template +cluster_state : Normal +redistributing : No + +----------------------------------------------------------------------- +[omm@worker1 script]$ +``` + + + +![image](image/openGauss2/pic32.png) + + +数据库安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。 + + +其中postgres为需要连接的数据库名称,15400为数据库主节点的端口号,即XML配置文件中的dataPortBase的值。请根据实际情况替换。 + +``` +[omm@worker1 script]$ +[omm@worker1 script]$ gsql -d postgres -p 15000 +gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr ) +Non-SSL connection (SSL connection is recommended when requiring high-security) +Type "help" for help. + +openGauss=# +``` + +![image](image/openGauss2/pic33.png) + + + +# 总结 + +openGauss 6.0.0企业版在安装和使用方面都带来了显著的改进。一站式交互安装功能简化了安装流程,解除了对root用户的依赖提高了安全性;在性能方面,特别是主备复制和分区表操作方面有了显著的提升;中文日志支持功能也提高了用户的使用体验。这些改进使得openGauss 6.0.0企业版更加易于使用、安全可靠,并能够满足大多数业务场景的需求。 diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic1.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0b7a66e265af48520208a9c12e9c10daf975ca7 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic10.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic10.png" new file mode 100644 index 0000000000000000000000000000000000000000..b8629a09501acccf3915bed769ba540b3fcf1c50 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic10.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic11.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic11.png" new file mode 100644 index 0000000000000000000000000000000000000000..847e6a0de8de29f43047e739f56ba7e639c3423f Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic11.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic12.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic12.png" new file mode 100644 index 0000000000000000000000000000000000000000..1db393abfa7fd1150a503be8d5197250ec3a10ee Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic12.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic2.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic2.png" new file mode 100644 index 0000000000000000000000000000000000000000..2bb027de9b3cdbdf47a2763545a2af1850aed0b0 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic2.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic3.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic3.png" new file mode 100644 index 0000000000000000000000000000000000000000..ffb44003a22e58d1da30f5705d6e711782a5b52a Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic3.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic4.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic4.png" new file mode 100644 index 0000000000000000000000000000000000000000..81e6eb2a1e007d2622a9fd618faf197894513449 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic4.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic5.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic5.png" new file mode 100644 index 0000000000000000000000000000000000000000..6cc7fca336a1b4d8666254e1e534f05d9ef3faab Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic5.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic6.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic6.png" new file mode 100644 index 0000000000000000000000000000000000000000..b1a2533835c53c8e7ecc1fe9fe482f9a1c8f1999 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic6.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic7.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic7.png" new file mode 100644 index 0000000000000000000000000000000000000000..28a324cdfea34392c97cbaaf5d7f067b1d465304 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic7.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic8.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic8.png" new file mode 100644 index 0000000000000000000000000000000000000000..8c7f1ed7e28d27fcf89394e9aa904efa3c8c3df9 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic8.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic9.png" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic9.png" new file mode 100644 index 0000000000000000000000000000000000000000..b51433dc6e3a9822c65fc11e98c7595fa837a395 Binary files /dev/null and "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/images/openGauss/pic9.png" differ diff --git "a/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/\345\216\237\346\235\245openGauss\345\217\257\344\273\245\350\277\231\346\240\267\347\273\264\346\212\244.md" "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/\345\216\237\346\235\245openGauss\345\217\257\344\273\245\350\277\231\346\240\267\347\273\264\346\212\244.md" new file mode 100644 index 0000000000000000000000000000000000000000..9e2f13fc13a0e46597a3c24544e8344767ebf9d0 --- /dev/null +++ "b/app/zh/blogs/\344\272\214\344\270\244\347\203\247\351\272\246/\345\216\237\346\235\245openGauss\345\217\257\344\273\245\350\277\231\346\240\267\347\273\264\346\212\244.md" @@ -0,0 +1,226 @@ +--- +title: '原来openGauss可以这样维护' + +date: '2024-05-30' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '二两烧麦' + +summary: '原来openGauss可以这样维护' +--- + +# 目录 + +1、检查openGauss状态 + +2、检查锁信息 + +3、统计事件数据 + +4、对象检查 + +5、基本信息检查 + + +## 1、检查openGauss状态 + +
+ + +通过openGauss提供的工具查询数据库和实例状态,确认数据库和实例都处于正常的运行状态,可以对外提供数据服务。 + + +- 检查实例状态 + +``` +gs_check -U omm -i CheckClusterState +``` + +![image](images/openGauss/pic1.png) + + +- 检查参数 + +``` +openGauss=# SHOW parameter_name; +``` + + +上述命令中,parameter_name需替换成具体的参数名称。 + + +- 修改参数 + +``` +gs_guc reload -D /gaussdb/data/dbnode -c "paraname=value" +``` + +## 2、检查锁信息 + + +锁机制是数据库保证数据一致性的重要手段,检查相关信息可以检查数据库的事务和运行状况。 + +- 查询数据库中的锁信息 + +``` +openGauss=# SELECT * FROM pg_locks; +``` + +![image](images/openGauss/pic2.png) + + +- 查询等待锁的线程状态信息 + +``` +openGauss=# SELECT * FROM pg_thread_wait_status WHERE wait_status = 'acquire lock'; +``` + +![image](images/openGauss/pic3.png) + + +- 结束系统进程 + +查找正在运行的系统进程,然后使用kill命令结束此进程。 + + +``` +ps ux +kill -9 pid +``` + + +## 3、统计事件数据 + +SQL语句长时间运行会占用大量系统资源,用户可以通过查看事件发生的时间,占用内存大小来了解现在数据库运行状态。 + + +- 查询事件的时间 + +查询事件的线程启动时间、事务启动时间、SQL启动时间以及状态变更时间。 + +``` +openGauss=# SELECT backend_start,xact_start,query_start,state_change FROM pg_stat_activity; +``` + +![image](images/openGauss/pic4.png) + + +- 查询当前服务器的会话计数信息 + +``` +openGauss=# SELECT count(*) FROM pg_stat_activity; +``` + +![image](images/openGauss/pic5.png) + + +- 查询系统级统计信息 + +查询当前使用内存最多的会话信息。 + + +``` +openGauss=# SELECT * FROM pv_session_memory_detail() ORDER BY usedsize desc limit 10; +``` + +![image](images/openGauss/pic6.png) + + +## 4、对象检查 + +表、索引、分区、约束等是数据库的核心存储对象,其核心信息和对象维护是DBA重要的日常工作。 + +- 查看表的详细信息 + +``` +openGauss=# \d+ table_name +``` + +![image](images/openGauss/pic7.png) + + +- 查询表统计信息 + +``` +openGauss=# SELECT * FROM pg_statistic; +``` + +- 查看索引的详细信息 + +``` +openGauss=# \d+ index_name +``` + +- 查询分区表信息 + + +``` +openGauss=# SELECT * FROM pg_partition; +``` + +![image](images/openGauss/pic8.png) + + +- 收集统计信息 + +使用ANALYZE语句收集数据库相关的统计信息。 + +使用VACUUM语句可以回收空间并更新统计信息。 + +- 查询约束信息 + +``` +openGauss=# SELECT * FROM pg_constraint; +``` + +![image](images/openGauss/pic9.png) + + +指定列名称,就可以了 + + + +## 5、基本信息检查 + + +基本信息包括版本、组件、补丁集等信息,定期检查数据库信息并登记在案是数据库生命周期管理的重要内容之一。 + + +- 版本信息 + +``` +openGauss=# SELECT version(); +``` + + +![image](images/openGauss/pic10.png) + + +容量检查 + +``` +openGauss=# SELECT pg_table_size('t1'); +``` + + +![image](images/openGauss/pic11.png) + + +``` +openGauss=# SELECT pg_database_size('d1'); +``` + +![image](images/openGauss/pic12.png) + + + + + + + + + + diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic1.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..45b1c9ee4347a686670ec00badd3cc68dbf044b5 Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic10.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic10.png" new file mode 100644 index 0000000000000000000000000000000000000000..fa64ee97f3b065821ced16399b2d3e7f7f16b4ad Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic10.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic11.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic11.png" new file mode 100644 index 0000000000000000000000000000000000000000..0484abf3a83b60a4613df5c4de5b83ad37661387 Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic11.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic2.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic2.png" new file mode 100644 index 0000000000000000000000000000000000000000..9b91db459866c42e31c0dae0ebde2d5799a918d8 Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic2.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic3.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic3.png" new file mode 100644 index 0000000000000000000000000000000000000000..c89981eedf17659b7aa725c34286f8f5d76833ba Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic3.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic4.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic4.png" new file mode 100644 index 0000000000000000000000000000000000000000..f80bf4cc31e7477126398ddf261126f9ef1afda0 Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic4.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic5.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic5.png" new file mode 100644 index 0000000000000000000000000000000000000000..70c39bd34618d518437d27f5e47fb6f7c50f82fc Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic5.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic6.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic6.png" new file mode 100644 index 0000000000000000000000000000000000000000..6341238d3332ef90d28739e1832e8b158043162b Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic6.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic7.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic7.png" new file mode 100644 index 0000000000000000000000000000000000000000..502bef505c9f8ea114eb45325e3ec1b30178a56c Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic7.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic8.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic8.png" new file mode 100644 index 0000000000000000000000000000000000000000..ca9047c06e584791f378c029335dfc2b121330a0 Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic8.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic9.png" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic9.png" new file mode 100644 index 0000000000000000000000000000000000000000..7f37dbdd80447021efae4718d192b41c0279730f Binary files /dev/null and "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/images/openGauss/pic9.png" differ diff --git "a/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/openGauss\347\232\204\346\225\260\346\215\256\345\244\204\347\220\206\350\203\275\345\212\233\350\260\203\344\274\230\345\256\236\350\267\265.md" "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/openGauss\347\232\204\346\225\260\346\215\256\345\244\204\347\220\206\350\203\275\345\212\233\350\260\203\344\274\230\345\256\236\350\267\265.md" new file mode 100644 index 0000000000000000000000000000000000000000..58ac56ebab8bcdfa4be4b01fe99abec846425f57 --- /dev/null +++ "b/app/zh/blogs/\345\244\247\346\225\260\346\215\256\346\250\241\345\236\213/openGauss\347\232\204\346\225\260\346\215\256\345\244\204\347\220\206\350\203\275\345\212\233\350\260\203\344\274\230\345\256\236\350\267\265.md" @@ -0,0 +1,183 @@ +--- +title: 'openGauss的数据处理能力调优实践' + +date: '2024-04-25' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-04' +category: 'blog' +author: '大数据模型' + +summary: 'openGauss的数据处理能力调优实践' +--- + +# 前文 + + +众所周知,openGauss是TP处理数据库,擅长交易、转帐、支付的业务场景,因为它是一个单机的数据库,没有分布式处理能力,大部分人认为它的分析处理能力会很弱。其实openGauss在存储引擎支持列式,支持并行查询,支询分区,支持向量化,所以它的查询处理能力也是不弱的。 + +# 测试环境 + +## 配置条件 + +|CPU|内存| 版本| 数据量| +|---|---|---|---| +|i7 |8G |openGauss 6 |66681536| +| + +## 测试SQL + +``` +#表结构 +CREATE TABLE LINEITEM_C ( +L_ORDERKEY INTEGER NOT NULL, +L_PARTKEY INTEGER NOT NULL, +L_SUPPKEY INTEGER NOT NULL, +L_LINENUMBER INTEGER NOT NULL, +L_QUANTITY DECIMAL(15,2) NOT NULL, +L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, +L_DISCOUNT DECIMAL(15,2) NOT NULL, +L_TAX DECIMAL(15,2) NOT NULL, +L_RETURNFLAG CHAR(1) NOT NULL, +L_LINESTATUS CHAR(1) NOT NULL, +L_SHIPDATE DATE NOT NULL, +L_COMMITDATE DATE NOT NULL, +L_RECEIPTDATE DATE NOT NULL, +L_SHIPINSTRUCT CHAR(25) NOT NULL, +L_SHIPMODE CHAR(10) NOT NULL, +L_COMMENT VARCHAR(44) NOT NULL +) ; + + +#执行SQL +EXPLAIN ANALYZE +SELECT +L_RETURNFLAG, L_LINESTATUS, +SUM(L_QUANTITY) AS SUM_QTY, SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, +SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT)) AS SUM_DISC_PRICE, SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT) * (1 + L_TAX)) AS SUM_CHARGE, AVG(L_QUANTITY) AS AVG_QTY, +AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS AVG_DISC, COUNT(*) AS COUNT_ORDER +FROM LINEITEM_COPY + WHERE +L_SHIPDATE = DATE '1994-01-16' +GROUP BY +L_RETURNFLAG, L_LINESTATUS; +``` + +## 测试方法 + + +行式表是慢的,列式表是快的,有分区是好事,没有分区是坏事,openGauss支持往行式 添加向量化技术。根据不同考虑一共有以下测试。 + +- 行式表带分区 +- 向量化行式表加分区 +- 行式表没有分区 +- 向量化行式表没有分区 +- 列式表有分区 +- 列式表无分区 +- 列式表有分区加上并行查询 + +## 测试SQL + +
+ +**行式表有分区** + +执行时间: 730615.702ms + +![image](images/openGauss/pic1.png) + + +**向量化行式表有分区** + +``` +set try_vector_engine_strategy=force; +``` + +执行时间: 119065.411ms + +![image](images/openGauss/pic2.png) + +**行式表没有分区** + + +执行时间: 419898.535ms + +![imgae](images/openGauss/pic3.png) + +![imgae](images/openGauss/pic4.png) + + +![imgae](images/openGauss/pic5.png) + + +Lineitem_copy行式表,没有分区,没有排序 + +运行算子有seq scan,显性声明是全盘扫描,一共耗时419898.535ms + +**向量化行式表 【无分区】** + + +执行时间: 85946.78ms + +现在加上 + +``` +set try_vector_engine_strategy=force; +show try_vector_engine_strategy; +``` + +![imgae](images/openGauss/pic6.png) + +目标行式,基于表SQL查询耗时**85946.78ms**,对比原来的**419898.535ms**,有了很大效率的提升。底层观察对硬盘的利用率也提升了。 + +![imgae](images/openGauss/pic7.png) + +**列式表 【有分区】** + +执行时间: 42247.220ms + + +![imgae](images/openGauss/pic8.png) + +![imgae](images/openGauss/pic9.png) + + +有分区的列式表耗时42247.220ms,相对原来行式表向量化计算SQL查询**85946.78ms**,以及行式表没有分区的**419898.535ms** 性能大为提升 + + +**列式表 【无分区】** + + +执行时间: 85872.221 ms + + +![imgae](images/openGauss/pic10.png) + + +**列式表 【有分区】8个CPU** + + +执行时间: 12140.229ms + +![imgae](images/openGauss/pic11.png) + + +# 总结 + + +|行式表有分区|向量化行式表【有分区】| 行式表没有分区| 向量化行式表 【无分区】| 列式表 【有分区】| 列式表 【无分区】| 列式表 【有分区】8个CPU| +|---|---|---|---|---|---|---| +|730615.702ms|119065.411ms|419898.535| 85946.78ms| 42247.220ms |85872.221ms| 12140.229 ms| +| + +- 行式表有分区 比 行式表没有分区 慢, 重复看了几次,确定优化器在这里根据时间响应,它选择了顺序扫描,顺序扫描要比 分区的要快,这里有可能是分区失效的问题,笔者没有深入。 + +- 行式表虽然不是列式的组织结构,但是可以调用向量化的技术进行处理,通过CPU的SIMD能力提高处理能力。 + +- 列式默认就带有向量化处理的能力,带分区的列式比没有分区的列式更友好。 + +- CPU多核处理+ CPU的SIMD处理+分区+列式 是目前来看是最好的。 + +- 优化没有终点,上述仅是实例参数的优化,SQL语句改造 以及内存管理参数优化都是 优化的手段。 + \ No newline at end of file diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic1.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..844b502852f8bcd3ec0f631aa0028959fe398121 Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic1.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic2.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic2.png" new file mode 100644 index 0000000000000000000000000000000000000000..df25bfe3ed40ebeec080c4a360f5374d8765797d Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic2.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic3.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic3.png" new file mode 100644 index 0000000000000000000000000000000000000000..6cc8415358b7ed59542facfd69487349fbe41b38 Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic3.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic4.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic4.png" new file mode 100644 index 0000000000000000000000000000000000000000..06e3790b9f4796e805878d37762b9752832a0f89 Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic4.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic5.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic5.png" new file mode 100644 index 0000000000000000000000000000000000000000..eea013ec9e7ef789d22f4076871a7925eb4c003a Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic5.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic6.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic6.png" new file mode 100644 index 0000000000000000000000000000000000000000..111a9303a6745a868ea42140f4a4daa2c03e4cb4 Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic6.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic7.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic7.png" new file mode 100644 index 0000000000000000000000000000000000000000..771f479f86c7ce6a8e6a0a56056ca004d16024a5 Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic7.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/images/pic8.png" "b/app/zh/blogs/\345\256\245\350\260\246/images/pic8.png" new file mode 100644 index 0000000000000000000000000000000000000000..e1aa2f47e64c35bd6a9d3bce9c7ff206719d186e Binary files /dev/null and "b/app/zh/blogs/\345\256\245\350\260\246/images/pic8.png" differ diff --git "a/app/zh/blogs/\345\256\245\350\260\246/openGauss 6.0.0-RC1\346\226\260\347\211\271\346\200\247\357\274\232\344\270\200\347\253\231\345\274\217\344\272\244\344\272\222\345\256\211\350\243\205\345\210\235\344\275\223\351\252\214.md" "b/app/zh/blogs/\345\256\245\350\260\246/openGauss 6.0.0-RC1\346\226\260\347\211\271\346\200\247\357\274\232\344\270\200\347\253\231\345\274\217\344\272\244\344\272\222\345\256\211\350\243\205\345\210\235\344\275\223\351\252\214.md" new file mode 100644 index 0000000000000000000000000000000000000000..776d3f4dc459d780f6cd763fb3782400b030af9b --- /dev/null +++ "b/app/zh/blogs/\345\256\245\350\260\246/openGauss 6.0.0-RC1\346\226\260\347\211\271\346\200\247\357\274\232\344\270\200\347\253\231\345\274\217\344\272\244\344\272\222\345\256\211\350\243\205\345\210\235\344\275\223\351\252\214.md" @@ -0,0 +1,156 @@ +--- +title: 'openGauss 6.0.0-RC1新特性:一站式交互安装初体验' + +date: '2024-04-19' + +tags: ['openGauss技术文章征集', 'openGauss', '新版本安装'] + +archives: '2024-04' +category: 'blog' +author: '宥谦' + +summary: '【openGauss技术文章征集】openGauss 6.0.0-RC1新特性:一站式交互安装初体验' +--- + + +openGauss 6.0.0-RC1是openGauss 2024年3月发布的创新版本,闲来无事翻阅文档,被一条新增特性内吸引了目光: + +- 内核工具:支持一站式交互安装 + +- 用户通过交互界面输入数据库的相关信息,系统自动生成xml配置文件,并自动进行数据库的初始化安装。 + +我是从去年开始接触国产数据库openGauss,之前一直使用的是成熟的Mysql,Oracle等数据库,对比之下,openGauss的安装方式要比他们麻烦不少,在折腾5.0的时候,预安装(初始化安装)这一步也阻塞了不少时间,看到这个特性,那必须要体验一番。 + +# 环境准备 + +先附上官方文档:一站式安装指南; 可以看到默认的选项是一主两备集群; + +因此,先准备三台虚拟机用于测试; + +IP信息如下: + +``` +10.125.10.14 +10.125.10.67 +10.125.10.229 +``` + +系统操作信息如下: + +``` +[root@localhost ~]# cat /etc/os-release +NAME="openEuler" +VERSION="22.03 (LTS-SP1)" +ID="openEuler" +VERSION_ID="22.03" +PRETTY_NAME="openEuler 22.03 (LTS-SP1)" +ANSI_COLOR="0;31" +[root@localhost ~]# uname -a +Linux localhost.localdomain 5.10.0-136.12.0.86.oe2203sp1.x86_64 #1 SMP Tue Dec 27 17:50:15 CST 2022 x86_64 x86_64 x86_64 GNU/Linux +``` + +规格为8C16G;基于之前安装5.0.0版本的经验,将官方文档中准备软硬件安装环境 这一步骤整合在一起使用shell脚本一键执行,方便操作; + +其中python使用openEuler 22.03 LTS SP1镜像自带版本,版本信息如下: + +``` +[root@gauss1 rpms]# python3 --version +Python 3.9.9 +``` + +一键脚本主要内容如下(加粗部分是与官方文档存在差异及踩坑的部分): + +- 安装软件依赖;除官方文档内的三个依赖外,经过测试,**expect依赖也是必须;** + + + +``` +[root@gauss1 rpms]# ll +总用量 488 +-rw-r--r--. 1 root root 247025 4月 18 20:52 expect-5.45.4-7.oe2203sp1.x86_64.rpm +-rw-r--r--. 1 root root 22141 4月 19 10:37 libaio-0.3.113-5.oe2203sp1.x86_64.rpm +-rw-r--r--. 1 root root 10817 4月 19 10:36 libaio-devel-0.3.113-5.oe2203sp1.x86_64.rpm +-rw-r--r--. 1 root root 211561 4月 19 13:52 readline-devel-8.1-2.oe2203sp1.x86_64.rpm +``` +- 修改防火墙配置 +- 设置主机名(由于使用云平台模板创建的虚拟机,三台虚拟机名称统一为localhost.- localdomain,修改为不同主机名) +- 关闭RemoveIPC +- 创建用户组和用户(必须为omm用户和dbgroup用户组),**之前使用的是安装5.0.0时设置的dbgrp用户组,在测试过程中出现了错误** + +![image.png](images/pic1.png) + +- 关闭THP +- 拷贝安装包内的pssh工具到虚拟机内:在前面的多次测试中,总会报错pssh命令不存在的错误,翻阅安装包及后续成功的经验来看,openGauss初始化安装过程中其中一步是设置自身携带的pssh工具路径,但在这之前会尝试直接使用pssh,而pssh并不是镜像必备软件,会报错命令不存在,因此要手动拷贝安装包内此软件到/usr/bin/目录下;其中,安装包内工具路径为openGauss-6.0.0-RC1-openEuler-64bit-om/script/gspylib/pssh/bin/pssh,同级目录下还有pscp和TaskPool.py脚本,为了方便,一起拷贝;拷贝完成后,执行chmod +x pssh pscp TaskPool.py赋予执行权限; +将此脚本依次在三台虚拟机上执行,就完成了环境准备的全部内容; + +# 一站式初始化安装 + +- 在三台虚机内创建/opt/openGauss目录; + +``` +mkdir -p /opt/openGauss +``` + +- 将安装包上传到第一台虚拟机(10.125.10.14)root目录下,执行解压命令,将安装包解压到/opt/openGauss目录下; + +``` +[root@gauss1 ~]# ll |grep openEuler +-rw-r--r--. 1 root root 151532247 4月 18 20:29 openGauss-6.0.0-RC1-openEuler-64bit-all.tar.gz +[root@gauss1 ~]# tar -zxf openGauss-6.0.0-RC1-openEuler-64bit-all.tar.gz -C /opt/openGauss/ +``` + +- 进入/opt/openGauss,解压OM安装包到当前目录; + +``` +[root@gauss1 ~]# cd /opt/openGauss/ +[root@gauss1 ~]# tar -zxf openGauss-6.0.0-RC1-openEuler-64bit-om.tar.gz +``` + +- 进入script目录,执行初始化安装命令,我并没有使用环境分离,因为去掉环境分离参数(--sep-env-file=ENVFILE); + +``` +[root@gauss1 ~]# cd script + +[root@gauss1 ~]# ./gs_preinstall -U omm -G dbgroup --one-stop-install +``` +- 到这一步根据提示,全部选择默认,跟随提示交互输入即可; + +![image.png](images/pic2.png) + +![image.png](images/pic3.png) + + +![image.png](images/pic4.png) + +初始化安装成功如下图: + +![image.png](images/pic5.png) + +# 执行数据库安装 + +初始化安装完成后,安装就简单了,切换到omm用户下执行安装命令即可;根据初始化安装过程中的提示,生成的xml路径为:/opt/openGauss/script/base_utils/template/cluster.xml +使用此路径进行安装即可 + +``` +[root@gauss1 ~]# su - omm +[root@gauss1 ~]# gs_install -X /opt/openGauss/script/base_utils/template/cluster.xml +``` +![image.png](images/pic6.png) + +安装成功截图如下: + +![image.png](images/pic7.png) + +使用gs_om -t status --detail查询数据库状态可以看到数据库正常: + +![image.png](images/pic8.png) + +# 注意 + +实践过程中,饶是我已经有了很多安装5.0.0的经验,但还是耗费了一整体时间才安装成功,因此,感觉还是有几点需要注意,写在这里备忘。 + +- 请选择是否部署资源池化和请选择是否部署CM的选项,1和2不是相同含义,如果不选择默认,一定要注意; +- 除官方提醒的三个依赖外,还需要安装expect依赖,且三个节点都需要安装; +- 所有的初始化安装和安装命令均需要解压OM安装包后进入script包执行; +- openGauss依赖SSE4_2指令集,使用不同厂商云平台创建虚机安装的时候一定要注意如何设置,使虚拟机支持此指令集; +- pssh提前拷贝(这是不是BUG) \ No newline at end of file diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic1.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..d0c2a577dc7a08f92ebff1a36c0d7977b57dea79 Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic2.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic2.png" new file mode 100644 index 0000000000000000000000000000000000000000..f560ff9950fb8db224d36f883b73ca89725b4813 Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic2.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic3.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic3.png" new file mode 100644 index 0000000000000000000000000000000000000000..6577fb9c30283aa3f347bb0301f1ebeb14d936cf Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic3.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic4.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic4.png" new file mode 100644 index 0000000000000000000000000000000000000000..f92288272c22d29e4d0c07697355a106da4f6c69 Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic4.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic5.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic5.png" new file mode 100644 index 0000000000000000000000000000000000000000..60850626a34b90894ba32287cdc812b2c6e1527c Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic5.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic6.png" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic6.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad04f2f24f2c9cdcb57d1b94a2d69e225034b582 Binary files /dev/null and "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/images/openGauss/pic6.png" differ diff --git "a/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/\343\200\220openGauss\346\212\200\346\234\257\346\226\207\346\241\243\343\200\221openGauss\346\236\201\350\207\264RTO\346\227\245\345\277\227\345\244\204\347\220\206\346\265\201\347\250\213\347\256\200\344\273\213.md" "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/\343\200\220openGauss\346\212\200\346\234\257\346\226\207\346\241\243\343\200\221openGauss\346\236\201\350\207\264RTO\346\227\245\345\277\227\345\244\204\347\220\206\346\265\201\347\250\213\347\256\200\344\273\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..88e1c7cfc85e0e219ecdc32638189757670f69a6 --- /dev/null +++ "b/app/zh/blogs/\345\260\274\345\260\224\347\246\217\346\226\257/\343\200\220openGauss\346\212\200\346\234\257\346\226\207\346\241\243\343\200\221openGauss\346\236\201\350\207\264RTO\346\227\245\345\277\227\345\244\204\347\220\206\346\265\201\347\250\213\347\256\200\344\273\213.md" @@ -0,0 +1,285 @@ +--- +title: '【openGauss技术文档】openGauss极致RTO日志处理流程简介' + +date: '2024-05-21' + +tags: ['openGauss技术文档', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '尼尔福斯' + +summary: '【openGauss技术文档】openGauss极致RTO日志处理流程简介' +--- + +# 极致RTO简单介绍 + +极致RTO是openGauss在并行回放的基础上,实现的一个加速回放功能。其主要原理是将record粒度的日志拆分成block粒度的日志进行回放,通过增加流水线和redoworker线程的数量,并且利用相关hash算法,保证同一张表的日志由同一流水线回放,以此提高回放速度和回放并发度。 + +# 极致RTO相关参数 + +recovery_parse_workers > 1 或 recovery_redo_workers > 1,即为开启极致TO. + + +**recovery_parse_workers** + +参数说明: 是极致RTO特性中ParseRedoRecord线程的数量。 + +该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 + +取值范围:整型,1~16 + +仅在开启极致RTO情况下可以设置recovery_parse_workers为>1。需要配合recovery_redo_workers使用。若同时开启recovery_parse_workers和recovery_max_workers,以开启极致RTO的recovery_parse_workers为准,并行回放特性失效。因极致RTO不支持主备从模式,仅在参数replication_type设置成1时可以设置recovery_parse_workers为>1。另外,极致RTO也不支持列存,在已经使用列存表或者即将使用列存表的系统中,请关闭极致RTO。极致RTO不再自带流控,流控统一由recovery_time_target参数来控制。 + +默认值: 1 + +**recovery_redo_workers** + +参数说明: 是极致RTO特性中每个ParseRedoRecord线程对应的PageRedoWorker数量。 + +该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 + +取值范围:整型,1~8 + +需要配合recovery_parse_workers使用。在配合recovery_parse_workers使用时,只有recovery_parse_workers大于1,recovery_redo_workers参数才生效。 + +默认值: 1 + + +# 极致RTO回放线程类型 + + +REDO_BATCH 负责record粒度的日志拆分成block粒度,并分发给redo manager线程 + +REDO_PAGE_MNG, 负责向redo worker线程分发xlog + +REDO_PAGE_WORKER, 负责回放 + +REDO_TRXN_MNG, 负责向trxn worker分发xlog + +REDO_TRXN_WORKER, 负责回放事务日志 + +REDO_READ_WORKER, 流复制场景,用于从磁盘读xlog + +REDO_READ_PAGE_WORKER, 负责从磁盘读取xlog或从xlog缓冲区读取xlog,并校验完整性 + +REDO_READ_MNG, 负责控制读xlog线程 + +REDO_SEG_WORKER, 按需回放新增线程, + +REDO_HTAB_MNG, 按需回放新增线程, + +REDO_CTRL_WORKER, 按需回放新增线程, + +Startup线程:负责将日志分发给对应的流水线 + + +# 极致RTO流水线示意图 + + +极致RTO后台有多个流水线,由recovery_parse_workers 参数控制,通过特定的hash算法,可以保证同一个表的日志一定会路由到特定的流水线回放,以保证日志回放时有序 + +![image](images/openGauss/pic1.png) + + +# 各线程功能简述 + +## REDO_READ_WORKER + +主函数:XLogReadWorkerMain + +流复制场景,用于从磁盘读xlog,该线程会把xlog从磁盘读取到g_recordbuffer->xlogsegarray[readindex],read buffer中。 + +### **代码流程** + +XLogReadWorkerMain->XLogReadWorkRun->XLogReadFromWriteBuffer + +![image](images/openGauss/pic2.png) + + +## REDO_READ_PAGE_WORKER + +XLogReadPageWorkerMain,循环读取xlog,将读到的xlog record,解析为XLogReaderState,并置入g_dispatcher->readLine.readPageThd->queue传递给startup线程 + +流复制场景(传统主备), +failover阶段,IsRecoveryDone == false,从磁盘读xlog。 + +备机normal状态,IsRecoveryDone == true,用于从g_recordbuffer->xlogsegarray[readindex]缓冲区读取日志,传递给Startup线程。 + +资源池化场景,XLogReadPageWorkerMain同时负责读取xlog和解析xlog传递给startup线程。 + +### **代码流程** + +
+ + +**xlog读取主流程** + + +XLogReadPageWorkerMain->XLogParallelReadNextRecord->ParallelReadRecord->ParallelReadPageInternal->ParallelXLogPageRead + + +**读xlog的场景分类** + +流复制场景(传统主备):ParallelXLogReadWorkBufRead->XLogPageReadForExtRto +资源池化,从DSS读xlog文件:SSXLogPageRead +非池化,通过文件系统读xlog文件:ParallelXLogPageReadFile + + +**XLogReadPageWorkerMain循环流程** + +读xlog:XLogParallelReadNextRecord + +生成下一个readerState: NewReaderState + +更新读取最新xlog的起止点: + +``` +g_redoWorker->lastReplayedReadRecPtr = xlogreader->ReadRecPtr; +g_redoWorker->lastReplayedEndRecPtr = xlogreader->EndRecPtr; +``` + + +更新g_GlobalLsnForwarder:SendLsnFowarder + +把读到的xlog(XLogReaderState)存入队列:PutRecordToReadQueue + + + +![image](images/openGauss/pic3.png) + + +## StartupXLOG + +
+ +### **代码流程** + + +循环执行以下流程直到XLogReaderState == NULL + +**从队列中读取下一条xlog:ReadNextXLogRecord->ReadNextRecordFromQueue->SPSCBlockingQueueTake(g_dispatcher->readLine.readPageThd->queue)** + +- 读取获取到record后解析xlog,从XLogReaderState解析到XLogRecord,DecodeXLogRecord + +- 如果读到g_redoEndMark.record,则退出循环 + +- 如果读取到g_GlobalLsnForwarder.record或g_cleanupMark.record,调用StartupSendFowarder,向所有batchRedo线程和txnmanager线程分发该日志 + +**将xlog解析成RedoItem ,并分发给下一级流水线线程** + +- DispatchRedoRecord->ExtremeDispatchRedoRecordToFile->g_dispatchTable[rmid].rm_dispatch(record, expectedTLIs, recordXTime); + +- 根据XLogReaderState 偏移获取RedoItem : RedoItem *item = GetRedoItemPtr(record); + +- 根据xlog的类型(rmid),选择对应的分发方法:g_dispatchTable[rmid].rm_dispatch(record, expectedTLIs, recordXTime); + + - 普通日志通常分发给batchRedo线程(g_dispatcher->pageLines[i].batchThd)。其中,同一个表的日志一般发给某个特定流水线,会通过rnode计算流水线Id:GetSlotId + - 事务日志分发给txnmanager线程。(g_dispatcher->trxnLine.managerThd),对应函数:DispatchXactRecord + + - ddl相关日志create、truncate, + +## 分发策略: + +极致RTO通过函数向下级流水线分发ExtremeDispatchRedoRecordToFile + +具体分发方法会根据xlog类型rmid选择对应的分发算法g_dispatchTable[rmid].rm_dispatch(record, expectedTLIs, recordXTime); + +在选择流水线时,为了尽量避免回放时的页面交换问题,极致RTO根据relfilenode计算hash值,该hash值用于选择哪一条流水线向下分发日志。对应函数:GetWorkerIds。 + + + +![image](images/openGauss/pic4.png) + + + +## BatchRedoMain + + +循环把record级别的xlog(RedoItem)解析成Block级别的xlog(XLogRecParseState),并传递给PageRedoManager线程进行回放。 + + +- 从流水线中循环读取区出xlog:BatchRedoMain->SPSCBlockingQueueGetAll(g_redoWorker->queue, &eleArry, &eleNum) + +- 把record级别的xlog(RedoItem)解析成Block级别的xlog(XLogRecParseState): BatchRedoDistributeItems->BatchRedoParseItemAndDispatch->XLogParseToBlockForExtermeRTO->g_xlogParseBlockTable[rmid].xlog_parseblock(record, blocknum) + +- 把 Block级别的xlog分发给下一级流水线:AddPageRedoItem(myRedoLine->managerThd, recordblockstate); + + +![image](images/openGauss/pic5.png) + + +## RedoPageManagerMain + +把XLogRecParseState根据rnode等信息,分发给RedoPageWorker线程, + +- RedoPageManagerMain->PageManagerRedoDistributeItems->PageManagerRedoParseState->根据日志类型选择解析方式 + +- AddPageRedoItem(myRedoLine->redoThd[work_id], record_block_state); + + + +![image](images/openGauss/pic6.png) + + +## RedoPageWorkerMain + + +回放上一层流水线下发的日志。不同xlog类型执行函数不同 + +RedoPageWorkerMain->XLogBlockRedoForExtremeRTO->g_xlogExtRtoRedoTable[block_valid].xlog_redoextrto(blockhead, blockrecbody, bufferinfo); + +## 一些关键变量 + +
+ +### **特殊xlog标记** + + +RedoItem g_redoEndMark = { false, false, NULL, 0, NULL, 0 }; + +RedoItem g_terminateMark = { false, false, NULL, 0, NULL, 0 }; + +RedoItem g_GlobalLsnForwarder; + +RedoItem g_cleanupMark; + +RedoItem g_closefdMark; + +RedoItem g_cleanInvalidPageMark; + + +## 不同类型XLOG的处理函数 + +
+ +### **极致RTOxlog分发函数** + +src\gausskernel\storage\access\transam\extreme_rto\dispatcher.cpp + +static const RmgrDispatchData g_dispatchTable[RM_MAX_ID + 1] + +### **极致RTO batchRedo线程解析函数** + +src\gausskernel\storage\access\redo\redo_xlogutils.cpp + +static const XLogParseBlock g_xlogParseBlockTable[RM_MAX_ID + 1] = { + +### **极致RTO 回放函数** + +src\gausskernel\storage\access\redo\redo_xlogutils.cpp + + +``` +static const XLogBlockRedoExtreRto g_xlogExtRtoRedoTable[BLOCK_DATA_CSNLOG_TYPE + 1] = { + { XLogBlockDataCommonRedo, BLOCK_DATA_MAIN_DATA_TYPE }, { XLogBlockVmCommonRedo, BLOCK_DATA_VM_TYPE }, + { XLogBlockUndoCommonRedo, BLOCK_DATA_UNDO_TYPE }, + { XLogBlockFsmCommonRedo, BLOCK_DATA_FSM_TYPE }, { XLogBlockDdlCommonRedo, BLOCK_DATA_DDL_TYPE }, + { XLogBlockBcmCommonRedo, BLOCK_DATA_BCM_TYPE }, { XLogBlockNewCuCommonRedo, BLOCK_DATA_NEWCU_TYPE }, + { XLogBlockClogCommonRedo, BLOCK_DATA_CLOG_TYPE }, { XLogBlockCsnLogCommonRedo, BLOCK_DATA_CSNLOG_TYPE }, +}; +``` + + + + diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic1.png" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..e7aec356fe8b1b64d568460b8bae50a240ffaee7 Binary files /dev/null and "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic2.png" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic2.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aab518e51258154f55ea93605a8eef3fc2030dd Binary files /dev/null and "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic2.png" differ diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic3.png" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic3.png" new file mode 100644 index 0000000000000000000000000000000000000000..d689cf2702b28fd8684076aca90244f290bb156b Binary files /dev/null and "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic3.png" differ diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic4.png" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic4.png" new file mode 100644 index 0000000000000000000000000000000000000000..d61cc57af72337a96606d3a80e240deda7257430 Binary files /dev/null and "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic4.png" differ diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic5.png" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic5.png" new file mode 100644 index 0000000000000000000000000000000000000000..8dce6a8d23f32818a115fe5cdd91afd080385c5a Binary files /dev/null and "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/images/openGauss/pic5.png" differ diff --git "a/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/\350\247\202\346\265\213openGauss\347\232\204\350\241\214\347\273\204\343\200\201\351\241\265\343\200\201\346\225\260\346\215\256\347\261\273\345\236\213\344\270\211\350\200\205\347\232\204\345\205\263\347\263\273.md" "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/\350\247\202\346\265\213openGauss\347\232\204\350\241\214\347\273\204\343\200\201\351\241\265\343\200\201\346\225\260\346\215\256\347\261\273\345\236\213\344\270\211\350\200\205\347\232\204\345\205\263\347\263\273.md" new file mode 100644 index 0000000000000000000000000000000000000000..08fa318cf66d6e6097df8253b4c91752b0e6b582 --- /dev/null +++ "b/app/zh/blogs/\350\202\226\345\260\217\345\217\257\347\210\261\344\271\220\344\271\220/\350\247\202\346\265\213openGauss\347\232\204\350\241\214\347\273\204\343\200\201\351\241\265\343\200\201\346\225\260\346\215\256\347\261\273\345\236\213\344\270\211\350\200\205\347\232\204\345\205\263\347\263\273.md" @@ -0,0 +1,310 @@ +--- +title: '观测openGauss的行组、页、数据类型三者的关系' + +date: '2024-04-25' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-04' +category: 'blog' +author: '肖小可爱乐乐' + +summary: '观测openGauss的行组、页、数据类型三者的关系' +--- + +# openGauss的page + +openGauss的行存储模型与页面组织结构与PG有点类似,笔者看了华为出品的《openGauss数据库核心技术》和《数据库原理及应用》,总感觉细节差那么一点,有些资料找不到,所以从PG的原来去了解openGauss的。 + +PG是堆表存储结构,第一层是meta page,第二层root page,第三层branch ,第四层是leaf。初始化的表空间默会有meta page和root page,关于管理、索引相关的信息保存在meta page里面,实际生成的第一条数据则保存在root page,随着数据的慢慢扩大,root page不能装下,就生成指针指向相关的page,继着生成相关的branch page以及leaf page。假设数据一直在增大,数据会持续在branch page和leaf page上面追加。meta、root、branch、leaf四者之间的结构关系区别MySQL innodb的有序组织,只管往leaf叠加,从这个理论逻辑上来说,PG的写速度应该比MySQL快。 + +![image.png](images/openGauss/pic1.png) + +Postgresql提供```create extension pageinspect```可以查看 roo page、branch page、leaf page层次的变化。 + + +``` +1. create extension pageinspect + +2、查看meta块 + +select * from bt_metap('tab1_pkey'); + +3、查看root page的stats + +select * from bt_page_stats('tab1_pkey',1); + +4、查看root(leaf)页里面的内容: + +select * from bt_page_items('tab1_pkey',1); + +5、根据ctid来访问表: + +select * from tab1 where ctid='(0,1)'; + +``` + +openGauss目前 暂不支持 **pageinspect** 类似的工具,没有方便的工具查看行组与页的关系。我们想知道openGauss的一个page可以装多少条数据,需要一些土办法,例如通过page的变化计算出一个page可以装 多少数据。 + +``` +#新建表 +openGauss=# create table t2(id int); +CREATE TABLE + + +#插入数据 +openGauss=# insert into t2 values(1); +INSERT 0 1 + +#查询表对应的页数,当前只有一个 +openGauss=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 't2'; + relname | relpages +---------+---------- + t2 | 1 +(1 rows) + +#继续插入数据,通过反复插入数据,计算超过多少数据的增加 + +truncate table t2; +insert into t2 select * from generate_series(1, 插入数据数量); +analyze t2; +SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 't2'; + + +#记录page的变化,总结基于简单一个4字节的整型,约插入226个数据就会生成新的page,一个page可以装226个数据 + +insert into t2 select * from generate_series(1,225); +1PAGE + +insert into t2 select * from generate_series(1,226); +2PAGE + + +insert into t2 select * from generate_series(1,453); +3PAGE + + +insert into t2 select * from generate_series(1,679); +4PAGE + + + +insert into t2 select * from generate_series(1,905); +5PAGE + +insert into t2 select * from generate_series(1,1131); +6PAGE + + +insert into t2 select * from generate_series(1,1357); +7page + +#如果我把建表改成 create table t3(c0 int,c1 int,c2 int,c3 int ,c4 bigint); 继续上面的测试,入226个数据变成157个左右就会生成一个page,一个page可以装157个数据 + +insert into t3 select * from generate_series(1,156); +1 PAGE + + +insert into t3 select * from generate_series(1,157); +2 PAGE + +insert into t3 select * from generate_series(1,313); +3 PAGE + + +insert into t3 select * from generate_series(1,490); +4 PAGE + +#为什么226个数据就会生成新的page,现在变成156就会生成一个page,这个与建表的数据类型有关,t2表有一个4字节的int,而t3则是 int+int+int+int+bigint,4*4+8=24字节,因为t3的数据单元大,自然page容纳的数量少。 +``` + +一个PAGE可以装多少条数据?根据 上面落定的事实,已知条件数据类型字节数,已知事实数据数量,已知一个PAGE是8KB,可以计算出其它 **数据**是多少?下面是其它**数据**的计算公式,以X代入。 + + +``` +(20+X ) * 15 = 8192 +(4+X) * 226 = 8192 +计算得出 这个X约等于32个字节,其它数据等于32个字节 +``` + +什么是**其它数据**,postgresql的页结构分为5部分,有PageHeaderData、ItemIdData、Free space、Items、Special space。**其它数据**就是 PageHeaderData、ItemIdData、tems、Special space, Free space就是数据类型的总和。 + + +| Item | Description | +| ---------- | ---------------------- | +| PageHeaderData | 24 bytes long. Contains general information about the page, including free space pointers. | +| ItemIdData | Array of item identifiers pointing to the actual items. Each entry is an (offset,length) pair. 4 bytes per item. | +| Free space | The unallocated space. New item identifiers are allocated from the start of this area, new items from the end. | +|Items|The actual items themselves.| +|Special space|Index access method specific data. Different methods store different data. Empty in ordinary tables.| +| + +从postgresql官方提供的资料来看, postgresql的页结构PageHeaderData是24字节,加上ItemIdData的4字节,整体来看,postgresql的接近openGauss。 + +好吧,那么就认定openGauss的**其它数据**的容量32字节。 + +
+ +# 验证 + + +下面进入正式实战 + +``` +# 建一个表,里面有整型和字符型,预计导入的数据会占用多少个page + +create table t6(c1 int,c2 char(200)); + +#根据算式,已知int是4字,char(200)是200字节,加上其它数据是 32字节,那么8192除以236等于34.71,一个page等于34.71, 我们导入3400条数据里面约有100个page,马上动手验证 +``` + +![image.png](images/openGauss/pic2.png) + +``` +create table t9(c1 int,c2 bigint,c3 date,c4 timestamp); +# 按照数据类型,int是4,bigint是8,date是4,timestamp是8 +# 4+8+4+8+32=56,8192除以56等于146.2857142857143 +# 那么插入14600,看看是不是100个page +truncate table t9; +insert into t9 select cc,cc,'2024-1-1','2024-1-1' from generate_series(1, 14600) as cc; +analyze t9; +SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 't9'; +``` + +![image.png](images/openGauss/pic3.png) + +页与行组的对应关系探测到此为止,可以看到数据类型对页的分配影响很大,同时数据类型使用不好,会造成表膨胀,影响到执行性能。我们做一个小测试。 + +准备1000万数据 + +``` +sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql --pgsql-host=xxxxxx --pgsql-port=5432 --pgsql-user=xxxx --pgsql-password='xxxxx3' --pgsql-db=testuser --tables=1 --table-size=10000000 --threads=6 --time=300 --report-interval=10 prepare +``` + + +执行oltp_read_write结果 + +![image.png](D:\Program Files (x86)\typoraimg\20240425-66f1a1eb-f4a6-4268-80dd-7e2e0ac07a65.png) + +现在对sbtest1的表结构里面的类型进行改写 + + +``` +ALTER TABLE sbtest1 ALTER COLUMN id TYPE bigint; +ALTER TABLE sbtest1 ALTER COLUMN k TYPE bigint; +ALTER TABLE sbtest1 ALTER COLUMN c TYPE char(1200); +ALTER TABLE sbtest1 ALTER COLUMN pad TYPE char(600); +``` + +重新oltp_read_write结果 + +![image.png](images/openGauss/pic4.png) + +查看表膨胀 + +``` +testuser=# select CURRENT_CATALOG AS datname,schemaname,relname,n_live_tup,n_dead_tup,round((n_dead_tup::numeric/(case +testuser(# (n_dead_tup+n_live_tup) when 0 then 1 else (n_dead_tup+n_live_tup) end ) *100),2) as dead_rate +testuser-# from pg_stat_user_tables +where (n_live_tup + n_dead_tup) > 10000 +order by 5 desc limit 100;testuser-# testuser-# + datname | schemaname | relname | n_live_tup | n_dead_tup | dead_rate +----------+------------+---------+------------+------------+----------- + testuser | public | sbtest1 | 10000027 | 599548 | 5.66 + testuser | public | t9 | 14600 | 0 | 0.00 +(2 rows) + +``` + +立即运行VACUUM清理数据库表中的过时数据,释放存储空间,并更新表的统计信息 + +``` +testuser=# VACUUM FULL sbtest1; +VACUUM + + +testuser=# select CURRENT_CATALOG AS datname,schemaname,relname,n_live_tup,n_dead_tup,round((n_dead_tup::numeric/(case +(n_dead_tup+n_live_tup) when 0 then 1 else (n_dead_tup+n_live_tup) end ) *100),2) as dead_rate +from pg_stat_user_tables +where (n_live_tup + n_dead_tup) > 10000 +order by 5 desc limit 100;testuser(# testuser-# testuser-# testuser-# + datname | schemaname | relname | n_live_tup | n_dead_tup | dead_rate +----------+------------+---------+------------+------------+----------- + testuser | public | sbtest1 | 10000057 | 1167 | .01 + testuser | public | t9 | 14600 | 0 | 0.00 +(2 rows) + +``` + +再跑一遍依然慢,同样的数据,但是数据长度占用更多的page + +![image.png](images/openGauss/pic5.png) + +openGauss的ustore和 astore,两个引擎的性能特点不同,其实也和页有关系。ustore实现UNDO页面对数据进行预读,保留自身的页面不变,从而实现MVCC,而astore只要把自身的页面按照时间生成多个时间版本的数据,去实现MVCC. + + +这个意味着astore的page随着删除、修改,page会越来越多。而ustore的page的修改也不会太多的变化。我们建立一个1000万的ustore和一个1000万的astore,基于它们的基础对数据进行修改,看看page的变化。 +版本使用 python3.6 + +``` + +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_astore'; + relname | relpages +---------------+---------- + sbtest_astore | 270271 +(1 row) + +testuser=# analyze sbtest_astore; +ANALYZE +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_astore'; + relname | relpages +---------------+---------- + sbtest_astore | 368521 +(1 row) + +testuser=# update sbtest_astore set k=k+1; + +UPDATE 10000000 + + +testuser=# analyze sbtest_astore; +ANALYZE +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_astore'; + relname | relpages +---------------+---------- + sbtest_astore | 638791 +(1 row) + +#上面我们可以看到astore下面的page会越来越多,而下面的ustore则是一成不变 + + +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_ustore'; + relname | relpages +---------------+---------- + sbtest_ustore | 256411 +(1 row) + +testuser=# update sbtest_ustore set k = k+1; +UPDATE 10000000 +testuser=# analyze sbtest_ustore; +ANALYZE +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_ustore'; + relname | relpages +---------------+---------- + sbtest_ustore | 256411 +(1 row) + +testuser=# update sbtest_ustore set k = k+1; +UPDATE 10000000 +testuser=# analyze sbtest_ustore; +ANALYZE +testuser=# SELECT relname, relpages FROM pg_class WHERE relkind = 'r' AND relname = 'sbtest_ustore'; + relname | relpages +---------------+---------- + sbtest_ustore | 256411 +(1 row) +``` + +# 最后 + +围绕openGauss出版的书藉以及openGauss开放社区,笔者想找到更多一些关于page、行组的资料,甚少!相对成熟的postgresql,postgresql能够提供很多方便成熟的插件扩展给DBA,DBA通过这些插件很方便 就完成对整个集群的监测洞悉。相反openGauss却需要通过数据字典查询,对openGauss来说,这是openGauss进步的空间! \ No newline at end of file diff --git "a/app/zh/blogs/\351\207\221\345\255\220/images/openGauss/pic1.png" "b/app/zh/blogs/\351\207\221\345\255\220/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b3a6e6b47bba1e2e0a43db350be2e2ee86cbbe0 Binary files /dev/null and "b/app/zh/blogs/\351\207\221\345\255\220/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\351\207\221\345\255\220/\350\256\260\345\275\225\344\270\200\346\254\241openGauss\347\251\272\351\227\264\350\206\250\350\203\200\347\232\204\346\225\205\351\232\234\346\216\222\346\237\245.md" "b/app/zh/blogs/\351\207\221\345\255\220/\350\256\260\345\275\225\344\270\200\346\254\241openGauss\347\251\272\351\227\264\350\206\250\350\203\200\347\232\204\346\225\205\351\232\234\346\216\222\346\237\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..b390b2c1be349f3a2615079f94cc8f23042da118 --- /dev/null +++ "b/app/zh/blogs/\351\207\221\345\255\220/\350\256\260\345\275\225\344\270\200\346\254\241openGauss\347\251\272\351\227\264\350\206\250\350\203\200\347\232\204\346\225\205\351\232\234\346\216\222\346\237\245.md" @@ -0,0 +1,139 @@ +--- +title: '记录一次openGauss空间膨胀的故障排查' + +date: '2024-05-22' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '金子' + +summary: '记录一次openGauss空间膨胀的故障排查' +--- + +# 故障背景 + +一次例行巡游中,突然发现生产环境硬盘使用量接近高峰值,仔细检查文件系统和操作系统,没有突加的文件,反是数据库增加了好多空间。再看关键生产库,发现表没有明显的增加,检查wal文件, 也没有生成 大量的文件, 看似指标一切正常。 + +文件系统正常正常,操作系统正常,最后发现是数据库的问题。数据库的空间膨胀了很多,一下冒泡出来的。 + + +# 故障分析 + +初步判断是增删查改过多,导致产生无效的数据太大,占用了大量的时间,因为是**开发使用的测试生产库**,快刀斩乱麻,执行常规命令搞一下 + + +``` +metadatabase=# vacuum analyze; +VACUUM +metadatabase=# vacuum freeze; +VACUUM +``` + +然而这个没有什么用,定位到具体的问题,原来是某个表很大,足足占了32G的空间 + +``` +[root@xxxx]# du -sh base/* +13M base/1 +13M base/15702 +32G base/15707 +14M base/33539 +240K base/pgsql_tmp + +# openGauss每生成文件到1.1G,以此单位为一个段,再生成第二个文件,依此类推 +[root@xxxx]# du -sh base/15707/* | grep G +1.1G base/15707/34237 +1.1G base/15707/34237.1 +1.1G base/15707/34237.10 +1.1G base/15707/34237.11 +1.1G base/15707/34237.12 +1.1G base/15707/34237.13 +1.1G base/15707/34237.14 +1.1G base/15707/34237.2 +1.1G base/15707/34237.3 +1.1G base/15707/34237.4 +1.1G base/15707/34237.5 +1.1G base/15707/34237.6 +1.1G base/15707/34237.7 +1.1G base/15707/34237.8 +1.1G base/15707/34237.9 +4.0K base/15707/PG_VERSION +``` + + +``` +# 不知道这个大表是什么,回到控制台发现一切正常,视图上找不到15707对应的表,只有两个表存在, 32G大表上哪里去了? +openGauss=# \dt+ +List of relations + Schema | Name | Type | Owner | Size | Storage | Description +--------+---------------+-------+-------+---------+------------------------------------------------------+------------- + public | sbtest_ustore | table | omm | 0 bytes | {orientation=row,storage_type=astore,compression=no} | + public | test1 | table | omm | 40 kB | {orientation=row,compression=no} | +(2 rows) + +``` + +查看之前历史活动记录,隐含一个长SQL,这个SQL生成了一个大表 + + +``` +insert into XXXXX(c0,c1,c2,c3) select s.a,('2024-X-XX XX:XX:38.000000'::timesta +mp) +concat(s.a/1000,'s')::INTERVAL, random(),md5(random()::text) FROM generate_series(1, 100000000) AS s(a); +``` + +这个SQL生成了大表,再经历一些XXX原因,在视图上逐渐的看不见 + +
+ + +# 故障解决 + + +与开发同事沟通交流,他们在测试过程中,制造了一些数据, 没有想到这个数据造成了这么大的伤害,自己也试了他们的生成数据语句,通过常规的pg_terminate_backend和pg_cancel_backend尝试把违规SQL删除。 + + +``` +#违规SQL +SELECT pg_cancel_backend(140513676097280); +#违规SQL +SELECT pg_terminate_backend(140513676097280); + +#发现generate insert的时候,无法杀掉线程,而且无法进行drop table XXX; + +#通过外围的方式 KILL 线程把openGauss重启 +``` + + +再次强调,这是一个生产测试库, 于是我使用暴力手段[root@xxxxdn]# rm -rf base/15707/34237*,那个大文件相关进行删除,整个天空都清静了。 + +删除物理文件如下,其中FSM文件是件空闲空间映射的作用,VM文件则是加快 VACUUM 清理的速度和降低对系统I/O性能的影响,两个都应用于vacuum快速清理的作用,其它的都隶属于表对应的具体物理数据文件。 + +![image](images/openGauss/pic1.png) + + +# 亡羊补牢 + + +## 对接研发 + +- 培训,对开发同事进行培训 ,包括SQL编写的规范和注意事项,以及generate函数的正常使用 + +- 制度, 一切因为造数开始,数据库组与开发组达成协议,以后开发同事不允许未经DBA同意,不能随意造数 + +- 流程,准备引入SQL审核系统, 接入研发提交的SQL请求,以后这样可以把不符合规则的SQL都挡在外面 + + +## 对应系统 + +虽然是测试系统,但是每天12点还是需要做一个物理备份,每天做3次快照备份,以备不患 + + +## 对应数据库厂商 + + +遇到无法解决且非常玄幻的问题找厂 商,截图、日志 、描写问题提交到openGauss社区 + + + + diff --git "a/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/images/openGauss/pic1.png" "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/images/openGauss/pic1.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b3a6e6b47bba1e2e0a43db350be2e2ee86cbbe0 Binary files /dev/null and "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/images/openGauss/pic1.png" differ diff --git "a/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1 dataVec\345\220\221\351\207\217\346\225\260\346\215\256\345\272\223\346\265\213\350\257\225.md" "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1 dataVec\345\220\221\351\207\217\346\225\260\346\215\256\345\272\223\346\265\213\350\257\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..1af4ba9cee7d95757fdfe9bfbe5ad98e502e4b1e --- /dev/null +++ "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1 dataVec\345\220\221\351\207\217\346\225\260\346\215\256\345\272\223\346\265\213\350\257\225.md" @@ -0,0 +1,199 @@ +--- +title: 'openGauss 6.0.0-RC1 dataVec向量数据库测试' + +date: '2024-05-27' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '风一样自由' + +summary: 'openGauss 6.0.0-RC1 dataVec向量数据库测试' +--- + +# 一、datavec概述 + + openGauss提供datavec Extension(版本为datavec-0.4.4)。datavec是一个基于openGauss的向量扩展,目前支持的向量功能有:精确和近似的最近邻搜索、L2距离&余弦距离&内积、向量索引、向量操作函数和操作符。作为openGauss的扩展,datavec 使用熟悉的SQL语法操作向量,简化了用户使用向量数据库的过程。 + +# 环境部署 + + +## 环境信息 + +|IP | 主机名 |版本|端口| +|---|---|---|---| +|192.168.59.149 |yf4|6.0.0-RC1|15000| +| + +### 部署方式1: + +
+ +1.编译安装openGauss。 + +2.将datavec源码拷贝到openGauss-server源码的contrib目录下。 + +3.进入datavec目录执行make install + +4.创建扩展extension + + +### 部署方式2:(本文选取方式2部署) + + +1.om安装的openGauss。 + +2.拷贝插件所需文件到指定路径下:datavec.so:app/lib/postgresql/。datavec.control和datavec--0.4.4.sql路径:app/share/postgresql/extension。 + +``` +ll /opt/openGauss/install/app/lib/postgresql/datavec.so + +[omm@yf4 ~]$ ll /opt/openGauss/install/app/lib/postgresql/datavec.so +-rw------- 1 omm dbgroup 75664 Mar 30 21:13 /opt/openGauss/install/app/lib/postgresql/datavec.so +ll /opt/openGauss/install/app/share/postgresql/extension/datavec* + +[omm@yf4 ~]$ ll /opt/openGauss/install/app/share/postgresql/extension/datavec* +-rw------- 1 omm dbgroup 9153 Mar 30 21:11 /opt/openGauss/install/app/share/postgresql/extension/datavec--0.4.4.sql +-rw------- 1 omm dbgroup 136 Mar 30 21:11 /opt/openGauss/install/app/share/postgresql/extension/datavec.control + +``` + + +3.创建扩展extension + +``` +create extension datavec; + +openGauss=# create extension datavec; +CREATE EXTENSION +``` + + +4.查看扩展datavec + +``` +select * from pg_extension where extname='datavec'; + +openGauss=# select * from pg_extension where extname='datavec'; + + extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition + +---------+----------+--------------+----------------+------------+-----------+-------------- + + datavec | 10 | 2200 | t | 0.4.4 | | + +(1 row) +``` + + +# 三、dataVec向量数据库测试 + + +## 1.创建一个有三维向量的表 + +``` +CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3)); + +openGauss=# CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3)); +NOTICE: CREATE TABLE will create implicit sequence "items_id_seq" for serial column "items.id" +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "items_pkey" for table "items" +CREATE TABLE + +``` + +## 2.插入向量数据 + +``` + +INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[7,8,9]'), ('[10,11,12]'), ('[13,14,15]'); + +openGauss=# INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[7,8,9]'), ('[10,11,12]'), ('[13,14,15]'); +INSERT 0 5 +``` + + + +## 3.更新向量数据 + +``` +UPDATE items SET embedding = '[1,2,3]' WHERE id = 1; + +openGauss=# UPDATE items SET embedding = '[1,2,3]' WHERE id = 1; +UPDATE 1 +``` + + +## 4.删除向量数据 + + +``` +DELETE FROM items WHERE id = 1; + +openGauss=# DELETE FROM items WHERE id = 1; +DELETE 1 +``` + + +## 5.获取最近邻 + +``` +SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5; + +openGauss=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5; + id | embedding----+------------ + 2 | [4,5,6] + 3 | [7,8,9] + 4 | [10,11,12] + 5 | [13,14,15] +(4 rows) +``` + + +## 6.获取距离 + +``` +SELECT embedding <-> '[3,1,2]' AS distance FROM items; + +openGauss=# SELECT embedding <-> '[3,1,2]' AS distance FROM items; + distance + +------------------ + 5.74456264653803 + 10.6770782520313 + 15.7797338380595 + 20.9284495364563 +``` + + +## 7.平均矢量 + + +``` +SELECT AVG(embedding) FROM items; + +openGauss=# SELECT AVG(embedding) FROM items; + avg + +---------------- + [8.5,9.5,10.5] +(1 row) +``` + +# 四、限制 + +暂时仅支持Create extension命令方式加载插件。 + +暂时仅支持ivfflat索引。 + +只支持行存表。 + +索引WAL日志功能待完善,可能出现重启索引失效。 + + +# 五、总结 + + datavec是一款轻量级,低耦合,便于安装的向量数据库插件,作为为专有大模型的向量数据存储和检索的底座,支持向量数据的存储、 相似度计算,支持针对向量数据建立索引(IVFFLAT),加速查询且支持大多向量计算,是向量数据存储与计算不错的选择。 + + + diff --git "a/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1\351\200\273\350\276\221\345\244\215\345\210\266\347\211\271\346\200\247\346\265\213\350\257\225.md" "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1\351\200\273\350\276\221\345\244\215\345\210\266\347\211\271\346\200\247\346\265\213\350\257\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..34be888136bff4d11b8f05cb5944110d30042d01 --- /dev/null +++ "b/app/zh/blogs/\351\243\216\344\270\200\346\240\267\350\207\252\347\224\261/openGauss 6.0.0-RC1\351\200\273\350\276\221\345\244\215\345\210\266\347\211\271\346\200\247\346\265\213\350\257\225.md" @@ -0,0 +1,381 @@ +--- +title: 'openGauss 6.0.0-RC1逻辑复制特性测试' + +date: '2024-05-24' + +tags: ['openGauss技术文章征集', 'openGauss'] + +archives: '2024-05' +category: 'blog' +author: '风一样自由' + +summary: 'openGauss 6.0.0-RC1逻辑复制特性测试' +--- + +# 一、环境部署 + +## 服务器信息 + +| | IP |主机名|版本|端口| +|---|---|---|---|---| +|发布端(源端)|192.168.59.149|6.0.0-RC1|15000| +|订阅端(目标端)|192.168.59.151|yf5|6.0.0-RC1|15000| +| + +## 1.修改配置文件 + +``` +发布端: + +cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF" + +wal_level=logical + +max_replication_slots=8 + +EOF + +wal_level:必须设置logical才支持逻辑复制 + +max_replication_slots>=每个节点所需的(物理流复制槽数+逻辑复制槽数) + +cat >> /opt/openGauss/install/data/dn1/pg_hba.conf << "EOF" + +host replication repl 0.0.0.0/0 sha256 + +EOF + +订阅端: + +cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF" + +wal_level=logical + +max_replication_slots=8 + +EOF + +修改完发布端与订阅端参数文件,重启生效。 + +gs_om -t restart +``` + +## 2.发布端创建逻辑复制用户 + + + +``` +gsql -d postgres -p 15000 -c "CREATE USER repl REPLICATION SYSADMIN LOGIN ENCRYPTED PASSWORD 'repl@123'" + +[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE USER repl REPLICATION SYSADMIN +LOGIN ENCRYPTED PASSWORD 'repl@123'" +CREATE ROLE +``` + +注:用户需具有SYSADMIN、REPLICATION权限用户 + + +## 3.发布端创建表 + +``` +gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)" + +[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name + varchar(10),create_time timestamp)" +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "logical_tb1_pkey" for table "logical_tb1" +CREATE TABLE +``` + +## 4.发布端创建发布 + +``` +gsql -d postgres -p 15000 -c "CREATE PUBLICATION pub1 FOR ALL TABLES with(publish='insert,update,delete',ddl='table')" + +[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "CREATE PUBLICATION pub1 FOR ALL TABLES +with(publish='insert,update,delete',ddl='table')" +CREATE PUBLICATION +``` + + +查询发布信息 + +``` +gsql -d postgres -p 15000 -c "select * from pg_publication" + +[omm@yf4 opt]$ gsql -d postgres -p 15000 -c "select * from pg_publication"pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubddl + +---------+----------+--------------+-----------+-----------+-----------+------- + +pub1 | 10 | t | t | t | t | 1 + +(1 row) +``` + +## 5.订阅端创建表 + +``` +gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name varchar(10),create_time timestamp)" + +[omm@yf5 ~]$ gsql -d postgres -p 15000 -c "CREATE TABLE logical_tb1(id int primary key,name + varchar(10),create_time timestamp)"NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "logical_tb1_pkey" for table "logical_tb1" +CREATE TABLE +``` + + +## 6.订阅端创建加密文件 + +``` +gs_ssh -c "gs_guc generate -S repl@123 -D $GAUSSHOME/bin -o subscription" + +[omm@yf5 ~]$ gs_ssh -c "gs_guc generate -S repl@123 -D $GAUSSHOME/bin -o subscription"Successfully execute command on all nodes. + +Output:[SUCCESS] yf5: +The gs_guc run with the following arguments: [gs_guc -S *** -D /opt/openGauss/install/app/bin -o subscription generate ]. +gs_guc generate -S *** +``` + +## 7.订阅端创建订阅 + +``` +gsql -d postgres -p 15000 -c "CREATE SUBSCRIPTION sub1 CONNECTION + + 'host=192.168.59.149 port=15001 dbname=postgres user=repl password=repl@123' PUBLICATION pub1" + +[omm@yf5 ~]$ gsql -d postgres -p 15000 -c "CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.59.149 port=15001 dbname=postgres user=repl password=repl@123' PUBLICATION pub1"NOTICE: created replication slot "sub1" on publisher +CREATE SUBSCRIPTION +``` + +注:端口号不能使用主端口,应该使用主端口+1端口,否则会与线程池冲突。 + +## 8.查看发布订阅信息 + +``` +发布端: + +查看发布信息 + +select * from pg_publication; + +openGauss=# select * from pg_publication; pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubdd +---------+----------+--------------+-----------+-----------+-----------+------ +pub1 | 10 | t | t | t | t | 1 +(1 row) +``` + +发布端查看复制槽 + +``` +SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1'; + +openGauss=# SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1'; + slot_name | plugin | slot_type | database | active | restart_lsn +-----------+----------+-----------+----------+--------+------------- + sub1 | pgoutput | logical | postgres | t | 0/2493A48 +(1 row) +``` + + +订阅端: + +查看订阅信息 + +``` +select * from pg_subscription; + +openGauss=# select * from pg_subscription; + + + +subdbid | subname | subowner | subenabled | +subconninfo | subslotname | subsynccommit | subpublications | subbinary | subskiplsn | submatchddlowner + +---------+---------+----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------------+---------- +-------+-----------+------------+------------------ +15737 | sub1 | 10 | t +| host=192.168.59.149 port=15001 dbname=postgres user=repl password=encryptOpty+wL5qbR/g1duD+0mVBEBTPUHu/DqESpg30CN6Bbh8go4hKEMAlGiKf8KtM6klUb +| sub1 | off | {pub1} | f | 0/0 | t + +(1 row) +``` + + +# 二、逻辑复制测试 + +数据同步测试 + + +## 1.发布端插入数据 + + +``` +insert into logical_tb1 values(1,'yyf','2024-05-24'),(2,'jjj','2024-05-24'); +``` + + +## 2.查看数据同步情况 + +``` +发布端: + +select * from logical_tb1; + +openGauss=# select * from logical_tb1 ; + id | name | create_time +----+------+--------------------- + 1 | yyf | 2024-05-24 00:00:00 + 2 | jjj | 2024-05-24 00:00:00 +(2 rows) +订阅端 + +select * from logical_tb1; + +openGauss=# select * from logical_tb1; + id | name | create_time +----+------+--------------------- + 1 | yyf | 2024-05-24 00:00:00 + 2 | jjj | 2024-05-24 00:00:00 +(2 rows) +DDL同步测试(6.0版本新增功能) +``` + + +## 1.查看发布端与订阅端表 + +``` +发布端: + +\d+ + +openGauss=# \d+ + List of relations + Schema | Name | Type | Owner | Size | Storage | Description +--------+-------------+-------+-------+------------+----------------------------------+------------- +public | logical_tb1 | table | omm | 8192 bytes | {orientation=row,compression=no} | +(1 row) +订阅端: + +\d+ + +openGauss=# \d+ + List of relations + Schema | Name | Type | Owner | Size | Storage | Description +--------+-------------+-------+-------+------------+----------------------------------+------------ +- public | logical_tb1 | table | omm | 8192 bytes | {orientation=row,compression=no} | +(1 row) +``` + + +## 2.发布端删除表 + +``` +drop table logical_tb1; + +\d+ + +openGauss=# drop table logical_tb1; +DROP TABLE +openGauss=# \d+ +No relations found. +3.查看订阅端表 + +\d+ + +openGauss=# \d+ +No relations found. +``` + +# 三、逻辑复制发布及订阅其它相关操作 + +``` +发布端: + +--创建一个发布,发布两个表中所有更改。 + +CREATE PUBLICATION mypublication FOR TABLE users, departments; + +--创建一个发布,发布所有表中的所有更改。 + +CREATE PUBLICATION alltables FOR ALL TABLES; + +--创建一个发布,只发布一个表中的INSERT操作。 + +CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert'); + +--修改发布的动作。 + +ALTER PUBLICATION insert_only SET (publish='insert,update,delete'); + +--向发布中添加表。 + +ALTER PUBLICATION insert_only ADD TABLE mydata2; + +--删除发布。 + +DROP PUBLICATION insert_only; + +--创建一个发布,发布所有的DDL操作 + +CREATE PUBLICATION ddl_all FOR ALL TABLES WITH (ddl='all'); + +--创建一个发布,发布类型为TABLE的DDL操作 + +CREATE PUBLICATION ddl_all FOR ALL TABLES WITH (ddl='table'); + +订阅端: + +--创建一个到远程服务器的订阅,复制发布mypublication和insert_only中的表,并在提交时立即开始复制。 + +CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=15000 user=foo dbname=foodb password=xxxx' PUBLICATION mypublication, insert_only; + +--创建一个到远程服务器的订阅,复制insert_only发布中的表, 并且不开始复制直到稍后启用复制。 + +CREATE SUBSCRIPTION mysub CONNECTION 'host=192.168.1.50 port=15000 user=foo dbname=foodb password=xxxx ' PUBLICATION insert_only WITH (enabled = false); + +--修改订阅的连接信息。 + +ALTER SUBSCRIPTION mysub CONNECTION 'host=192.168.1.51 port=15000 user=foo dbname=foodb password=xxxx'; + +--激活订阅。 + +ALTER SUBSCRIPTION mysub SET(enabled=true); + +--删除订阅。 + +DROP SUBSCRIPTION mysub; +``` + +# 四、限制 + +发布订阅基于逻辑复制实现,继承所有逻辑复制的限制,同时发布订阅还有下列额外的限制或者缺失的功能。 + +1.数据库模式和DDL命令不会被复制。初始模式可以手工使用gs_dump --schema-only进行拷贝。后续的模式改变需要手工保持同步。 + +2.序列数据不被复制。后台由序列支撑的serial或者标识列中的数据当然将被作为表的一部分复制,但是序列本身在订阅者上仍将显示开始值。如果订阅者被用作一个只读数据库,那么这通常不会是什么问题。不过,如果订阅者数据库预期有某种转换或者容错,那么序列需要被更新到最后的值,要么通过从发布者拷贝当前数据的防范(也许使用gs_dump),要么从表本身决定一个足够高的值。 + +3.只有表支持复制,包括分区表。试图复制其他类型的关系,例如视图、物化视图或外部表,将会导致错误。 + +4.同一数据库内的多个订阅不应当订阅内容重复的发布(指发布相同的表),否则会产生数据重复或者主键冲突。 + +5.如果被发布的表中包含不支持btree/hash索引的数据类型(如地理类型等),那么该表需要有主键,才能成功的复制UPDATE/DELETE操作到订阅端。否则复制会失败,同时订阅端会出现“FATAL: could not identify an equality operator for type xx”的日志。 + +6.当前gs_probackup工具已支持备份发布订阅的逻辑复制槽,因此可使用gs_probackup或gs_basebackup工具备份发布端。注意当恢复到非最新时间点时,由于订阅端复制源记录的remote_lsn可能大于发布端当前的wal日志插入位置,因此在这之间提交的事务无法被解码复制,在remote_lsn之后提交的事务才被解码。 + +7.产生列不会被复制,即如果发布端和订阅端的产生列计算定义不同,那么该列的值也会不一致 + + +# 五、总结 + + + 通过以上测试,opengauss 6.0版本较5.0版本逻辑复制新增DDL同步功能,仅支持部分DDL同步,如CREATE/DROP TABLE|TABLE PARTITION、CREATE/DROP INDEX,不支持ALTER TABLE操作,如遇到此需求,需手动操作,且逻辑复制本身限制比较多,带来使用不便。opengauss在逻辑复制功能方面不断冲破限制,提高功能的完整性,希望opengauss再接再厉,再创辉煌。 + + + + + + + + + + + +