华为云用户手册

  • 包结构 IaC Spec包用于描述环境,IaC Patch包用于描述环境中的一个组件。 IaC Spec包 IaC Spec包结构如表1所示。 表1 包结构 位置 类型 个数 描述 iacspec_{service}_{version}.zip 文件 1 IaC压缩包 └── package.json 文件 1 包描述文件 └── global/ 文件夹 1 全局默认的IaC描述,包含完整文件结构 └── meta.yaml 文件 1 变更策略描述 └── environment/ 文件夹 1 公共资源 └── resources.yaml 文件 1 公共资源列表 └── values.yaml 文件 1 公共资源参数值 └── {microservice}/ 文件夹 0-N 微服务资源 └── resources.yaml 文件 1 微服务资源列表 └── values.yaml 文件 1 微服务资源参数值 └── configs/ 文件夹 1 微服务配置目录 └── config_schema.yaml 文件 1 微服务配置字段定义 └── {cluster}_config_records.yaml 文件 0-N 微服务集群配置项 └── specs/ 文件夹 1 环境特定的IaC描述,结构与global相同,但仅包含与global有差异的文件 └── cn_dev_default/ 文件夹 1 研发联调环境 └── environment/ 文件夹 0-1 环境公共资源 └── values.yaml 文件 0-1 公共资源参数值 └── {microservice}/ 文件夹 0-N 微服务资源 └── values.yaml 文件 0-1 微服务资源参数值 └── configs/ 文件夹 0-1 微服务配置目录 └── {cluster}_config_records.yaml 文件 0-N 微服务集群配置项 └── cn_test_default/ 文件夹 1 测试联调环境 └── cn_product_default/ 文件夹 1 中国区生产环境 └── eu_product_default/ 文件夹 1 欧洲生产环境 └── ru_product_default/ 文件夹 1 俄罗斯生产环境 └── aaa_product_default/ 文件夹 1 亚非拉生产环境 样例: └── iacspec_WiseEyeDeployService_1.1.2.zip ├── global/ | |── meta.yaml | |── environment/... | |── WiseEyeDeployConductorService/... | ├── WiseEyeDeployRepoService/... | └── WiseEyeDeployConsoleService/ | ├── config/ | | ├── config_records.yaml | | └── config_schema.yaml | ├── resources.yaml | ├── packages.yaml | └── values.yaml ├── specs/ | |── cn_dev_default/... | ├── cn_test_default/... | └── cn_product_default/ | |── WiseEyeDeployConductorService/... | ├── WiseEyeDeployRepoService/... | └── WiseEyeDeployConsoleService/ | |── values.yaml | └── config/ | └── config_records.yaml └── package.json package.json的字段如表2所示。 表2 字段 位置 类型 必填 描述 type string 是 包类型,常量:iacspec。 name string 是 包名称,格式:service/{service-id},其中service-id为服务ID。 version string 是 版本号 样例: { "type": "iacspec", "name": "service/com.huawei.wiseeyedeployservice", "version": "1.0.0" }
  • 处理方法 数据库的兼容模式在CREATE DATABASE时由DBCOMPATIBILITY参数指定。 DBCOMPATIBILITY [ = ] compatibilty_type 指定兼容的数据库的类型。 取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。 若创建数据库时不指定该参数,默认为ORA。 为解决DATABASE的兼容性模式问题,需要将两个数据库的兼容模式修改为一致。GaussDB(DWS)不支持ALTER方式修改已有数据库的兼容模式DBCOMPATIBILITY,只能通过新建数据库的方式来指定兼容模式。 1 2 CREATE DATABASE td_db DBCOMPATIBILITY ='TD'; CREATE DATABASE GaussDB(DWS)不同兼容模式下Oracle、Teradata和MySQL语法行为会有一些差异,具体的差异内容可参考Oracle、Teradata和MySQL语法兼容性差异。
  • 原因分析 GaussDB(DWS)支持Oracle、Teradata和MySQL数据库兼容模式。 在TD/MySQL兼容模式下,空和NULL是不相等的,在ORA兼容模式下,空和NULL是相等的。因此上述场景可能是因为两个环境中数据库的兼容性模式设置不一致导致。 可通过查询PG_DATABASE系统表确认数据库的兼容模式: 1 SELECT datname, datcompatibility FROM pg_database;
  • 解决办法 系统连接超过最大连接数量。 用户可在GaussDB(DWS) 控制台设置最大连接数max_connections。 max_connections设置方法如下: 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。 单击“参数修改”页签,修改参数“max_connections”的值,然后单击“保存”。 在“修改预览”窗口,确认修改无误后,单击“保存”。 关于查看用户会话连接数的方法如表1。 表1 查看会话连接数 描述 命令 查看指定用户的会话连接数上限。 执行如下命令查看连接到指定用户USER1的会话连接数上限。其中-1表示没有对用户user1设置连接数的限制。 1 2 3 4 5 SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='user1'; rolname | rolconnlimit ---------+-------------- user1 | -1 (1 row) 查看指定用户已使用的会话连接数。 执行如下命令查看指定用户USER1已使用的会话连接数。其中,1表示USER1已使用的会话连接数。 1 2 3 4 5 6 SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='user1'; count ------- 1 (1 row) 查看指定数据库的会话连接数上限。 执行如下命令查看连接到指定数据库的会话连接数上限。其中-1表示没有对数据库设置连接数的限制。 1 2 3 4 5 6 SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME=''; datname | datconnlimit ----------+-------------- | -1 (1 row) 查看指定数据库已使用的会话连接数。 执行如下命令查看指定数据库上已使用的会话连接数。其中,1表示数据库上已使用的会话连接数。 1 2 3 4 5 SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME=''; count ------- 1 (1 row) 查看所有用户已使用会话连接数。 执行如下命令查看所有用户已使用的会话连接数。 1 2 3 4 5 SELECT COUNT(*) FROM PG_STAT_ACTIVITY; count ------- 10 (1 row) 用户不具备访问该数据库的权限。 使用管理员用户dbadmin连接数据库。 1 gsql -d human_resource -h 10.168.0.74 -U dbadmin -p 8000 -W password -r 赋予该用户访问数据库的权限。 1 GRANT CONNECT ON DATABASE human_resource TO user1; 实际上,常见的许多错误操作也可能产生用户无法连接上数据库的现象。如用户连接的数据库不存在,用户名或密码输入错误等。这些错误操作在客户端工具也有相应的提示信息。 1 2 3 4 5 gsql -d human_resource -p 8000 gsql: FATAL: database "human_resource" does not exist gsql -d human_resource -U user1 -W password -p 8000 gsql: FATAL: Invalid username/password,login denied. 网络连接故障。 请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端,则说明网络连接出现故障。请联系技术支持工程师提供技术支持。 1 2 3 4 5 6 7 8 ping -c 4 10.10.10.1 PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data. From 10.10.10.1: icmp_seq=2 Destination Host Unreachable From 10.10.10.1 icmp_seq=2 Destination Host Unreachable From 10.10.10.1 icmp_seq=3 Destination Host Unreachable From 10.10.10.1 icmp_seq=4 Destination Host Unreachable --- 10.10.10.1 ping statistics --- 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms
  • 原因分析 系统连接数量超过了最大连接数量,会显示如下错误信息。 1 2 gsql -d human_resource -h 10.168.0.74 -U user1 -p 8000 -W password -r gsql: FATAL: sorry, too many clients already 用户不具备访问该数据库的权限,会显示如下错误信息。 1 2 3 gsql -d human_resource -h 10.168.0.74 -U user1 -p 8000 -W password -r gsql: FATAL: permission denied for database "human_resource" DETAIL: User does not have CONNECT privilege. 网络连接故障。
  • 处理方法 场景一:语句估算内存过大,造成排队 查询pg_session_wlmstat视图,查看status为running的语句是否个数很少,而且statement_mem字段数值是否较大(单位为MB,一般认为大于max_dynamic_memory 1/3即为大内存语句)。如果都符合就可以判断是此类语句占据内存导致整体运行缓慢。 1 select usename,substr(query,0,20),threadid,status,statement_mem from pg_session_wlmstat where usename not in (''omm'',''Ruby'') order by statement_mem,status desc; 如上图所示,只有最后一个语句是running状态,其余语句都是pending状态。根据statement_mem可以看到该语句占据2576MB内存。此时根据语句的threadid,使用以下语句进行查杀,查杀后即可释放资源,其余语句正常运行。 1 pg_terminate_backend(threadid); 场景二:所有语句状态都是pending状态,没有运行的语句。此时应是管控机制出现异常,直接查杀所有线程,即可恢复正常。 1 select pg_terminate_backend(pid) from pg_stat_activity where usename not in ('omm','Ruby');
  • 处理方法 可在GaussDB(DWS) 管理控制台设置告警的触发条件,指定达到磁盘使用率、告警持续时间及告警频次。 集群磁盘使用率达到90%就会触发集群只读,需要预留时间来处理问题,避免使用率达到只读阈值。 登录GaussDB(DWS) 管理控制台。 在左侧导航栏,单击“告警管理”,切换至“告警”页签。 单击左上角的“查看告警规则”按钮,进入告警规则页面。 在指定告警规则名称所在行操作列,单击“修改”按钮进入修改告警规则页面。将触发条件修改为平均值大于90%,抑制条件修改为“每1天告警一次”。(此处仅做举例,实际情况以业务诉求为准。) 触发条件:定义对监控指标做阈值判断的计算规则。目前主要使用一段时间内的平均值来降低告警震荡的几率。 抑制条件:在指定的时间段内,抑制同类型告警的反复触发和消除。 图1 设置告警规则
  • 处理方法 方法一:分布键目前暂不支持更新,直接跳过该报错。 方法二:将分布列修改为一个不会更新的列(8.1.0版本后,支持调整分布列,以下为示例)。 查询当前表定义,回显发现该表分布列为c_last_name。 1 SELECT pg_get_tabledef('customer_t1'); 尝试执行更新分布列中的数据提示错误信息。 1 UPDATE customer_t1 SET c_last_name = 'Jimy' WHERE c_customer_sk = 6885; 将该表的分布列修改为不会更新的列,例如c_customer_sk。 1 ALTER TABLE customer_t1 DISTRIBUTE BY hash (c_customer_sk); 重新执行更新旧的分布列的数据。更新成功。 1 UPDATE customer_t1 SET c_last_name = 'Jimy'WHERE c_customer_sk = 6885;
  • 原因分析 日志中的“Lock wait timeout”说明锁等待超时。锁等待超时一般是因为有其他的SQL语句已经持有了锁,当前SQL语句需要等待持有锁的SQL语句执行完毕释放锁之后才能执行。当申请的锁等待时间超过GUC参数lockwait_timeout的设定值时,系统会报LOCK_WAIT_TIMEOUT的错误。 执行vacuum full命令时出现报错的原因为一般为执行命令超时,如果对整个数据库执行vacuum full执行时间较长可能会超时。
  • 处理方法 登录GaussDB(DWS) 管理控制台。 在集群列表中单击指定集群名称。 进入“集群详情”页面,切换至“智能运维”页签。 在运维详情部分切换至运维计划模块。单击“添加运维任务”按钮。 弹出添加运维任务边栏, 运维任务选择“Vacuum”。 调度模式选择“自动”,DWS将自动扫描Vacuum目标。 Vacuum目标选择系统表或用户表: 如果用户业务UPDATE、DELETE较多,选择用户表。 如果创建表、删除表较多,选择系统表。 单击“下一步:定时配置”,配置Vacuum类型,推荐选择“周期型任务”,GaussDB(DWS)将自动在自定义时间窗内执行Vacuum。 对于自动Vacuum运维任务,系统对于用户表的处理方法实际采用的是VACUUM FULL操作。VACUUM FULL执行过程中,本身持有8级锁,会阻塞其他业务,导致锁冲突产生,业务本身会陷入锁等待,20分钟后超时报错。因此,在用户配置时间窗内,应尽量避开执行所有处理表的相关业务。 确认无误后,单击“下一步:配置确认”,完成配置。
  • 处理方法 8.1.x及以上集群版本,通过pgxc_lock_conflicts视图查看锁冲突情况。 SELECT * FROM pgxc_lock_conflicts; 8.0.x及之前集群版本,执行以下SQL查询查看是否有阻塞的SQL语句,如果有,将阻塞的SQL会话强制结束。 1 2 3 4 5 6 7 8 9 10 11 SELECT w.query as waiting_query, w.pid as w_pid, w.usename as w_user, l.query as locking_query, l.pid as l_pid, l.usename as l_user, n.nspname || '.' || c.relname as tablename from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid and not l1.granted join pg_locks l2 on l1.relation = l2.relation and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_class c on c.oid = l1.relation join pg_namespace n on n.oid=c.relnamespace where w.waiting; 查询到阻塞的表及模式信息后,请根据会话ID结束会话: 1 SELECT PG_TERMINATE_BACKEND(PID); 这种情况一般是因为业务调度不太合理,建议合理安排各个业务的调度时间。 还可以通过设置GUC参数lockwait_timeout,控制单个锁的最长等待时间,即单个锁的等待超时时间。 lockwait_timeout单位为毫秒(ms),默认值为20分钟。 lockwait_timeout参数属于SUSET类型参数,请参考设置GUC参数中对应的设置方法进行设置。
  • 解决办法 通过下列的操作步骤,可以分析出查询效率异常降低的原因。 使用analyze命令分析数据库。 analyze命令更新所有表中数据大小以及属性等相关统计信息,该命令较为轻量级,可以经常执行。如果此命令执行后性能恢复或者有所提升,则表明autovacuum未能很好的完成它的工作,有待进一步分析。 检查查询语句是否返回了多余的数据信息。 例如,如果查询语句先查询一个表中所有的记录,而只用到结果中的前10条记录。对于包含50条记录的表,查询起来是很快的;但是,当表中包含的记录达到50000,查询效率将会有所下降。 若业务应用中存在只需要部分数据信息,但是查询语句却是返回所有信息的情况,建议修改查询语句,增加LIMIT子句来限制返回的记录数。这样至少使数据库优化器有了一定的优化空间,一定程度上会提升查询效率。 检查查询语句单独运行时是否仍然较慢。 尝试在数据库没有其他查询或查询较少的时候运行查询语句,并观察运行效率。如果效率较高,则说明可能是由于之前运行数据库系统的主机负载过大导致查询低效。此外,还可能是由于执行计划比较低效,但是由于主机硬件较快使得查询效率较高。 检查重复相同查询语句的执行效率。 查询效率低的一个重要原因是查询所需信息没有缓存在内存中,这可能是由于内存资源紧张,缓存信息被其他查询处理覆盖。 重复执行相同的查询语句,如果后续执行的查询语句效率提升,则可能是由于上述原因导致。
  • 处理方法 网络不通 如果客户端主机通过GaussDB(DWS) 集群的内网地址进行连接,应重新申请一台弹性云服务器作为客户端主机,且该弹性云服务器必须和GaussDB(DWS) 集群处于相同的VPC和子网内。 安全组规则禁止ping 检查GaussDB(DWS) 集群所属的安全组规则,查看是否对客户端主机的IP地址开放了ICMP协议端口。具体操作如下: 登录GaussDB(DWS) 管理控制台。 在“集群管理”页面,找到所需要的集群,单击集群名称进入“基本信息”页面。 在“基本信息”页面,找到“安全组”参数,单击安全组名称,进入相应的安全组详情页面。 进入“入方向规则”页签,检查是否存在开放ICMP协议端口的入规则,如果不存在,请单击“添加规则”按钮,添加入方向规则开放ICMP协议端口。 协议端口:选择“ICMP”和“全部”。 源地址:选择“IP地址”,然后根据客户端主机的IP地址输入相应的IP地址与掩码。0.0.0.0/0表示任意地址。 图1 入方向规则 单击“确定”完成入规则的添加。
  • 原因分析 网络不通 如果客户端主机通过GaussDB(DWS) 集群的内网地址进行连接,需要排查客户端主机跟GaussDB(DWS) 集群是否在相同的VPC和子网内,如果不在相同的VPC和子网内,则网络不通。 安全组规则禁止ping GaussDB(DWS) 集群所属的安全组入规则需要放开ICMP协议端口才能允许ping,如果未开放ICMP协议端口,就无法ping通。创建GaussDB(DWS) 集群时自动创建的安全组默认只放开了TCP协议和8000端口。 如果安全组入规则已开放ICMP协议端口,需要检查相应入规则的源地址是否涵盖了客户端主机的IP地址,如果没有,也无法ping通。
  • 处理方法 要删除的用户为一个数据库的owner,需要将对象的所有权重新分配给其他用户。有以下两种处理方法: 方式一:将数据库owner转移给其他用户。例如,使用ALTER语句将数据库testdb的owner用户u1修改为u2。 1 2 3 4 5 6 7 8 testdb=# ALTER DATABASE testdb OWNER to u2; ALTER DATABASE testdb=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+------------------------- testdb | u2 | UTF8 | en_US.UTF-8 | en_US.UTF-8 | (4 rows) 执行删除u1用户的命令,不再提示“owner of database testdb”的信息。 1 2 3 testdb=# DROP USER u1; ERROR: role "u1" cannot be dropped because some objects depend on it DETAIL: 3 objects in database gaussdb 方式二:如果已确认不需要数据库testdb,也可直接将其删除。将所有u1拥有的数据库对象的属主更改为u2。 1 2 testdb=# REASSIGN OWNED BY u1 TO u2; REASSIGN OWNED 清理owner是u1的对象。请谨慎使用,会将用户同名的schema也一同清理掉。 1 2 testdb=# DROP OWNED by u1; DROP OWNED 要删除的用户存在依赖关系,需要解除依赖关系。处理方法如下: 识别依赖关系。根据报错信息“3 objects in database gaussdb”可知gaussdb数据库里有3个对象依赖u1。由于库内系统表的依赖,在其他数据库中不会打印出详细的依赖对象信息,那么在gaussdb库中执行DROP USER的时候,会打印出具体的信息。 连接到gaussdb库执行如下: 1 2 3 4 gaussdb=# DROP USER u1; ERROR: role "u1" cannot be dropped because some objects depend on it DETAIL: privileges for table pg_class privileges for schema u2 获取到依赖项的详细信息如下: privileges for table pg_class:pg_class上u1用户的权限。 schema u2上u1用户的权限。 撤销依赖对象的权限。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 gaussdb=# SELECT relname,relacl FROM pg_class WHERE relname = 'pg_class'; relname | relacl ----------+---------------------------------- pg_class | {=r/Ruby,u1=r/Ruby} (1 row) gaussdb=#SELECT nspname,nspacl FROM pg_namespace WHERE nspname = 'u2'; nspname | nspacl ---------+----------------------------- u2 | {u2=UC/u2,u2=LP/u2,u1=U/u2} gaussdb=# REVOKE SELECT ON TABLE pg_class FROM u1; REVOKE gaussdb=# REVOKE USAGE ON SCHEMA u2 FROM u1; REVOKE 再删除用户,可成功删除,不再提示有依赖。 1 2 gaussdb=# DROP USER u1; DROP USER
  • 问题现象 数据库使用中遇到某些用户离职或者角色变更时,要对其账号进行销户、权限进行回收等操作,但是删除用户时出现类似role “u1” cannot be dropped because some objects depend on it的报错信息,无法删除该用户。 例如,要删除用户u1时,出现如下提示: 1 2 3 4 testdb=# DROP USER u1; ERROR: role "u1" cannot be dropped because some objects depend on it DETAIL: owner of database testdb 3 objects in database gaussdb
  • 字符集 PG里面的字符集支持各种字符集存储文本,包括单字节字符集,比如ISO 8859系列,以及多字节字符集,比如EUC(扩展Unix编码Extended Unix Code)、UTF-8和Mule内部编码。MPPDB中目前主要使用的字符集包括GBK、UTF-8和LATIN1。所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器端编码,GBK编码在PG中只是客户端编码,不是服务端编码,MPPDB将GBK引入到服务端编码,这是很多问题的根源)。默认的字符集是在使用initdb初始化PG数据库时选择的。在创建一个数据库实例时可以重载字符集,因此可能会有多个数据库实例并且每一个使用不同的字符集。一个重要的限制是每个数据库的字符集必须和数据库LC_CTYPE(字符分类)和LC_COLLATE (字符串排序顺序)设置兼容。对于C或POSIX,任何字符集都是允许的,但是对于其他区域只有一种字符集可以正确工作。不过,在Windows上UTF-8编码可以和任何区域配合使用。 SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII,服务器把字节值0-127根据ASCII标准解释,而字节值128-255则当作无法解析的字符。如果设置为SQL_ASCII,就不会有编码转换。因此,这个设置基本不是用来声明所使用的指定编码,因为这个声明会忽略编码。在大多数情况下,如果使用了任何非ASCII数据,那么使用SQL_ASCII设置都是不明智的,因为PG将无法帮助你转换或者校验非ASCII字符。 数据库系统支持某种编码,主要涉及三个方面:数据库服务器支持,数据访问接口支持以及客户端工具支持。 数据库服务器字符编码 数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符(包括标识符、字符型字段值),并能将该种编码的字符转换到其它编码(如UTF-8编码转到GBK编码)。 指定数据库服务器编码:创建数据库时指定:CREATE DATABASE … ENCODING … //可以取ASCII、UTF-8、EUC_CN、……; 查看数据库编码:show server_encoding。 数据库访问接口编码 数据库访问接口支持某种编码,是指数据库访问接口要做到能对该种编码的字符进行正确读写,不应出现数据丢失、数据失真等情况。以JDBC接口为例: JDBC接口一般根据JVM的file.encoding设置client_encoding:set client_encoding to file_encoding; 将String转换成client_encoding编码的字节流,传给服务器端:原型String.getBytes(client_encoding) ; 收到服务器的字节流后,使用client_encoding构造String对象作为getString的返回值给应用程序:原型String(byte[], …, client_encoding)。 客户端编码 客户端工具支持某种编码,是指客户端工具能够显示从数据库读取该种编码的字符,也能通过本工具将该种编码的字符提交到服务器端。 指定会话的客户端编码:SET CLIENT_ENCODING TO 'value'; 查看数据库编码:Show client_encoding。
  • 区域支持 区域支持指的是应用遵守文化偏好的问题,包括字母表、排序、数字格式等。区域是在使用initdb创建一个数据库时自动被初始化的。默认情况下,initdb将会按照它的执行环境的区域设置初始化数据库,即系统已经设置好的区域。如果想要使用其他的区域,可以使用手工指定(initdb –locale=xx)。 如果想要将几种区域的规则混合起来,可以使用以下区域子类来控制本地化规则的某些方面。这些类名转换成initdb的选项名来覆盖某个特定分类的区域选择。 表1 区域支持 字段 描述 LC_COLLATE 字符串排序顺序 LC_CTYPE 字符分类(什么是一个字符?它的大写形式是否等效?) LC_MESSAGES 消息使用的语言Language of messages LC_MONETARY 货币数量使用的格式 LC_NUMERIC 数字的格式 LC_TIME 日期和时间的格式
  • 处理方法 建议对单个表执行vacuum full命令,命令格式为“vacuum full 表名”。 如果您对表没有权限,请联系数据库管理员或表的所有者进行处理。 对于vacuum_defer_cleanup_age不是0的场景,可以将此参数改为0,取消vacuum的事务延迟。 对于存在老事务的场景,重启集群再重新做vacuum full可以保证空间一定回收,否则只能等老事务结束再做vacuum full。
  • 原因分析 执行VACUUM时,对某些表可能没有权限,或者数据库本身并没有太多的数据膨胀。 执行VACUUM,默认清理当前用户在数据库中拥有权限的每一个表,没有权限的表则直接跳过回收操作。 参数vacuum_defer_cleanup_age不是0,该参数在老版本默认为8000,表示最近8000个事务产生的脏数据不进行回收。 为了保证事务可见性,产生脏数据的事务号,如果大于当前活跃的老事务号,则这部分脏数据也不会清理。
  • 购买须知 在CodeArts支持的区域内,各区域独立开通购买、独立计费。 您可以购买代码托管单服务套餐,或者开通/购买软件开发生产线服务组合套餐,体验一站式、全流程、安全可信的软件开发生产线。 购买代码托管服务需要您拥有租户账号,或拥有Tenant Administrator权限的IAM用户账号,配置权限策略方法请参考创建用户组并授权。 若已经购买了CodeArts套餐,则不能再单独购买代码托管服务。若需要单独购买代码托管服务,则需要先退订CodeArts套餐。
  • 规则说明 2020年10月16日前,未在CodeArts某个区域下产生过费用的用户,按照新版计费规则,需在该区域开通/购买CodeArts或单独购买代码托管服务后使用。 在该区域内产生过费用的用户,延续旧版计费规则,可参考购买服务在该区域开通代码托管服务包年/包月套餐。 例如: 用户于2020年3月在“华北-北京四”购买了半年期的包月套餐。由于疫情影响业务,套餐到期后关闭了CodeArts服务;2020年10月20日将重新启用CodeArts。 若用户仍使用“华北-北京四”,可以购买旧版套餐使用。 若用户使用其它区域,则需购买CodeArts或者代码托管服务新版计费。
  • 购买服务 代码托管服务采用包年/包月计费模式,提供基础版、专业版套餐,以满足不同规模用户的使用需求。套餐详情介绍请参见包年/包月套餐说明。 进入购买代码托管服务页面。 根据需要选择区域、产品、规格、购买人数、购买时长、是否自动续费,勾选同意声明后单击“下一步:确认订单”。 建议根据您业务所在物理区域就近选择,以减少网络延时。购买的套餐只在对应的区域生效,不能跨区域使用。 确认订单内容:若需要修改,单击“上一步”;若确认无误,单击“去支付”。 选择支付方式后,确认付款。 在代码托管控制台页可查看到购买的套餐信息。
  • 变更CodeArts Repo套餐规格 CodeArts Repo支持变更套餐规格,变更影响请参见变更配置后对计费影响。 登录代码托管服务控制台。 找到CodeArts Repo套餐,单击操作列中的“变更”。 根据需要选择变更产品、规格、购买人数、购买时长,勾选同意声明,单击“下一步:确认订单”。 若变更类型选择“续费变更”,则还需要选择续费时长。 确认订单内容:若需要修改,单击“上一步”;若确认无误,单击“下一步”。 根据页面提示完成支付。
  • 导入外部仓库 用于将其它云端仓库导入到代码托管服务中,也可以将代码托管服务中一个区域的仓库导入到另一个区域(仓库备份),导入后的仓库与源仓库彼此独立。 在代码托管服务控制台导入外部仓库的步骤如下: 进入代码托管服务仓库列表页。 单击“新建仓库”按钮,跳转到“归属项目和仓库类型”页面。 选择“归属项目”。 仓库必须存在项目下。 如果账号下没有项目请在项目选择框中选择“新建项目”会先弹出“新建项目”页面,这时建立的项目是Scrum或IPD-自运营软件/云服务类。 如果在项目内新建仓库则默认选择该项目,页面会隐去“归属项目”这个字段。 仓库类型选择“导入仓库”。 单击“下一步”按钮,跳转到“填写外部仓库信息”页面。 外部仓库可以是Git远程仓库(HTTPS)或SVN。 导入时,源仓端口限制为:80、443,以及大于1024的端口。 目前完全支持的源站地址包括:GitHub、Gitee、GitLab、SVN。如果使用其它源站地址导入失败,请联系技术支持确认源站白名单。 填写源仓库路径,填写源仓库访问的用户名和密码(开源仓库不需要填写)。 单击“下一步”按钮,进入“创建仓库”页面,填写仓库基本信息。 表1 字段说明 字段名称 是否必填 备注说明 代码仓库名称 是 请以字母、数字、下划线开头,名称还可包含点和连字符,但不能以.git、.atom结尾,限制200个字符。 描述 否 为您的仓库填写描述,限制2000个字符。 权限设置 否 将项目开发人员自动添加为该仓库成员。 项目经理默认自动添加为该仓库成员,勾选该选项将项目开发人员也自动添加为该仓库成员。 自动创建代码检查任务(免费)。 仓库创建完成后在代码检查任务列表中,可看到对应仓库的检查任务。 是否公开 是 可选择: 私有。 仓库仅对仓库成员可见,仓库成员可访问仓库或者提交代码。 公开只读。 仓库对所有访客公开只读,但不出现在访客的仓库列表及搜索中 。 分支设置 是 可选择同步源仓库的默认分支或全部分支。 增加定时同步 否 勾选“增加定时同步”功能: 每天自动从源仓库导入仓库的默认分支。 仓库将成为只读镜像仓库,不能写入,并且只同步当前创建仓库的默认分支对应的第三方仓库的分支。 同步分为手动同步和定时同步,同步分支配置后不可更改,可参考同步仓库。 单击“确定”按钮,完成仓库导入,跳转到仓库列表页。 仓库导入超时时间为30min。如果导入超时,建议使用客户端clone/push来处理。 导入的内容中不包含Git LFS对象。 该功能需要保证被导入的仓库域名和服务节点网络连通。 父主题: 创建代码托管仓库
  • 使用HTTPS协议从Git Bash客户端克隆代码 本节内容描述如何使用Git Bash客户端克隆代码托管服务的仓库到本地环境中。 本产品中HTTPS协议所支持的最大单次推包大小为200MB,需传输大于200MB时,请使用SSH方式。 因为联邦账号无法绑定邮箱,所以无法使用HTTPS协议。 下载并安装Git Bash客户端。 设置HTTPS密码。 进入代码托管仓库列表页,单击仓库列表中的“仓库名”进入仓库详情页,单击右侧导航栏“克隆/下载”按钮,单击“用HTTPS克隆”,复制访问方式中的HTTPS链接,如下图所示。 如果您未配置HTTPS密码,你可单击上图中“HTTPS密码管理”链接进行配置,详情请参考HTTPS密码。 您可在代码托管服务仓库列表中“仓库地址”下获取HTTPS地址。 打开Git Bash客户端进入您的目录下,输入以下命令进行仓库克隆,其中第一次克隆需要您填写用户名(账号名/用户名)和HTTPS密码。 git clone 您的HTTPS下载链接 用户名(账号名/用户名)和HTTPS密码输入完成后,即可完成仓库克隆。 此时您位于仓库上层目录,执行如下命令,进入仓库目录。 cd 仓库名称 进入仓库目录,可以看到此时Git默认为您定位到master分支。 客户端在git clone代码仓库时失败的原因排查: 确保您的网络可以访问代码托管服务。 请在git客户端使用如下测试命令验证网络连通性。 ssh -vT git@**********.com 如果返回内容含有“Could not resolve hostname **********.com: Name or service not known”,则您的网络被限制,无法访问代码托管服务,请求助您本地所属网络管理员。 请确认HTTPS密码,必要时重新设置密码。 只有开启IP白名单的机器才可以在Git客户端克隆。
  • 使用HTTPS协议在TortoiseGit客户端克隆代码 本节内容描述如何使用TortoiseGit客户端克隆代码托管服务的仓库到本地环境中。 下载并安装TortoiseGit客户端。 设置HTTPS密码。 进入代码托管仓库列表页,单击仓库列表中的“仓库名”进入仓库详情页,单击右侧导航栏“克隆/下载”按钮,单击“用HTTPS克隆”,复制访问方式中的HTTPS链接,如下图所示。 如果您未配置HTTPS密码,你可单击上图中“HTTPS密码管理”链接进行配置,详情请参考HTTPS密码。 您可在代码托管服务仓库列表中“仓库地址”下获取HTTPS地址。 进入您的目录下,右键在弹出的菜单选项中选择“Git克隆”,如下图所示。 在弹出的窗口中将上述复制的HTTPS地址粘贴到URL输入框中,然后单击“确定”,如下图所示。 单击“确定”之后即开始克隆仓库,如果您是第一次进行克隆TortoiseGit客户端会要求您输入用户名和HTTPS密码。 开始克隆之后稍后即可完成。
  • 操作步骤 新建代码托管仓库。 如果根据您本地代码库选择gitignore,会帮助你将一些非开发文件屏蔽掉而不受Git纳管。 将本地仓库初始化成Git仓库。 在您的仓库中打开Git Bash客户端,执行以下命令。 git init 初始化成功如下图,此时当前文件夹已经是本地Git仓库了。 绑定代码托管仓库。 进入代码托管仓库,获取仓库地址。 在本地使用remote命令,将本地仓库与代码托管仓库进行绑定。 git remote add 仓库别名 仓库地址 示例为: git remote add origin git@*****/java-remote.git #复制使用时 注意换成您自己的仓库地址 一般用origin作为仓库别名,因为当您从远程仓库clone到本地时,默认产生的别名就是origin,当然您也可以使用任意别名。 如果提示仓库名重复,更换一个即可。 无回显即为绑定成功。 将代码托管仓库master分支拉取到本地库。 此步骤主要是避免冲突。 git fetch origin master #复制使用时 注意需要将origin替换为您仓库的别名 将本地代码文件提交到master分支。 依次执行: git add . git commit -m "您的提交备注" 下图为成功的执行。 将本地master分支与代码托管仓库master分支进行绑定。 git branch --set-upstream-to=origin/master master #复制使用时 注意是否需要将origin替换为您仓库的别名 成功执行如下图所示,会提示您已经绑定成功。 合并代码托管仓库与本地仓库的文件,并存储在本地。 git pull --rebase origin master #复制使用时 注意是否需要将origin替换为您仓库的别名 成功执行如下图所示,提示您已经将合并后的仓库放在工作区与版本库。 将本地仓库推送覆盖代码托管仓库。 因为之前已经进行了绑定,直接push即可。 git push 成功后,再直接拉取pull,验证代码托管仓库与本地仓库版本相同,如下图。
  • 使用访问令牌 进入代码托管仓库,您可使用git clone命令将仓库下载到本地 。通过克隆存储库,您可以将其文件的副本下载到本地计算机中,并保留与远程存储库的Git连接。 单击“克隆/下载”,单击“用HTTPS克隆”,复制访问方式中的HTTPS链接。 打开Git Bash客户端进入您的目录下,输入以下命令进行仓库克隆。 git clone 您的HTTPS下载链接 出现如下弹框,您可输入Token的用户名和密码。 图1 输入Token的用户名 图2 输入Token密码 token的用户名为private-token,密码为生成的token。 单击OK,即可完成代码托管仓库的克隆下载。
  • 如何避免冲突的产生? 代码提交、合并冲突经常发生,但只要在代码开发前,做好仓库预处理工作,就能有效的避免冲突的产生。 在示例:冲突的产生与解决中,开发者02(02_dev)成功的解决了提交远程仓库时遇到的冲突问题,此时他的本地仓库与远程仓库的最新版本内容是一样的,但是开发者01(01_dev)本地仓库和远程仓库仍然是有版本差异的,此时如果直接推送本地仓库(push),仍然会产生冲突,那么如何避免呢? 方式一(推荐新手使用): 如果开发者本地的仓库不常更新使用,在做本地修改时,可以重新clone一份远程仓库的内容到本地,修改后再次提交,这样简单直接的解决了版本差异问题,但缺点是如果仓库较大、更新记录较多,clone过程将耗费一定的时间。 方式二: 如果开发者每天都要对本地仓库进行修改,则建议在本地新建一条开发分支进行代码修改,在要提交远程仓库时,切换到master分支并将远程仓库的最新master分支内容拉取到本地,在本地进行分支合并,对产生的冲突进行修复,成功将内容合并到master分支后,再提交到远程仓库。
共100000条