• [运维管理] GaussDB A 8.1.1.3版本集群为什么不建议大表update或大量不同表的update?
    GaussDB A 8.1.1.3版本集群为什么不建议大表大数据量update或大量不同表的update?
  • [问题求助] 【香港启德项目】Roma平台接口查询结果显示能否按照脚本中的别命名显示
    1.Roma平台接口查询结果显示能否按照脚本中的别命名显示,不要统一转成小写王斌国/18629429514/wangbinguo@chinasoftinc.com
  • [技术干货] GaussDB(DWS)通过schema分析数据倾斜方法
    通过schema分析数据倾斜方法: --查询schema倾斜情况 方法1:(存在误差) select * from pgxc_total_schema_info_analyze where databasename='wt' and schemaname='public'; --集群整体的Schema空间信息,包括:集群空间总值、各实例空间平均值、倾斜率、单实例空间最大值、单实例空间最小值以及最大最小空间所在的实例名。 select nodename,sum(usedspace) as size_b,pg_size_pretty(size_b) as size from pgxc_total_schema_info where databasename='postgres' and schemaname = 'public' and nodename like  'dn_%' group by 1 order by size_b desc limit 10; --集群所有实例上的Schema空间信息,便于用户获悉集群各个实例上的Schema空间使用情况。 如果以上查询结果差异较大,可以使用以下空间校准函数对pgxc_total_schema_info和pgxc_total_schema_info_analyze结果进行校准: select pgxc_wlm_readjust_relfilenode_size_table();  方法2:(真实值) select nodename,sum(dnsize)as size_b,pg_size_pretty(size_b) as size from (select split_part(tab_info,',',3) as nodename,split_part(tab_info,',',4) as dnsize from (select regexp_replace(table_distribution(schemaname,tablename)::text,'[\(\)]','','g') as tab_info from pg_tables where schemaname='public')) group by nodename order by size_b desc;  --查询schema下表倾斜情况 SELECT schemaname, tablename, totalsize, round(avg(dnsize)) as avgsize,round(max(dnsize)/(totalsize+0.00001)*100,2) as maxratio, round(min(dnsize)/(totalsize+0.00001)*100,2) as minratio,(max(dnsize) - min(dnsize))  AS skewsize,(max(ratio) - min(ratio))::numeric(6,2) AS skewratio, round(stddev(dnsize)) AS skewstddev  FROM (SELECT schemaname, tablename, dnsize, totalsize, (round(dnsize/(totalsize+0.00001), 4) * 100) AS ratio FROM (SELECT schemaname, tablename, dnsize, sum(dnsize) OVER (PARTITION BY schemaname,tablename) AS totalsize from (select split_part(tab_info,',',1) as schemaname,split_part(tab_info,',',2) as tablename,split_part(tab_info,',',4)::number as dnsize from (select regexp_replace(table_distribution(schemaname,tablename)::text,'[\(\)]','','g') as tab_info from pg_tables where schemaname='public')))) GROUP BY schemaname, tablename,totalsize order by skewratio desc,skewstddev desc;  --查询单表数据分布情况 select *,pg_size_pretty(dnsize) as size from table_distribution('public.xg_test') order by dnsize desc; 
  • [技术干货] GaussDB(DWS)一分钟定位锁问题
    我们经常遇见等锁问题,通过视图查询非常繁琐,我们可以通过如下方式快速准确找到持锁的语句: set lockwait_timeout=1000;    --表锁等待超时时间,默认20min,单位: ms set update_lockwait_timeout=1000;  --行锁等待超时时间,默认2min set max_query_retry_times=0;  -- cn_retry 次数,默认为6次 设置完成后,执行等锁的语句。很快就会报错,根据报错信息可以快速找到持锁线程和语句。示例: 会话一 :start transaction;   drop table aa;  会话二 :set lockwait_timeout=1000; set update_lockwait_timeout=1000; set max_query_retry_times=0; select * from aa; 此时会话二会很快报错,通过报错信息很快就能找到持锁语句和线程: ERROR:  Lock wait timeout: thread 140354461361920 on node coordinator1 waiting for AccessShareLock on relation 16655 of database 14764 after 2000.057 ms LINE 1: select * from aa;                       ^ DETAIL:  blocked by hold lock thread 140354804238080, statement <drop table aa;>, hold lockmode AccessExclusiveLock. 找到持锁线程并从业务侧确认可以杀掉该线程后,可以登录对应的实例(上面报错是coordinator1,实际可能是其他实例),使用如下语句杀掉该线程: select pg_terminate_backend(140354804238080); 也可以通过在CN上执行以下语句杀掉 excute direct on(xxxx) select pg_terminate_backend(140354804238080);  (xxxx为报错的实例名称) 杀掉后,可以通过下面语句确认是否已经杀掉: select * from pgxc_stat_activity where pid='140354804238080'; 确认杀掉后,重新执行语句即可。 
  • [迁移系列] 【TD语法迁移】QUANTILE分析函数替换
    Quantile 分位数函数 1) Teradata语法: Quantile(分位值,排序字段)    分位数用于将一组记录分成大致相等的部分;    最常见的分位数是百分位数(基于100),也有4、3、10分位数;    分位数的列和值都按升序输出;     2) 举例 2.1) 例子1 SELECT salesdate, sales, Quantile(100,sales) FROM daily_sales WHERE salesdate ='2023-02-16' AND itemid = 10; -- 替换等价SQL: SELECT salesdate, sales, floor((RANK() OVER (ORDER BY sales) - 1) * 100 / COUNT(*) OVER()) FROM daily_sales WHERE salesdate ='2023-02-16' AND itemid = 10; -- 返回结果示例  salesdate| sales| floor  ----------+------+------ 2023-02-16| 1.10 | 0 2023-02-16| 1.10 | 0 2023-02-16| 1.20 | 33 2023-02-16| 1.30 | 50 2023-02-16| 1.40 | 66 2023-02-16| 1.50 | 83 
  • [迁移系列] 【TD语法迁移】MLINREG分析函数替换
    MLinreg 线性回归预测函数 >暂无法较为简洁替换,如果简洁方式,欢迎交流。1) Teradata语法: MLinreg(y,n,x)    指基于一个"序列数据对"得到一个预测值;    "序列对"包含一个独立的变量和一个依赖变量;    函数基于前面的n"对数"预期依赖变量的值;    函数基于前面n-1行计算y值;    y是依赖变量、x是独立变量也是排序值;    y和x必须是数字列;    3<=n<=4096;        /*        sum(x*y) - sum(x)*sum(y)/n    B = --------------------------        sum(x*x)-sum(x)*sum(x)/n    A = sum(y)/n-B*sum(x)/n    预测y = A+B*x  --此处x指第n行给定的x    */     2) 举例 2.1) 例子1 SELECT x,y, MLinreg(y, 3, x) FROM linreg; -- 替换等价SQL: select x,y,cast(a+b*x as int) as MlinReg from ( select x,y,b,aay-b*aax as a  from ( select x,y,regr_sxy/nullif(regr_sxx,0) b,aay,aax from ( select x,y,lag(xy-sx*ay,1) over(order by x) as regr_sxy, lag(xx-sx*ax,1) over(order by x) as regr_sxx, lag(ay,1) over(order by x) as aay, lag(ax,1) over(order by x) as aax from ( select x,y,sum(x*y) over(order by x rows 1 preceding) xy, -- 3-2=1 preceding sum(x) over(order by x rows 1 preceding) sx, avg(y) over(order by x rows 1 preceding) ay, sum(x*x) over(order by x rows 1 preceding) xx, avg(x) over(order by x rows 1 preceding) ax  from t) t1 ) t2 )t3)t4 ; -- 返回结果示例  x | y | MlinReg  ---+---+--------  1 | 2 | Null  2 | 4 | Null  3 | 6 | 6  --从3开始  4 | 7 | 8  5 | 8 | 8  6 | 4 | 9  7 | 6 | 0  8 | 5 | 8  9 |10 | 4 10 |15 | 15  2.2) 例子2 SELECT x,y, MLinreg(y, 6, x) FROM linreg; -- 替换等价SQL: select x,y,cast(a+b*x as int) as MlinReg from ( select x,y,b,aay-b*aax as a  from ( select x,y,regr_sxy/nullif(regr_sxx,0) b,aay,aax from ( select x,y,lag(xy-sx*ay,1) over(order by x) as regr_sxy, lag(xx-sx*ax,1) over(order by x) as regr_sxx, lag(ay,1) over(order by x) as aay, lag(ax,1) over(order by x) as aax from ( select x,y,sum(x*y) over(order by x rows 4 preceding) xy, -- 6-2=1 preceding sum(x) over(order by x rows 4 preceding) sx, avg(y) over(order by x rows 4 preceding) ay, sum(x*x) over(order by x rows 4 preceding) xx, avg(x) over(order by x rows 4 preceding) ax  from t) t1 ) t2 )t3)t4 ; -- 返回结果示例  x | y | MlinReg  ---+---+--------  1 | 2 | Null  2 | 4 | Null  3 | 6 | 6  --从3开始  4 | 7 | 8  5 | 8 | 9  6 | 4 | 10  7 | 6 | 6  8 | 5 | 5  9 |10 | 4 10 |15 | 8 
  • [迁移系列] 【TD语法迁移】MDIFF分析函数替换
    -- MDiff 移动汇总 1) Teradata语法: MDiff(colname,n,sort_list)    指基于预定的行数n计算一列的移动差分值;    若前面的行数小于n,则产生NULL值;    指根据sort_list字段列信息进行逐步差分;    n<4096;     2) 举例 SELECT salesdate, sales, MDiff(sales, 3, salesdate) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 替换等价SQL: SELECT salesdate, sales, sales-lag(sales,3) over(ORDER BY salesdate ASC) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 返回结果示例  salesdate| sales| sum  ----------+------+------ 2023-02-16| 1.00 | Null 2023-02-17| 2.00 | Null --没有间隔2行 2023-02-18| 3.00 | Null  2023-02-19| 4.00 | 3.00 --间隔2行的差值 2023-02-28| 5.00 | 3.00 2023-03-17| 6.00 | 3.00 --间隔2行的差值 
  • [迁移系列] 【TD语法迁移】MAVG分析函数替换
    -- MAvg 移动汇总 1) Teradata语法: MAvg(colname,n,sort_list)    指基于预定的行数n计算一列的移动平均值;    若前面的行数小于n,则使用前面所有行;    指根据sort_list字段列信息进行逐步平均;    n<4096;     2) 举例 SELECT salesdate, sales, MAvg(sales, 3, salesdate) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 替换等价SQL: SELECT salesdate, sales, avg(sales) over(ORDER BY salesdate ASC rows 2 preceding) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 返回结果示例  salesdate| sales| sum  ----------+------+------ 2023-02-16| 1.00 | 1.00 2023-02-17| 2.00 | 1.50 --前2行平均 2023-02-18| 3.00 | 2.00 --前3行平均 2023-02-19| 4.00 | 3.00 2023-02-28| 5.00 | 4.00 2023-03-17| 6.00 | 5.00 --前3行平均 
  • [迁移系列] 【TD语法迁移】MSUM分析函数替换
    MSum 移动汇总 、 移动求和1) Teradata语法: MSum(colname,n,sort_list)    指基于预定的行数n计算一列的移动汇总值;    若前面的行数小于n,则使用前面所有行;    指根据sort_list字段列信息进行逐步累加     2) 举例 SELECT salesdate, sales, msum(sales, 3, salesdate) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 替换等价SQL: SELECT salesdate, sales, SUM(sales) over(ORDER BY salesdate ASC rows 2 preceding) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 返回结果示例  salesdate| sales| sum  ----------+------+------ 2023-02-16| 1.10 | 1.10 2023-02-17| 1.20 | 2.30 --前2行求和 2023-02-18| 1.30 | 3.60 --前3行求和 2023-02-19| 1.40 | 3.90 2023-02-28| 1.50 | 4.20  2023-03-17| 1.10 | 4.00 --前3行求和 
  • [迁移系列] 【TD语法迁移】CSUM分析函数替换
    CSum 累计求和 1) Teradata语法: CSum(colname,sort_list)    指计算一列的连续累计值;    指根据sort_list字段列信息进行逐步累加;     2) 举例 2.1) 无group by场景 SELECT salesdate, sales, csum(sales, salesdate) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 替换等价SQL: SUM(sales) over(ORDER BY salesdate ASC)SELECT salesdate, sales, SUM(sales) over(ORDER BY salesdate ASC) FROM daily_sales WHERE salesdate BETWEEN 980101 AND 980301 AND itemid = 10; -- 返回结果示例  salesdate| sales| sum  ----------+------+------ 2023-02-16| 1.10 | 1.10 2023-02-17| 1.20 | 2.30 2023-02-18| 1.30 | 3.60 2023-02-19| 1.40 | 5.00 2023-02-28| 1.50 | 6.50 2023-03-17| 1.10 | 7.60 2.2) 有groupby场景 SELECT salesdate, sales, csum(sales, salesdate) FROM daily_sales ds, sys_calendar.calendar sc WHERE ds.salesdate = sc.calendar_date AND sc.year_of_calendar = 1998 AND sc.month_of_year in (1,2) AND ds.itemid = 10 GROUP BY sc.month_of_year; -- 替换等价SQL: SUM(sales) over(partition by sc.month_of_year ORDER BY salesdate ASC)SELECT salesdate, sales, SUM(sales) over(partition by sc.month_of_year ORDER BY salesdate ASC) FROM daily_sales ds, sys_calendar.calendar sc WHERE ds.salesdate = sc.calendar_date AND sc.year_of_calendar = 1998 AND sc.month_of_year in (1,2) AND ds.itemid = 10; -- 返回结果示例  salesdate| sales| sum  ----------+------+------ 2023-02-16| 1.10 | 1.10 2023-02-17| 1.20 | 2.30 2023-02-18| 1.30 | 3.60 2023-02-19| 1.40 | 5.00 2023-02-28| 1.50 | 6.50 2023-03-17| 1.10 | 1.10
  • [技术干货] 【FAQ合集贴】GaussDB "常见问题" 及 "解决方案"(内容持续更新中......)
    1. 连接 GaussDB 数据库建议使用什么工具开源免费的DBMS,可以考虑 DBeaver破解收费版的,可以考虑 Navicatdata studio连高斯可能会存在报文异常导致连接无法中断的问题,不建议用(2023-02-24)如果是网页版的,直接用华为云DAS即可(https://www.huaweicloud.com/product/das.html)2. GaussDB的支持哪些hint可以参考开发者指南:分布式:cid:link_0主备版:cid:link_13. 数据库存入空字符串会全部被转成NULL,这个能控制不转吗不能。目前默认都是Oracle兼容性,没有单独的参数开关4. GaussDB create sequence有if not exists 的类似写法吗目前没有。create sequence 的语法格式如下CREATE [LARGE] SEQUENCE name [INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];5. GaussDB中的varchar(n)数据类型中的n是字符还是字节?存汉字的时候报错长度过长VARCHAR(n),变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。要存1个汉字用nvarchar2(1)。NVARCHAR2(n)变长字符串。n是指字符长度。6. GausssDB有select * from DBA_INDEXS这样的视图吗可以使用 select * from pg_indexes。GaussDB大部分都是PgSQL的源码,所以有问题不懂,直接查PG的语法即可7. "cache lookup failed for type XXX"报错什么原因自定义类型失败了,需要重新创建8. GaussDB中文排序使用order by好像是不准确的,应该怎么解决用 nlssort(string text, sort_method text)描述:以 sort_method 指定的排序方式返回字符串在该排序模式下的编码值,该编码可用于排序,其决定了string在这种排序模式下的先后位置。目前支持的sort_method为nls_sort=schinese_pinyin_m和nls_sort=generic_m_ci。其中,nls_sort=generic_m_ci仅支持纯英文不区分大小写排序示例:SELECT nlssort('A', 'nls_sort=chinese_pinyin_m');SELECT nlssort('A', 'nls_sort=generic_m_ci');参考SQL:SELECT * FROM <表> ORDER BY NLSSORT(<待排序的列>, 'NLS_SORT = SCHINESE_PINYIN_M');9. 高斯数据库建表的ddl,如果有分区的话为什么看不到了可以使用select pg_get_tabledef(<表名>)语句查看,如果使用DBeaver视图上是看不到的10. 通过sys.db_tables查询到数据库的全量表信息,但是发现有些表的信息(行数、列数)不是当前最新的,请问有什么方法可以实现表信息定时更新吗可以使用vacuum analyze更新表的统计信息cid:link_2table_name 要统计的表的名称(可以有模式修饰)。 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。也可以尝试下面SQLuse information_schema;select sum(table_rows) from tables where TABLE_SCHEMA = "test" order by table_rows asc;11. 什么场景会触发GaussDB主备切换主机故障会触发主备切换,故障包括进程重启,磁盘故障,服务器掉电,重启,网络故障等等。升级版本时会重启进程,也会主备切换。可以通过CPU的监控指标判断是否主备切换,主备切换时, 两个节点的CPU会交叉。主机CPU一般比较高,切换时,原来的主机CPU降低,备机升主CPU升高。12. opengauss有行转列的函数吗参考unnest描述:扩大一个数组为一组行返回类型:setof anyelement示例:openGauss=# SELECT unnest(ARRAY[1,2]) AS RESULT;result--------12(2 rows)13. openGauss数据库连接串的参考样例jdbc:opengauss://${DNS1}:8000,${DNS2}:8000,${DNS3}:8000/${database}?targetServerType=master&connectTimeout=3&tcpKeepAlive=true14. GaussDB列存支持物化视图吗astore支持,ustore不支持15. 许多表预估行数为0,并且也没有自动分析,怎么解决执行analyze可以分析全库select pg_autovac_status('table_name'::regclass); 可以找一个没分析的表看下为什么没有触发自动分析16. java连接GaussDB的代码范例连接代码如下:public static void main(String[] args){ // 驱动程序名 String driver = "com.mysql.jdbc.Driver"; // URL指向要访问的数据库名scutcs String url = "jdbc:mysql://127.0.0.1:3306/scutcs"; // MySQL配置时的用户名 String user = "root"; // MySQL配置时的密码 String password = "root"; try { // 加载驱动程序 Class.forName(driver); // 连续数据库 Connection conn = DriverManager.getConnection(url, user, password); if(!conn.isClosed()) { //执行你的操作 conn.close(); } } catch(IOException e) { e.printStackTrace(); }}17. 创建索引时报file size exceeds temp_file_limit,怎么处理问题原因SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GBERROR: temporary file size exceeds temp_file_limit (104857600kB)这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小解决方案查看当前的临时表空间上限并增加该上限1.进入你的DBMS,打开SQL控制台/SQL脚本2.使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)3.使用 alter role all set temp_file_limit = [$Temp_File_Limit],增加临时表空间上限(单位为kb)4.最后使用 show temp_show_limit 确认修改结果是否生效注意: 如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定18. 查询JOB用什么办法查询pg_job系统表PG_JOBS系统表存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询pg_jobs系统表中的时间,当任务到期会触发任务的执行。该系统表属于Shared Relation,所有创建的job记录对所有数据库可见。检查定时任务检查数据库定时任务执行情况,确保后台任务正确执行,尤其关心统计信息收集等核心任务。SQL命令如下select job,dbname,log_user,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs;查询用户的定时任务(job)信息,确保任务在期望的时间执行成功,这是dba的重要工作之一。SQL命令如下select job_id,dbname,log_user,start_date,last_satrt_date,this_run_date,next_run_date,interval,failure_count from pg_job;19. 已经改了字段类型为date,为什么查询建表语句的时候还是timestamp可以参考下这个文档:cid:link_3A兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。例如:4字节(兼容模式A下存储空间大小为8字节)创建数据库时,可通过DBCOMPATIBILITY参数指定兼容的数据库的类型,DBCOMPATIBILITY取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。如果创建数据库时不指定该参数,则默认为ORA,在ORA兼容模式下,date类型会自动转换为timestamp(0)。20. Data studio打开显示同一用户不能打开多个实例官网手册上显示 Data Studio 不支持同时打开多个实例本地datastudio工作空间实例锁未删除,需要手工删除安装目录下的.lock文件(关闭datastudio后再删除,或者删除整个用户空间)21. 执行分区报错执行SQLCREATE TABLE list_list( month_code VARCHAR2 ( 30 ) NOT NULL , dept_code VARCHAR2 ( 30 ) NOT NULL , user_no VARCHAR2 ( 30 ) NOT NULL , sales_amt int)PARTITION BY LIST (month_code) SUBPARTITION BY LIST (dept_code)( PARTITION p_201901 VALUES ( '201902' ) ( SUBPARTITION p_201901_a VALUES ( '1' ), SUBPARTITION p_201901_b VALUES ( '2' ) ), PARTITION p_201902 VALUES ( '201903' ) ( SUBPARTITION p_201902_a VALUES ( '1' ), SUBPARTITION p_201902_b VALUES ( '2' ) ));报错内容SQL 错误 [0A000] ERROR: Un-support feature 详细:The distributed capability is not supported currently.原因:分布式暂时不支持二级分区22. 查询的时候偶尔会出息如下报错org.postgresql.util.PSQLException: [***:30814/***:8000] ERROR: dn_6007_6008_6009: snapshot is not owned by resource owner TopTransaction排查方向:看下pg_log/postgresql-xxx.log打印的内核堆栈原因:自动提交读取的就是快照数据,这里出问题了23. 数据API开发sql语句开启预编译后sql报错在测试api的时候发现语句:(current_date - interval '${num}' day),会因为预编译而导致执行sql出错的问题。gaussdb原语句是(current_date - interval '30' day),因为涉及到多个参数且参数类型不同尝试过cast('${num}' as int)方法不成功也尝试过使用’'两个双引号来转义也不行取消勾选预编译后语句是可以正常运行的请问是否还有其他方法可以在满足预编译的情况下成功执行这句话?答:加强制类型转换24. 如何使用java开发对openguass数据库的应用分布式参考:cid:link_4集中式参考:cid:link_525. 查询的时候报如下错误,怎么处理ERROR: canceling statement due to conflict with recoveryDetail: User query might have needed to see row versions that must be removed.Line Number: 1问题原因当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。解决方案有以下两种方案可以避免这种查询取消的情况:在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。解决方案有以下两种方案可以避免这种查询取消的情况:在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。26. GaussDB怎么查询分区表的索引信息1.pg_partition里有2.或者用pg_get_tabledef查表定义,包含索引创建语句3.或者查询PG_INDEXES视图示例:分区表上的索引分为:本地(局部)索引(local index) 和 全局索引(global index)SELECT n.nspname AS schemaname, --schema名称 c1.relname AS tablename, -- 表名 c2.relname AS indexname, -- 索引名称 s.conname AS conname, -- 约束名称 pg_get_constraintdef(s.oid) AS constraintdef, -- 如果是约束,输出约束定义 CASE WHEN s.conname IS NULL THEN pg_get_indexdef(x.indexrelid) END AS indexdef -- 如果不是约束,输出索引定义FROM pg_index xINNER JOIN pg_class c1 ON c1.oid = x.indrelidINNER JOIN pg_class c2 ON c2.oid = x.indexrelidINNER JOIN pg_namespace n ON n.oid = c1.relnamespaceLEFT JOIN pg_constraint s ON s.conrelid = x.indrelid AND s.conindid = x.indexrelidWHERE (x.indisprimary = true OR x.indisunique = true)AND c1.relkind = 'r'AND x.indrelid >= 16384 AND x.indexrelid > 16384AND (c1.reloptions IS NULL OR c1.reloptions::text not like '%internal_mask%') -- 排除内置对象ORDER BY schemaname, tablename, indexname27. 自定义的函数,存储过程存在后台哪个目录?误删的数据怎么找回?试下闪回功能openGauss=# SELECT * FROM tpcds.time_table TIMECAPSULE TIMESTAMP to_timestamp('2021-04-25 17:50:22.311176','YYYY-MM-DD HH24:MI:SS.FF'); idx | snaptime | snapcsn | timedesc-----+----------------------------+---------+------------------------------------------------------------------------------------------------------ 1 | 2021-04-25 17:50:05.360326 | 107322 | time1 2 | 2021-04-25 17:50:10.886848 | 107324 | time2 3 | 2021-04-25 17:50:16.12921 | 107327 | time3(3 rows)参考:cid:link_628. 数据库导出的数据会默认省略整数位的0。知会省略0,例如0.11导出以后就变成 .1了,导入导致各种报错这是Oracle兼容性导致的问题。想要显示整数位的0的话,可以试下在应用里调用Java的DecimalFormat接口进行设置29. GaussDB添加索引报错ERROR: temporary file size exceeds temp_file_limit (104857600kB)添加索引要做排序,写临时文件超过了temp_file_limit的限制,可以调大一点,把索引先建上去问题原因SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GBERROR: temporary file size exceeds temp_file_limit (104857600kB)这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小解决方案查看当前的临时表空间上限并增加该上限进入你的DBMS,打开SQL控制台/SQL脚本使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)使用 alter role all set temp_file_limit = [$Temp_File_Limit] ,增加临时表空间上限(单位为kb)最后使用 show temp_show_limit 确认修改结果是否生效**注意:**如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定30. GaussDB的session_timeout参数可以设为0不?我们这边场景需要一个长连接不建议维持长连接,容易导致OOM,每个会话缓存了大量的元数据和执行过的SQL及执行计划信息
  • [迁移系列] TD迁移之金融家算法
    GaussDB(DWS)暂不支持“四舍六入五成双”/"奇进偶舍"(金融家算法)建议暂采用函数进行替换--参数1:需要取小数点精度的数值;--参数2:指小数点后取多少位;CREATE OR REPLACE FUNCTION public.Banker_Rounding(num numeric,i integer)RETURNS numericLANGUAGE sqlNOT FENCED SHIPPABLEAS $$/*逻辑:四舍六入五成双,五后有数就进一,五后无数看五前,五前为偶应舍弃,五前为奇要进一*/select case when abs(num-round(num,i))*(10^(i+1))::numeric=5 thenround(num,i)-(right(round(num,i),1)%2)*0.1^ielseround(num,i)end;$$;Select Banker_Rounding(9.115,2), Banker_Rounding(9.125,2), Banker_Rounding(9.1250000000000001,2); --返回结果 9.12, 9.12, 9.13*注:主要修正了18位以上小数异常问题,显式强转(10^(i+1))::numeric
  • [集群购买/创建] GaussDB(DWS)管控面之创建集群报错BMS.3004
     【问题现象】       创建集群失败且报错BMS.3004          可见详细报错信息:BareMetalSingleCreateServerTask-fail:Fail to call nova api to create baremetal server with port  [xxx],reason:{"badRequest":{"code":400,"message":"Volume type SSD is invalid"}} 【常见版本】        8.1.1版本  【问题分析】       1、在创建集群时下发裸机是不需要给BMS测传Volume type属性参数(根因说明)。        2、需要修改CDK参数bms.volume.root.size配置值规避;   【解决方法】       1、登录CDK界面找到dwscontroller容器参数名称为bms.volume.root.size(默认值875)的参数修改为0。        2、然后重启dwscontroller容器后,重新下发成功;  
  • [其他] 基于SpringBoot实现操作GaussDB(DWS)的项目实战
    GaussDB(DWS)      数据仓库服务GaussDB(DWS) 是一种基于华为云基础架构和平台的在线数据处理数据库,提供即开即用、可扩展且完全托管的分析型数据库服务。GaussDB(DWS)是基于华为融合数据仓库GaussDB产品的云原生服务 ,兼容标准ANSI SQL 99和SQL 2003,同时兼容PostgreSQL/Oracle数据库生态,为各行业PB级海量大数据分析提供有竞争力的解决方案。    GaussDB(DWS) 基于Shared-nothing分布式架构,具备MPP (Massively Parallel Processing)大规模并行处理引擎,由众多拥有独立且互不共享的CPU、内存、存储等系统资源的逻辑节点组成。在这样的系统架构中,业务数据被分散存储在多个节点上,数据分析任务被推送到数据所在位置就近执行,并行地完成大规模的数据处理工作,实现对数据处理的快速响应。Spring Boot    Spring Boot是一个构建在Spring框架顶部的项目。它提供了一种简便,快捷的方式来设置,配置和运行基于Web的简单应用程序。它是一个Spring模块,提供了 RAD(快速应用程序开发)功能。它用于创建独立的基于Spring的应用程序,因为它需要最少的Spring配置,因此可以运行。简而言之,Spring Boot是 Spring Framework 和 嵌入式服务器的组合。在Spring Boot不需要XML配置(部署描述符)。它使用约定优于配置软件设计范例,这意味着可以减少开发人员的工作量。我们可以使用Spring STS IDE 或 Spring Initializr 进行开发Spring Boot Java应用程序。Mybatis plus(MP)    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。    华为云官方文档给出了使用JDBC连接GaussDB(DWS)并实现增删改查基本操作的教程和代码示例。cid:link_0,在java开发中springboot作为一个常用的开发框架在很多项目中使用,下面就使用springboot结合mybatis plus在项目中实现对GaussDB(DWS)的增删改查操作。一、新建springboot项目1.打开idea基于向导新建springboot项目。2.添加依赖JDBC API和SpringWeb3.项目新建完成后打开新建libs文件夹,把jdbc驱动复制到libs目录下。cid:link_1gsjdbc4.jar:与PostgreSQL保持兼容,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统中使用。gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQL及GaussDB(DWS) 请使用该驱动包。该包主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换为“com.huawei.gauss200.jdbc”) ,数据库连接的URL前缀为“jdbc:gaussdb”,其余与gsjdbc4.jar相同。、4.jar包上鼠标点击右键,点击Add as Library。5.打开build.gradle,添加mybatis plus依赖,由于GaussDB DWS兼容PostgreSQL所以runtimeOnly可以使用org.postgresql:postgresqldependencies { //mybatis-plus implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.2' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' }6.打开application.properties配置数据库源信息。spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://xx.xx.xx.xx:8000/database?currentSchema=traffic_data spring.datasource.username=dbadmin spring.datasource.password=xxxxxx二、配置mybatis plus7.新增数据表CREATE TABLE "traffic_data"."customer" ( "id" int4, "c_customer_sk" int4, "c_customer_name" varchar(32) );8.新增包名com.zz.testdws.mapper和com.zz.testdws.entity9.新建实体类对象customer.java和Mappder对象CustomerMapper.java文件package com.zz.testdws.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; /** * <p> * * </p> * * @author zzzili * @since 2023-02-16 */ public class customer { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private Integer cCustomerSk; private String cCustomerName; @Override public String toString() { return "customer{" + "id=" + id + ", cCustomerSk=" + cCustomerSk + ", cCustomerName='" + cCustomerName + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getcCustomerSk() { return cCustomerSk; } public void setcCustomerSk(Integer cCustomerSk) { this.cCustomerSk = cCustomerSk; } public String getcCustomerName() { return cCustomerName; } public void setcCustomerName(String cCustomerName) { this.cCustomerName = cCustomerName; } }package com.zz.testdws.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zz.testdws.entity.customer; /** * <p> * Mapper 接口 * </p> * * @author zzzili * @since 2023-02-15 */ public interface CustomerMapper extends BaseMapper<customer> { }10.打开TestDwsSpringBootApplication.java文件,添加mapper扫描器注解@MapperScan("com.zz.testdws.mapper")package com.zz.testdws; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.zz.testdws.mapper") public class TestDwsSpringBootApplication { public static void main(String[] args) { SpringApplication.run(TestDwsSpringBootApplication.class, args); } }三、测试数据11.打开TestDwsSpringBootApplicationTests.java文件编写代码,测试用sql执行增删改查数据。 @Autowired DataSource dataSource; @Test void testDoSQL() throws SQLException { System.out.println(dataSource.getClass()); //获取连接 Connection con = dataSource.getConnection(); //调用Connection的createStatement方法创建语句对象 Statement stmt = con.createStatement(); //调用Statement的executeUpdate方法执行SQL语句 //int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); //System.out.println("rc = " + rc); //int rc = stmt.executeUpdate("INSERT INTO customer_t1(c_customer_sk,c_customer_name) values('1001','zhangsan');"); //System.out.println("insert rc = " + rc); //查询数据 ResultSet rs= stmt.executeQuery("select * from customer_t1"); //遍历数据 while(rs.next()){ String sk = rs.getString("c_customer_sk"); String name = rs.getString("c_customer_name"); System.out.println("sk:"+sk+" 姓名:"+name); } con.close(); }12.编写代码测试使用mybatis plus实现增删改查。 @Autowired CustomerMapper customerMapper; @Test void testMybatis(){ //增加 customer cus=new customer(); cus.setcCustomerName("zzzili"); cus.setcCustomerSk(123456); cus.setId(8); customerMapper.insert(cus); //改 cus.setcCustomerSk(66666); customerMapper.updateById(cus); //查 List<customer> list = customerMapper.selectList(null); System.out.println("list size="+list.size()); for(customer node :list){ System.out.println(node); } //删除 customerMapper.deleteById(1); }总结:通过以上实验实现了在springboot框架中利用mybatis ORM框架对GaussDB(DWS)的增删改查(ARUD)操作,在项目开发中更具有实用性。
  • [SQL] GaussDB(DWS)锁查询方法
     --创建锁等待存储过程 drop FUNCTION fun_node_session_lock_wait_info(); CREATE OR REPLACE FUNCTION fun_node_session_lock_wait_info(OUT datname name,out locktype text,out h_nodename name,out h_usename name,out w_usename name,out h_application_name text,out w_application_name text,out h_client_addr inet,out w_client_addr inet,out h_query_start date,out w_query_start date,out h_time interval,out w_time interval,out h_waiting boolean,out w_waiting boolean,out h_state text,out w_state text,out h_query_id bigint,out w_query_id bigint,out h_pid bigint,out w_pid bigint,out h_mode text,out w_mode text,out h_query text,out w_query text)   RETURNS setof RECORD AS $$  DECLARE    fetch_coor text;   coor_name RECORD;   fetch_info_str text; BEGIN   fetch_coor  := 'SELECT node_name FROM pg_catalog.pgxc_node order by node_name';    FOR coor_name IN EXECUTE(fetch_coor)     LOOP        fetch_info_str := 'EXECUTE DIRECT ON ('||coor_name.node_name ||') ''with temp as (select ps.*,pl.relation,pl.locktype,pl.mode from pg_stat_activity ps left join pg_locks pl on  ps.pid = pl.pid  where  pl.relation in (select relation from pg_locks where granted=''''f'''' group by 1)) select distinct t1.datname, t1.locktype,pgxc_node_str() as h_nodename, t2.usename as h_usename, t1.usename as w_usename,t2.application_name as h_application_name, t1.application_name as w_application_name, t2.client_addr as h_client_addr, t1.client_addr as w_client_addr,t2.query_start::date as h_query_start, t1.query_start::date as w_query_start,current_timestamp(0)-t2.query_start as h_time,current_timestamp(0)-t1.query_start as  w_time, t2.waiting as h_waiting, t1.waiting as w_waiting, t2.state as h_state, t1.state as w_state, t2.query_id as h_query_id, t1.query_id as w_query_id, t2.pid as h_pid, t1.pid as w_pid,t2.mode as h_mode,t1.mode as w_mode, t2.query as h_query, t1.query as w_query from temp t1,temp t2  where t1.relation=t2.relation and t1.pid <> t2.pid  and t1.waiting and t1.waiting <> t2.waiting'';';     RETURN QUERY EXECUTE fetch_info_str;    END LOOP;        END $$   LANGUAGE plpgsql;  --创建视图 create view pgxc_node_session_lock_wait_info as select * from fun_node_session_lock_wait_info();  --查询当前所有锁信息select * from pgxc_node_session_lock_wait_info; 
总条数:2746 到第
上滑加载中