-
[openGauss] 并行逻辑解码可获得性本特性自openGauss 3.0.0版本开始引入。特性简介支持多线程并行解码。客户价值大幅提升逻辑解码性能,解码速度由3~5MBps可提升到标准场景(16核CPU、内存128G、网络带宽 > 200MBps、表的列数为10~100、单行数据量0.1KB~1KB、DML操作以insert为主、不涉及落盘事务即单个事务中语句数量小于4096)下的100MBps。特性描述在使用JDBC或pg_recvlogical解码时,设置配置选项parallel-decode-num为大于1且小于等于20的值,开启并行解码特性,使用一个读取线程、多个解码线程以及一个发送线程协同进行逻辑解码操作,显著提升解码速度。特性增强无。特性约束当前的硬件和网络环境正常;由于逻辑日志一般为xlog的两倍,为保证xlog速度达到100MBps,I/O带宽至少保证200MBps;因为reader、decoder、sender线程均需预留资源,CPU需预留并发数+2的核数,如4并发场景需要预留6核。在实际场景中,使用备机解码即可保证需求,无需进行特殊的资源预留规划。为保证解码性能达标以及尽量降低对业务的影响,一台备机上应尽量仅建立一个并行解码连接,保证CPU、内存、带宽资源充足。日志级别的guc参数wal_level = logical。guc参数max_replication_slots >= 每个DN所需的(物理流复制槽数+备份槽数+逻辑复制槽数)。解码配置选项parallel-decode-num > 1且<= 20,指定并行的解码线程数。不支持DDL语句解码。不支持列存、数据页复制的解码。不支持解码分布式事务,当前机制为从DN解码,无法保证分布式事务一致性解码。单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。不支持压缩表的DML语句解码。openGauss支持解码的数据类型为:INTEGER、BIGINT、SMALLILNT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。在需要ssl连接的场景,需要前置条件保证guc参数ssl = on。不支持interval partition表复制。在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。当前不支持超大CLOB解码。不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。依赖关系依赖备机解码。详情查看:cid:link_1详情查看:cid:link_0
-
[openGauss] DB4AI: 数据库驱动AI可获得性本特性自openGauss 2.1.0版本开始引入。特性简介DB4AI是指利用数据库的能力驱动AI任务,实现数据存储、技术栈的同构。通过在数据库内集成AI算法,令openGauss具备数据库原生AI计算引擎、模型管理、AI算子、AI原生执行计划的能力,为用户提供普惠AI技术。不同于传统的AI建模流程,DB4AI“一站式”建模可以解决数据在各平台的反复流转问题,同时简化开发流程,并可通过数据库规划出最优执行路径,让开发者更专注于具体业务和模型的调优上,具备同类产品不具备的易用性与性能优势。客户价值通过本功能,用户无需手动编写AI模型代码,直接通过开箱即用的SQL语句即可执行机器学习模型的训练和预测,学习和使用成本极低;避免数据碎片化存储和反复搬迁导致的额外开销;更高的执行效率,本功能的AI模型训练效率极高,相比用户自行手动训练模型有数倍性能收益;更严密的安全防护,从而避免训练AI模型导致数据泄露。特性描述openGauss的原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据分析上,而避免了碎片化的技术栈与冗余的代码实现。特性增强在openGauss 3.0.0 版本中支持更多算法。特性约束数据库状态正常依赖关系无详情查看:cid:link_1 详情查看:cid:link_0
-
[openGauss] 动态数据脱敏机制可获得性本特性自openGauss 1.1.0版本开始引入。特性简介数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始数据的前提下解决非授权用户对敏感信息的访问问题。当管理员指定待脱敏对象和定制数据脱敏策略后,用户所查询的数据库资源如果关联到对应的脱敏策略时,则会根据用户身份和脱敏策略进行数据脱敏,从而限制非授权用户对隐私数据的访问。客户价值数据隐私保护是数据库安全所需要具备的安全能力之一,可以在一定程度上限制非授权用户对隐私数据的访问,保证隐私数据安全。动态数据脱敏机制可以通过配置脱敏策略实现对指定数据库资源信息的隐私保护,另一方面,脱敏策略的配置也具有一定的灵活性,可以仅针对特定用户场景实现有针对性的隐私保护能力。特性描述动态数据脱敏机制基于资源标签进行脱敏策略的定制化,可根据实际场景选择特定的脱敏方式,也可以针对某些特定用户制定脱敏策略。一个完整的脱敏策略创建的SQL语法如下所示:CREATE RESOURCE LABEL label_for_creditcard ADD COLUMN(user1.table1.creditcard); CREATE RESOURCE LABEL label_for_name ADD COLUMN(user1.table1.name); CREATE MASKING POLICY msk_creditcard creditcardmasking ON LABEL(label_for_creditcard); CREATE MASKING POLICY msk_name randommasking ON LABEL(label_for_name) FILTER ON IP(local), ROLES(dev);其中,label_for_creditcard和msk_name为本轮计划脱敏的资源标签,分别包含了两个列对象;creditcardmasking、randommasking为预置的脱敏函数;msk_creditcard定义了所有用户对label_for_creditcard标签所包含的资源访问时做creditcardmasking的脱敏策略,不区分访问源;msk_name定义了本地用户dev对label_for_name标签所包含的资源访问时做randommasking的脱敏策略;当不指定FILTER对象时则表示对所有用户生效,否则仅对标识场景的用户生效。当前,预置的脱敏函数包括:每个脱敏函数规格如下:脱敏函数名示例creditcardmasking'4880-9898-4545-2525' 将会被脱敏为 'xxxx-xxxx-xxxx-2525',该函数仅对后4位之前的数字进行脱敏basicemailmasking'abcd@gmail.com' 将会被脱敏为'xxxx@gmail.com', 对出现第一个'@'之前的文本进行脱敏fullemailmasking'abcd@gmail.com' 将会被脱敏为 'xxxx@xxxxx.com',对出现最后一个'.'之前的文本(除'@'符外)进行脱敏alldigitsmasking'alex123alex' 将会被脱敏为 'alex000alex', 仅对文本中的数字进行脱敏shufflemasking'hello word' 将会被随机打乱顺序脱敏为 'hlwoeor dl', 该函数通过字符乱序排列的方式实现,属于弱脱敏函数,语义较强的字符串不建议使用该函数脱敏。randommasking'hello word' 将会被脱敏为 'ad5f5ghdf5',将文本按字符随机脱敏regexpmasking需要用户顺序输入四个参数,reg为被替换的字符串,replace_text为替换后的字符串,pos为目标字符串开始替换的初始位置,为整数类型,reg_len为替换长度,为整数类型。reg、replace_text可以用正则表达,pos如果不指定则默认为0,reg_len如果不指定则默认为-1,即pos后所有字符串。如果用户输入参数与参数类型不一致,则会使用maskall方式脱敏。CREATE MASKING POLICY msk_creditcard regexpmasking('[\d+]', 'x', 5, 9 ) ON LABEL(label_for_creditcard);'4880-9898-4545-2525' 将会被脱敏为 '4880-xxxx-xxxx-2525'maskall'4880-9898-4545-2525' 将会被脱敏为 'xxxxxxxxxxxxxxxxxxx'对于不支持的数据类型,默认使用maskall函数进行数据脱敏,若数据类型不属于maskall支持的数据类型则全部使用数字0进行脱敏,如果脱敏列涉及隐式转换,则结果以隐式转换后的数据类型为基础进行脱敏。另外需要说明的是,如果脱敏策略应用到数据列并生效,此时对该列数据的操作将以脱敏后的结果为基础而进行。动态数据脱敏适用于和实际业务紧密相关的场景,根据业务需要为用户提供合理的脱敏查询接口,以避免通过撞库而获取原始数据。特性增强无。特性约束动态数据脱敏策略需要由具备POLADMIN或SYSADMIN属性的用户或初始用户创建,普通用户没有访问安全策略系统表和系统视图的权限。动态数据脱敏只在配置了脱敏策略的数据表上生效,而审计日志不在脱敏策略的生效范围内。在一个脱敏策略中,对于同一个资源标签仅可指定一种脱敏方式,不可重复指定。不允许多个脱敏策略对同一个资源标签进行脱敏,除以下脱敏场景外:使用FILTER指定策略生效的用户场景,包含相同资源标签的脱敏策略间FILTER生效场景无交集,此时可以根据用户场景明确辨别资源标签被哪种策略脱敏。Filter中的APP项建议仅在同一信任域内使用,由于客户端不可避免的可能出现伪造名称的情况,该选项使用时需要与客户端联合形成一套安全机制,减少误用风险。一般情况下不建议使用,使用时需要注意客户端仿冒的风险。对于带有query子句的INSERT或MERGE INTO操作,如果源表中包含脱敏列,则上述两种操作中插入或更新的结果为脱敏后的值,且不可还原。在内置安全策略开关开启的情况下,执行ALTER TABLE EXCHANGE PARTITION操作的源表若在脱敏列则执行失败。对于设置了动态数据脱敏策略的表,需要谨慎授予其他用户对该表的trigger权限,以免其他用户利用触发器绕过脱敏策略。最多支持创建98个动态数据脱敏策略。仅支持使用上述七种预置脱敏策略。仅支持对只包含COLUMN属性的资源标签做脱敏。仅支持对基本表的列进行数据脱敏。仅支持对SELECT查询到的数据进行脱敏。FILTER中的IP地址以ipv4为例支持如下格式。脱敏函数名支持的数据类型creditcardmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对信用卡格式的文本类数据)basicemailmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对email格式的文本类型数据)fullemailmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对email格式的文本类型数据)alldigitsmaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对包含数字的文本类型数据)shufflemaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对文本类型数据)randommaskingBPCHAR, VARCHAR, NVARCHAR, TEXT(注:仅针对文本类型数据)maskallBOOL, RELTIME, TIME, TIMETZ, INTERVAL, TIMESTAMP, TIMESTAMPTZ, SMALLDATETIME, ABSTIME,TEXT, BPCHAR, VARCHAR, NVARCHAR2, NAME, INT8, INT4, INT2, INT1, NUMRIC, FLOAT4, FLOAT8, CASHip地址格式示例单ip127.0.0.1掩码表示ip127.0.0.1|255.255.255.0cidr表示ip127.0.0.1/24ip区间127.0.0.1-127.0.0.5依赖关系无。详情查看:cid:link_1详情查看:cid:link_0
-
Copy接口支持容错机制可获得性本特性自openGauss 1.0.0版本开始引入。特性简介支持将Copy过程中的部分错误导入到指定的错误表中,并且保持Copy过程不被中断。客户价值提升Copy功能的可用性和易用性,提升对于源数据格式异常等常见错误的容忍性和鲁棒性。特性描述openGauss提供用于创建函数的封装好的Copy错误表,并允许用户在使用Copy From指令时指定容错选项,使得Copy From语句在执行过程中部分解析、数据格式、字符集等相关的报错不会中断事务,而是被记录至错误表中,使得在Copy From的目标文件即使有少量数据错误也可以完成入库操作。用户随后可以在错误表中对相关的错误进行定位以及进一步排查。特性增强无。特性约束支持容错的具体错误种类请参见《数据库运维指南》中“导入数据 > 使用COPY FROM STDIN导入数据 > 处理错误表”章节。依赖关系无。
-
Anomaly-detection:数据库指标采集、预测与异常监控可获得性本特性自openGauss1.1.0版本开始引入。特性简介anomaly_detection是openGauss集成的、可以用于数据库指标采集、预测以及异常监控与诊断的AI工具,是dbmind套间中的一个组件。支持采集的信息包括IO_Read、IO_Write、CPU_Usage、Memory_Usage以及数据库所占磁盘空间等。anomaly_detection可以同时监控多个指标,并预测每个指标未来的变化趋势,当发现某个指标在未来某段时间或者某个时刻会超出人工设置的阈值,该工具会通过日志进行报警。客户价值极大简化运维人员工作,释放大量劳动力,为公司节省成本。为用户提前发现异常情况,防止数据库发生意外,导致更大的损失。特性描述anomaly_detection由agent和detector两部分组成。agent和openGauss数据库环境部署在同一个服务器上,agent模块主要有两个作用。一个是定时采集数据库指标数据,并将采集到的数据存放到缓冲队列中;另一个作用是将缓冲队列中数据定时发送到detector端。detector模块基于http或https和agent模块通信,因此它可以部署到任何可以与agent端进行通信的服务器上,该模块主要主要有两个作用。一个是接受agent端发送的数据,并将收集到的数据缓存在本地;另外一个作用是基于收集到的数据库指标数据,对该指标的未来变化趋势进行预测和异常报警。特性增强无。特性约束数据库状态正常,并且用户已将数据目录写入环境变量,并以PGDATA命名。使用登录到数据库宿主机上的Linux用户,需要将$GAUSSHOME/bin添加到PATH环境变量中,即能够直接运行gsql、gs_guc、gs_ctl等数据库运维工具。Python版本建议为Python3.6及以上,且运行环境中已经安装相应依赖,并能够正常启动调优程序。本工具由Agent和Detector组成,Agent和Detector之间通过'http'或者'https'方式传递数据,因此需要保证Agent服务器和Detector服务器之间能够正常通信。Detector模块运行server和monitor服务, 需要分别启动。如果使用'https'方式进行通信,需要准备CA证书以及Agent和Detector的证书和密钥,并分别放入项目根目录certificate下的ca、agent、server中,同时将密钥加密密码放入certificate的pwf中,并将其权限设置为600,防止其他用户进行读写操作。用户也可以使用share中的脚本生成证书和密钥。依赖关系无。详情查看:cid:link_1 详情查看:cid:link_0
-
一、引言openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。存储过程(Stored Procedures)作为数据库中重要的编程工具,能够极大地简化复杂操作,提高系统的性能和安全性。本文将详细介绍 openGauss 的存储过程,并提供具体的代码和案例,以帮助读者更好地理解和应用这些工具。二、存储过程1. 什么是存储过程存储过程是一组预先编写好的 SQL 语句集合,存储在数据库中,可以通过调用存储过程来执行一系列操作。存储过程能够简化复杂的数据库操作,减少代码重复,提高效率。此外,存储过程运行在数据库服务器端,这意味着可以减少客户端和服务器之间的通信开销,提高执行效率。存储过程的特点包括:封装性:将一系列操作封装在一个过程里,简化调用。重用性:定义一次,可以在多个地方调用,减少代码重复。安全性:通过存储过程可以控制访问权限,提高数据安全性。性能:减少客户端和服务器之间的通信,执行效率高。2. 创建和使用存储过程在 openGauss 中,创建存储过程使用 CREATE PROCEDURE 语句。一个存储过程可以包含多个输入参数、输出参数,甚至没有参数。下面是一个详细的例子,演示如何创建和调用存储过程。创建员工表-- 创建员工表CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100), salary NUMERIC(15, 2), department VARCHAR(100) );创建存储过程-- 创建插入员工的存储过程CREATE OR REPLACE PROCEDURE add_employee( emp_id INT, emp_name VARCHAR, emp_salary NUMERIC, emp_department VARCHAR )LANGUAGE plpgsql AS $$ BEGIN INSERT INTO employees (id, name, salary, department) VALUES (emp_id, emp_name, emp_salary, emp_department); END; $$;-- 创建更新触发器函数-- 创建更新员工的存储过程CREATE OR REPLACE PROCEDURE update_employee( emp_id INT, emp_name VARCHAR, emp_salary NUMERIC, emp_department VARCHAR ) LANGUAGE plpgsql AS $$ BEGIN UPDATE employees SET name = emp_name, salary = emp_salary, department = emp_department WHERE id = emp_id; END;$$;-- 创建删除员工的存储过程CREATE OR REPLACE PROCEDURE delete_employee(emp_id INT) LANGUAGE plpgsql AS $$ BEGIN DELETE FROM employees WHERE id = emp_id; END;$$;-- 创建查询员工的存储过程CREATE OR REPLACE PROCEDURE get_employee(emp_id INT) LANGUAGE plpgsql AS $$ BEGIN PERFORM * FROM employees WHERE id = emp_id; END; $$;调用存储过程-- 调用存储过程插入员工CALL add_employee(1, 'John Doe', 50000, 'Engineering');-- 调用存储过程更新员工CALL update_employee(1, 'John Doe', 55000, 'Marketing');-- 调用存储过程删除员工CALL delete_employee(1);-- 调用存储过程查询员工CALL get_employee(1);3. 存储过程的高级应用存储过程不仅可以简化常见的增删改查操作,还可以用于更复杂的业务逻辑处理。以下是一些存储过程的高级应用场景:批量数据处理在实际业务中,经常需要对大量数据进行批量处理,如批量插入、批量更新等。使用存储过程可以极大地简化这些操作,并提高执行效率。-- 定义员工记录的复合类型CREATE TYPE emp_record AS ( id INT, name VARCHAR(100), salary NUMERIC(15, 2), department VARCHAR(100) );-- 创建批量插入员工的存储过程CREATE OR REPLACE PROCEDURE batch_insert_employees(emp_records emp_record[]) LANGUAGE plpgsql AS $$ DECLARE rec emp_record; BEGIN FOREACH rec IN ARRAY emp_records LOOP INSERT INTO employees (id, name, salary, department) VALUES (rec.id, rec.name, rec.salary, rec.department); END LOOP; END; $$;-- 调用批量插入存储过程CALL batch_insert_employees(ARRAY[ ROW(2, 'Jane Doe', 60000, 'HR')::emp_record, ROW(3, 'Alice', 70000, 'Finance')::emp_record, ROW(4, 'Bob', 80000, 'IT')::emp_record ]);数据校验和清洗在存储过程中可以添加数据校验和清洗的逻辑,确保插入数据库的数据的完整性和准确性。例如,可以在插入员工数据前,检查数据是否符合业务规则。CREATE OR REPLACE PROCEDURE add_employee_with_validation( emp_id INT, emp_name VARCHAR, emp_salary NUMERIC, emp_department VARCHAR ) LANGUAGE plpgsql AS $$ BEGIN IF emp_salary < 0 THEN RAISE EXCEPTION 'Salary cannot be negative'; END IF; IF emp_department IS NULL THEN RAISE EXCEPTION 'Department cannot be null'; END IF; INSERT INTO employees (id, name, salary, department) VALUES (emp_id, emp_name, emp_salary, emp_department); END; $$;-- 调用存储过程插入员工CALL add_employee_with_validation(5, 'Charlie', 5000, 'Sales');自动化任务存储过程可以用于自动化任务,如定时任务、数据备份等。可以结合数据库调度器(如 cron 表达式)来实现定时调用存储过程,完成自动化管理。-- 定时任务:每天凌晨2点备份员工表CREATE OR REPLACE PROCEDURE backup_employees() LANGUAGE plpgsql AS $$ BEGIN EXECUTE 'COPY employees TO ''/path/to/backup/employees_' || to_char(current_date, 'YYYYMMDD') || '.csv'' WITH CSV HEADER'; END; $$;
-
在给客户部署业务系统时,由于openGauss数据库的预安装过程需要用到root用户执行,总会被挑战root用户权限太大,若有风险谁负责,只能怯怯的说我们仅安装一个数据库,很快用完了就释放。而openGauss 6.0版本和5.0版本相比,数据库安装流程中的预安装命令(gs_preinstall)以及校验操作系统命令,同时扩容命令可以用非root命令执行了。用非root命令执行预命令,在安全和易用性等方面都有很大的改进(当然还有一些前提条件需要root用户执行,期待后续版本的继续优化),可以减少用户执行过程的用户切换,也可以控制root用户权限控制。一定程度减少了用户误操作对整个系统的影响范围。除了gs_preinstall外,做了类似改进的还有扩容(gs_checkos)和校验(gs_checkos),本文仅介绍gs_preinstall。(其余命令待后文整理)。1.执行前提条件本文由于是单机版安装所以未执行gs_sshexkey -f host,直接执行设置os参数这步,需要注意的是,前提条件的操作,仍然需要以root用户执行。详情参考官网资料,点击文末阅读原文。1.1设置OS参数:注意直接按照官网资料执行会报错Invalid argument,如下:该问题为已知资料问题,执行时需去掉双引号,即可成功。echo 'kernel.sem=250 6400000 1000 25600' >> /etc/sysctl.conf1.2定时任务权限赋予普通用户执行定时任务的权限echo "xxx" >> /etc/cron.allow重启定时任务使生效。systemctl restart crond1.3 修改最大文件描述符2.切换至omm用户,执行preinstall[omm@ecs-oe-2203 script]$ ./gs_preinstall -U omm -G dbgrp -X /opt/software/opengauss/clusterconfig.xml3.source环境变量preinstall成功后,用omm用户执行gs_install,报错:因是环境变量问题,因此回退至root用户,先source环境变量,再执行gs_install命令,就可以成功。[root@ecs-oe-2203 script]# source /home/omm/.bashrc[root@ecs-oe-2203 script]# su omm4.执行gs_install切换至omm用户,继续执行gs_install,安装成功,登录默认数据库并查询。Gs_checkos和gs_expansion的会在后续发出,敬请关注。本文作者本文内容来自于数据库领域资深技术专家赵锋老师,希望我们的文章正好能解决你的问题。
-
作者:马顺华在运维管理领域深耕多年,具备扎实的理论基础与丰富的实践经验。我深耕于技术前沿,不断追求运维自动化与效率的最大化。我精通运维自动化流程,熟悉OceanBase、MySQL等多种数据库的部署与运维,具备从部署到维护的全流程管理能力。此外,我还持有OceanBase的OBCA和OBCP证书,以及OpenGauss社区认证结业证书、崖山DBCA、亚信AntDBCA、翰高HDCA、GBase 8a | 8c | 8s 等多项权威认证,这些不仅证明了我的专业技能,也展示了我对技术的深厚理解和热爱。在OceanBase & 墨天轮的技术征文大赛中,我凭借深厚的技术实力和独到的见解,多次荣获一、二、三等奖。同时,在openGauss第五届、第六届技术征文大赛中,我也屡获殊荣。此外,我还经常在墨天轮等平台发布原创技术文章,多次被首页推荐,积极与业界分享我的运维经验和见解。引言随着数字化时代的快速发展,数据库作为企业信息化的核心,其稳定性和性能对于企业至关重要。openGauss 6.0.0 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。凭借其高性能、高可靠、高安全、易运维等特性,赢得了众多企业的青睐。本文将详细介绍openGauss 6.0.0 新版数据库的日常运维,帮助用户更好地管理和维护数据库。一、启停 openGauss以操作系统用户omm登录数据库主节点。[root@worker1 ~]# su - omm Last login: Fri May 17 16:29:59 CST 2024 on pts/0 [omm@worker1 ~]$ 1、启动openGauss使用以下命令启动openGauss。gs_om -t start实验示例[omm@worker1 script]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] worker1: [2024-06-04 14:04:56.387][76539][][gs_ctl]: gs_ctl started,datadir is /opt/openGauss/install/data/dn1 [2024-06-04 14:04:56.390][76539][][gs_ctl]: another server might be running; Please use the restart command ========================================= Successfully started. [omm@worker1 script]$ 2、停止openGauss以操作系统用户omm登录数据库主节点。使用以下命令停止openGauss。gs_om -t stop实验示例[omm@worker1 script]$ gs_om -t stop Stopping cluster. ========================================= Successfully stopped cluster. ========================================= End stop cluster. [omm@worker1 script]$ 说明: 启停节点及AZ的操作请参见《工具与命令参考》中“服务端工具 > gs_om”章节。3、错误排查如果启动openGauss或者停止openGauss服务失败,请根据日志文件中的日志信息排查错误,参见日志参考。如果是超时导致启动失败,可以执行如下命令,设置启动超时时间,默认超时时间为300s。gs_om -t start --time-out=300[omm@worker1 script]$ gs_om -t start --time-out=300 Starting cluster. ========================================= [SUCCESS] worker1 2024-06-04 14:06:51.484 665eaefb.1 [unknown] 139781304941184 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2024-06-04 14:06:51.484 665eaefb.1 [unknown] 139781304941184 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets ========================================= Successfully started. [omm@worker1 script]$ 4、日志类型参考在数据库运行过程中,会出现大量日志,既有保证数据库安全可靠的WAL日志(预写式日志,也称为Xlog),也有用于数据库日常维护的运行和操作日志等。在数据库发生故障时,可以参考这些日志进行问题定位和数据库恢复的操作。日志类型日志类型的详细说明请参见下表。*类型**说明*系统日志数据库系统进程运行时产生的日志,记录系统进程的异常信息。操作日志通过客户端工具(例如gs_guc)操作数据库时产生的日志。Trace日志打开数据库的调试开关后,会记录大量的Trace日志。这些日志可以用来分析数据库的异常信息。黑匣子日志数据库系统崩溃的时候,通过故障现场堆、栈信息可以分析出故障发生时的进程上下文,方便故障定位。黑匣子具有在系统崩溃时,dump出进程和线程的堆、栈、寄存器信息的功能。审计日志开启数据库审计功能后,将数据库用户的某些操作记录在日志中,这些日志称为审计日志。WAL日志又称为REDO日志,在数据库异常损坏时,可以利用WAL日志进行恢复。由于WAL日志的重要性,所以需要经常备份这些日志。性能日志数据库系统在运行时检测物理资源的运行状态的日志,在对外部资源进行访问时的性能日志,例如:磁盘、OBS等。二、查看 openGauss 状态背景信息openGauss支持查看整个openGauss的状态,通过查询结果确认openGauss或者单个主机的运行状态是否正常。前提条件openGauss已经启动。操作步骤以操作系统用户omm登录数据库主节点。1、使用如下命令查询openGauss状态:[omm@worker1 script]$ gs_ctl status [2024-06-04 14:07:34.222][77045][][gs_ctl]: gs_ctl status,datadir is /opt/openGauss/install/data/dn1 gs_ctl: server is running (PID: 76866) /opt/openGauss/install/app/bin/gaussdb "-D" "/opt/openGauss/install/data/dn1" [omm@worker1 script]$ 2、若要查询某主机上的实例状态:请在命令中增加“-h”项。示例如下:[omm@worker1 script]$ gs_om -t status -h worker1 ----------------------------------------------------------------------- cluster_state : Normal redistributing : No ----------------------------------------------------------------------- node : 1 node_name : worker1 instance_id : 6001 node_ip : 172.10.20.121 data_path : /opt/openGauss/install/data/dn1 instance_port : 15000 type : Datanode instance_state : Normal az_name : AZ1 instance_role : Normal ----------------------------------------------------------------------- [omm@worker1 script]$ 其中,worker1为待查询主机的名称。3、查看openGauss详细状态信息,含实例状态信息。[omm@worker1 script]$ gs_om -t status --detail [ Cluster State ] cluster_state : Normal redistributing : No current_az : AZ_ALL [ Datanode State ] node node_ip port instance state -------------------------------------------------------------------------------------------------- 1 worker1 172.10.20.121 15000 6001 /opt/openGauss/install/data/dn1 P Primary Normal [omm@worker1 script]$ 三、openGauss 例行维护1、日维护检查项1.1 检查openGauss状态通过openGauss提供的工具查询数据库和实例状态,确认数据库和实例都处于正常的运行状态,可以对外提供数据服务。检查实例状态[omm@worker1 script]$ gs_check -U omm -i CheckClusterState Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045113977563.tar.gz [omm@worker1 script]$ 1.2 检查锁信息锁机制是数据库保证数据一致性的重要手段,检查相关信息可以检查数据库的事务和运行状况。查询数据库中的锁信息openGauss=# SELECT * FROM pg_locks; locktype | database | relation | page | tuple | bucket | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | sessionid | mode | granted | fastpath | locktag | global_sessionid ------------+----------+----------+------+-------+--------+------------+---------------+---------+-------+----------+--------------------+-----------------+----------------- +-----------------+---------+----------+-------------------+------------------ relation | 15737 | 12191 | | | | | | | | | 10/361 | 139774354519808 | 139774354519808 | AccessShareLock | t | t | 3d79:2f9f:0:0:0:0 | 0:0#0 virtualxid | | | | | | 10/361 | | | | | 10/361 | 139774354519808 | 139774354519808 | ExclusiveLock | t | t | a:169:0:0:0:7 | 0:0#0 (2 rows) openGauss=# 查询等待锁的线程状态信息openGauss=# openGauss=# SELECT * FROM pg_thread_wait_status WHERE wait_status = 'acquire lock'; node_name | db_name | thread_name | query_id | tid | sessionid | lwtid | psessionid | tlevel | smpid | wait_status | wait_event | locktag | lockmode | block_sessionid | glo bal_sessionid -----------+---------+-------------+----------+-----+-----------+-------+------------+--------+-------+-------------+------------+---------+----------+-----------------+---- -------------- (0 rows) openGauss=# 结束系统进程查找正在运行的系统进程,然后使用kill命令结束此进程。ps ux kill -9 pid1.3 统计事件数据SQL语句长时间运行会占用大量系统资源,用户可以通过查看事件发生的时间,占用内存大小来了解现在数据库运行状态。查询事件的时间查询事件的线程启动时间、事务启动时间、SQL启动时间以及状态变更时间。openGauss=# openGauss=# SELECT backend_start,xact_start,query_start,state_change FROM pg_stat_activity; backend_start | xact_start | query_start | state_change -------------------------------+-------------------------------+-------------------------------+------------------------------- 2024-06-04 14:14:59.495553+08 | 2024-06-04 14:16:37.230204+08 | 2024-06-04 14:16:37.230204+08 | 2024-06-04 14:16:37.230213+08 2024-06-04 14:06:52.221142+08 | | | 2024-06-04 14:06:52.221165+08 2024-06-04 14:06:52.221488+08 | | | 2024-06-04 14:16:36.773155+08 2024-06-04 14:06:52.186252+08 | | | 2024-06-04 14:06:52.21675+08 2024-06-04 14:06:52.186624+08 | | | 2024-06-04 14:06:52.219453+08 2024-06-04 14:06:52.174372+08 | | | 2024-06-04 14:06:52.219536+08 2024-06-04 14:06:52.21677+08 | | | 2024-06-04 14:16:32.812367+08 2024-06-04 14:06:52.217589+08 | | | 2024-06-04 14:16:36.872384+08 (8 rows) openGauss=# 查询当前服务器的会话计数信息openGauss=# openGauss=# SELECT count(*) FROM pg_stat_activity; count ------- 8 (1 row) openGauss=# 查询系统级统计信息查询当前使用内存最多的会话信息。openGauss=# openGauss=# SELECT * FROM pv_session_memory_detail() ORDER BY usedsize desc limit 10; sessid | threadid | contextname | level | parent | totalsize | freesize | usedsize --------+----------+-------------+-------+--------+-----------+----------+---------- (0 rows) openGauss=# 1.4 对象检查表、索引、分区、约束等是数据库的核心存储对象,其核心信息和对象维护是DBA重要的日常工作。查询表统计信息 starelid | starelkind | staattnum | stainherit | stanullfrac | stawidth | stadistinct | stakind1 | stakind2 | stakind3 | stakind4 | stakind5 | staop1 | staop2 | staop3 | st aop4 | staop5 | stanumbers1 | stanumbers2 | stanumbers3 查询分区表信息openGauss=# openGauss=# SELECT * FROM pg_partition; relname | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | tr ansit | reloptions | relfrozenxid64 | relminmxid | partkeyexpr | partitionno | subpartitionno ---------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+ ------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+--- ------+------------+----------------+------------+-------------+-------------+---------------- (0 rows) openGauss=# 收集统计信息使用ANALYZE语句收集数据库相关的统计信息。使用VACUUM语句可以回收空间并更新统计信息。查询约束信息openGauss=# SELECT * FROM pg_partition; relname | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | tr ansit | reloptions | relfrozenxid64 | relminmxid | partkeyexpr | partitionno | subpartitionno ---------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+ ------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+--- ------+------------+----------------+------------+-------------+-------------+---------------- (0 rows) openGauss=# SELECT * FROM pg_constraint; conname | connamespace | contype | condeferrable | condeferred | convalidated | conrelid | contypid | conindid | confrelid | confupdtype | confdeltype | confmatchtype | conislocal | coninhcount | connoinherit | consoft | conopt | conkey | confkey | conpfeqop | conppeqop | conffeqop | conexclop | conbin | consrc | conincluding ------------------------------+--------------+---------+---------------+-------------+--------------+----------+----------+----------+-----------+-------------+------------- +---------------+------------+-------------+--------------+---------+--------+--------+---------+-----------+-----------+-----------+-----------+---------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------+--------------------------------------------------------------------------------------------+-------------- cardinal_number_domain_check | 14722 | c | f | f | t | 0 | 14735 | 0 | 0 | | | | t | 0 | f | f | f | | | | | | | {OPEXPR :opno 525 :opfuncid 150 :opresulttype 16 :opretset false :opcollid 0 :inputcollid 0 :args ({COERCETODOMAINVALUE :typeId 23 :typeMod -1 :collation 0 :location 5812} {CONST :consttype 23 :constt ypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :ismaxvalue false :location 5821 :constvalue 4 [ 0 0 0 0 0 0 0 0 ] :cursor_data :row_count 0 :cur_dn o -1 :is_open false :found false :not_found false :null_open false :null_fetch false}) :location 5818} | (VALUE >= 0) | yes_or_no_check | 14722 | c | f | f | t | 0 | 14743 | 0 | 0 | | | | t | 0 | f | f | f | | | | | | | {SCALARARRAYOPEXPR :opno 98 :opfuncid 67 :useOr true :inputcollid 100 :args ({RELABELTYPE :arg {COERCETODOMAINVALUE :typeId 1043 :typeMod 7 :collation 100 :location 6507} :resulttype 25 :resulttypmod -1 :resultcollid 100 :relabelformat 2 :location -1} {ARRAYCOERCEEXPR :arg {ARRAY :array_typeid 1015 :array_collid 100 :element_typeid 1043 :elements ({CONST :consttype 1043 :consttypmod -1 :constcollid 100 :constlen -1 :constbyval false :constisnull false :ismaxvalue false :location 6517 :constvalue 7 [ 28 0 0 0 89 69 83 ] :cursor_data :row_co unt 0 :cur_dno -1 :is_open false :found false :not_found false :null_open false :null_fetch false} {CONST :consttype 1043 :consttypmod -1 :constcollid 100 :constlen -1 :cons tbyval false :constisnull false :ismaxvalue false :location 6524 :constvalue 6 [ 24 0 0 0 78 79 ] :cursor_data :row_count 0 :cur_dno -1 :is_open false :found false :not_fou nd false :null_open false :null_fetch false}) :multidims false :location -1} :elemfuncid 0 :resulttype 1009 :resulttypmod -1 :resultcollid 100 :isExplicit false :coerceforma t 2 :location -1}) :location 6513} | ((VALUE)::text = ANY ((ARRAY['YES'::character varying, 'NO'::character varying])::text[])) | 1.5 备份数据备份重于一切,日常应检查备份执行情况,并检查备份有效性,确保备份能够保障数据安全,备份安全加密也应兼顾。指定用户导出数据库[omm@worker1 script]$ gs_dump postgres -p 15000 -f out.sql -U omm -W password gs_dump[port='15000'][postgres][2024-06-04 14:30:29]: Begin scanning database. Progress: [==================================================] 100% (38/37, cur_step/total_step). finish scanning database gs_dump[port='15000'][postgres][2024-06-04 14:30:29]: Finish scanning database. gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: Start dumping objects Progress: [==================================================] 100% (4825/4825, dumpObjNums/totalObjNums). dump objects gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: Finish dumping objects gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: dump database postgres successfully gs_dump[port='15000'][postgres][2024-06-04 14:30:30]: total time: 141 ms [omm@worker1 script]$ 1.6 基本信息检查基本信息包括版本、组件、补丁集等信息,定期检查数据库信息并登记在案是数据库生命周期管理的重要内容之一。版本信息[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=# SELECT version(); version ----------------------------------------------------------------------------------------------------------------------------------------------------------- (openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 10.3.0, 64-bit (1 row) openGauss=# 2、检查操作系统参数检查办法通过openGauss提供的gs_checkos工具可以完成操作系统状态检查。只能使用root用户执行gs_checkos命令。以root用户身份登录任意一台服务器。执行如下命令对openGauss节点服务器的OS参数进行检查。gs_checkos -i A检查节点服务器的OS参数的目的是保证openGauss正常通过预安装,并且在安装成功后可以安全高效的运行。详细的检查项目请参见《工具与命令参考》中“服务端工具 > gs_checkos”章节。实验示例:执行gs_checkos前需要先使用gs_preinstall工具执行前置脚本,准备环境。以参数“A”为例。[root@worker1 script]# ./gs_checkos -i A Checking items: A1. [ OS version status ] : Normal A2. [ Kernel version status ] : Normal A3. [ Unicode status ] : Normal A4. [ Time zone status ] : Normal A5. [ Swap memory status ] : Normal A6. [ System control parameters status ] : Warning A7. [ File system configuration status ] : Warning A8. [ Disk configuration status ] : Normal A9. [ Pre-read block size status ] : Normal A10.[ IO scheduler status ] : Normal A11.[ Network card configuration status ] : Warning A12.[ Time consistency status ] : Warning A13.[ Firewall service status ] : Normal A14.[ THP service status ] : Normal Total numbers:14. Abnormal numbers:0. Warning numbers:4. [root@worker1 script]# [root@worker1 script]# ./gs_checkos -i B Setting items: B1. [ Set system control parameters ] : Normal B2. [ Set file system configuration value ] : Normal B3. [ Set pre-read block size value ] : Normal B4. [ Set IO scheduler value ] : Normal B5. [ Set network card configuration value ] : Normal B6. [ Set THP service ] : Normal B7. [ Set RemoveIPC value ] : Normal B8. [ Set Session Process ] : Normal NOTICE: MTU value and some warning items can NOT be set. Please do it manually. Total numbers:8. Abnormal numbers:0. Warning numbers:0. [root@worker1 script]# 3、检查openGauss健康状态检查办法通过openGauss提供的gs_check工具可以开展openGauss健康状态检查。扩容新节点检查只能在root用户下执行,其他场景都必须在omm用户下执行。必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。可使用–skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。检查扩容新节点与现有节点之间的一致性,在现有节点执行gs_check命令指定–hosts参数进行检查,其中hosts文件中需要写入新节点ip。方式1:以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库状态进行检查。[root@worker1 script]# su - omm 上一次登录:二 6月 4 12:08:50 CST 2024pts/0 上 [omm@worker1 ~]$ cd /soft/script/ [omm@worker1 script]$ gs_check -i CheckClusterState Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045258581071.tar.gz [omm@worker1 script]$ 其中,-i指定检查项,注意区分大小写。格式:-i CheckClusterState、-i CheckCPU或-i CheckClusterState,CheckCPU。取值范围为所有支持的检查项名称,详细列表请参见《工具与命令参考》中“服务端工具 > gs_checkos > openGauss状态检查表”,用户可以根据需求自己编写新检查项。方式2:以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库进行健康检查。[omm@worker1 script]$ ./gs_check -e inspect Parsing the check items config file successfully The below items require root privileges to execute:[CheckBlockdev CheckIOrequestqueue CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] Please enter root privileges user[root]:root Please enter password for user[root]: Check root password connection successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:57 Nodes:1 Checking... [=========================] 57/57 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 CheckDBParams...............................OK The item run on 1 nodes. success: 1 CheckDebugSwitch............................OK The item run on 1 nodes. success: 1 CheckDirPermissions.........................NG The item run on 1 nodes. ng: 1 其中,-e指定场景名,注意区分大小写。格式:-e inspect或-e upgrade。取值范围为所有支持的巡检场景名称,默认列表包括:inspect(例行巡检)、upgrade(升级前巡检)、install(安装)、binary_upgrade(就地升级前巡检)、health(健康检查巡检)、slow_node(节点)、longtime(耗时长巡检),用户可以根据需求自己编写场景。openGauss巡检的主要作用是在openGauss运行过程中,检查整个openGauss状态是否正常,或者重大操作前(升级、扩容),确保openGauss满足操作所需的环境条件和状态条件。详细的巡检项目和场景请参见《工具与命令参考》中“服务端工具 > gs_checkos > openGauss状态检查表”。实验示例:执行单项检查结果:[omm@worker1 script]$ gs_check -i CheckCPU Parsing the check items config file successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:1 Nodes:1 Checking... [=========================] 1/1 Start to analysis the check result CheckCPU....................................OK The item run on 1 nodes. success: 1 Analysis the check result successfully Success. All check items run completed. Total:1 Success:1 For more information please refer to /opt/openGauss/install/tool/script/gspylib/inspection/output/CheckReport_202406045339389877.tar.gz [omm@worker1 script]$ 本地执行结果:[omm@worker1 script]$ gs_check -i CheckCPU -L 2024-06-04 14:50:42 [NAM] CheckCPU 2024-06-04 14:50:42 [STD] 检查主机CPU占用率,如果idle 大于30%,或者 iowait 小于 30%.则检查项通过,否则检查项不通过 2024-06-04 14:50:42 [RST] OK 2024-06-04 14:50:42 [RAW] Linux 3.10.0-693.el7.x86_64 (worker1) 06/04/24 _x86_64_ (8 CPU) 14:50:37 CPU %user %nice %system %iowait %steal %idle 14:50:38 all 0.63 0.00 0.00 0.00 0.00 99.37 14:50:39 all 0.62 0.00 0.12 0.00 0.00 99.25 14:50:40 all 0.62 0.00 0.12 0.00 0.00 99.25 14:50:41 all 0.63 0.00 0.00 0.00 0.00 99.37 14:50:42 all 0.62 0.00 0.12 0.00 0.00 99.25 Average: all 0.63 0.00 0.08 0.00 0.00 99.30 [omm@worker1 script]$ 执行场景检查结果:[omm@worker1 script]$ gs_check -e inspect Parsing the check items config file successfully The below items require root privileges to execute:[CheckBlockdev CheckIOrequestqueue CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] Please enter root privileges user[root]:root Please enter password for user[root]: Check root password connection successfully Distribute the context file to remote hosts successfully Start to health check for the cluster. Total Items:57 Nodes:1 Checking... [=========================] 57/57 Start to analysis the check result CheckClusterState...........................OK The item run on 1 nodes. success: 1 CheckDBParams...............................OK The item run on 1 nodes. success: 1 CheckDebugSwitch............................OK The item run on 1 nodes. success: 1 CheckDirPermissions.........................NG The item run on 1 nodes. ng: 1 The ng[worker1] value: 4、检查数据库性能通过openGauss提供的性能统计工具gs_checkperf可以对硬件性能进行检查。以操作系统用户omm登录数据库主节点。执行如下命令对openGauss数据库进行性能检查。[omm@worker1 script]$ gs_checkperf Cluster statistics information: Host CPU busy time ratio : .24 % MPPDB CPU time % in busy time : .04 % Shared Buffer Hit ratio : 97.10 % In-memory sort ratio : 0 Physical Reads : 1437 Physical Writes : 22 DB size : 51 MB Total Physical writes : 22 Active SQL count : 4 Session count : 8 [omm@worker1 script]$ 具体的性能统计项目请参见《工具与命令参考》中“服务端工具 > gs_checkperf > 性能检查项”。实验示例:以简要格式在屏幕上显示性能统计结果。[omm@worker1 script]$ gs_checkperf -i pmk -U omm Cluster statistics information: Host CPU busy time ratio : .24 % MPPDB CPU time % in busy time : .04 % Shared Buffer Hit ratio : 97.97 % In-memory sort ratio : 0 Physical Reads : 1451 Physical Writes : 155 DB size : 51 MB Total Physical writes : 155 Active SQL count : 4 Session count : 8 [omm@worker1 script]$ 5、检查和清理日志日志是检查系统运行及故障定位的关键手段。建议按月度例行查看操作系统日志及数据库的运行日志。同时,随着时间的推移,日志的增加会占用较多的磁盘空间。建议按月度清理数据库的运行日志。5.1 检查操作系统日志建议按月检查操作系统日志,排除操作系统运行异常隐患。执行如下命令查看操作系统日志文件。[root@worker1 script]# vim /var/log/messages关注其中近一个月出现的kernel、error、fatal等字样,根据系统报警信息进行处理。5.2 检查openGauss运行日志数据库运行时,某些操作在执行过程中可能会出现错误,数据库依然能够运行。但是此时数据库中的数据可能已经发生不一致的情况。建议按月检查openGauss运行日志,及时发现隐患。以操作系统用户omm登录数据库主节点。执行如下命令收集数据库日志。gs_collector --begin-time="20240604 01:01" --end-time="20240604 23:59"[omm@worker1 script]$ gs_collector --begin-time="20240604 01:01" --end-time="20240604 23:59" Successfully parsed the configuration file. create Dir. Successfully create dir. do System check 0:1 Collecting OS information. Successfully collected OS information. do Database check 0:1 Collecting catalog statistics. Successfully collected catalog statistics. do not enable dss, cannot collect dss config files do not enable dss, cannot collect dss disk info do Log check 0:1 Collecting Log files. The cmd is source /soft/script/ENVFILE; python3 '/opt/openGauss/install/tool/script/local/LocalCollect.py' -t log_copy -U omm -b '202406040101' -e '202406042359' -k '' -l /opt/openGauss/install/log/omm/om/gs_local.log -s 1048576 -S 0 -C '{#TypeName#: #Log#, #Content#: #DN,cm,om,bin,DSS,DMS,#, #Interval#: #0#, #Count#: #1#, #FileNumber#: #0#}' Failed collected Log files. do Config check 0:1 Collecting Config files. Successfully collected Config files. Collecting files. Successfully collected files. All results are stored in /opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz. [omm@worker1 script]$ 20240604 01:01为日志的开始时间,20240604 23:59为日志的结束时间。根据界面输出提示,进入相应的日志收集目录,解压收集的日志,并检查数据库日志。以下以日志收集路径“/opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz”为例进行操作。[omm@worker1 omm]$ tar -xvzf /opt/openGauss/install/log/omm/collector_20240604_220848.tar.gz collector_20240604_220848/ collector_20240604_220848/Detail.log collector_20240604_220848/worker1.tar.gz collector_20240604_220848/Summary.log [omm@worker1 omm]$ cd /opt/openGauss/install/log/omm/collector_20240604_220848 [omm@worker1 collector_20240604_220848]$ ls Detail.log Summary.log worker1.tar.gz [omm@worker1 collector_20240604_220848]$ 5.3 清理运行日志数据库运行过程中会产生大量运行日志,占用大量的磁盘空间,建议清理过期日志文件,只保留一个月的日志。操作步骤以操作系统用户omm登录数据库主节点。清理日志。a. 将超过1个月的日志备份到其他磁盘。b. 进入日志存放目录。[omm@worker1 script]$ cd $GAUSSLOG [omm@worker1 omm]$ ls asp_data cm collector_20240604_220848.tar.gz mem_log pg_audit pg_perf bin collector_20240604_220848 gs_profile om pg_log sql_monitor [omm@worker1 omm]$ c. 进入相应的子目录,使用如下方式删除1个月之前产生的日志。rm 日志名称日志文件的命名格式为“postgresql-年-月-日_HHMMSS”。[omm@worker1 omm]$ rm -rf collector_20240604_2208487、检查应用连接数如果应用程序与数据库的连接数超过最大值,则新的连接无法建立。建议每天检查连接数,及时释放空闲的连接或者增加最大连接数。操作步骤以操作系统用户omm登录数据库主节点。使用如下命令连接数据库。gsql -d postgres -p 15000postgres为需要连接的数据库名称,1500为数据库主节点的端口号。连接成功后,系统显示类似如下信息:[omm@worker1 omm]$ [omm@worker1 omm]$ 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=# 执行如下SQL语句查看连接数。openGauss=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;显示类似如下的信息,其中2表示当前有两个应用连接到数据库。openGauss=# openGauss=# SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s; count ------- 20 (1 row) openGauss=# 查看现有最大连接数。openGauss=# SHOW max_connections;显示信息如下,其中200为现在的最大连接数。openGauss=# openGauss=# SHOW max_connections; max_connections ----------------- 5000 (1 row) openGauss=# 四、数据安全维护建议为保证openGauss数据库中的数据安全,避免丢失数据、非法访问数据等事故发生,请仔细阅读以下内容。1、避免数据被丢失建议用户规划周期性的物理备份,且对备份文件进行可靠的保存。在系统发生严重错误的情况下,可以利用备份文件,将系统恢复到备份前的状态。2、避免数据被非法访问建议对数据库用户进行权限分级管理。数据库管理员根据业务需要,建立用户并赋予权限,保证各用户对数据库的合理访问。对于openGauss的服务端和客户端(或基于客户端库开发的应用程序),最好也部署在可信任的内网中。如果服务端和客户端一定要部署在非信任的网络中,需要在服务启动前,打开SSL加密,保证数据在非信任网络上的传输安全。需要注意的是,打开SSL加密会降低数据库的性能。3、避免系统日志泄露个人数据将调试日志发给他人进行分析前,请删除个人数据。说明: 因为日志级别(log_min_messages)设置为DEBUGx(x为DEBUG级别,取值范围为1~5)时,调试日志中记录的信息可能包含用户的个人数据。将系统日志发给其他人进行分析前,请删除个人数据。因为在默认配置下,当SQL语句执行错误时,日志中会记录出错的SQL语句,而这些SQL语句中可能包含用户个人数据。将log_min_error_statement参数的值设置为PANIC,可以避免将出错的SQL语句记录在系统日志中。若禁用该功能,当出现故障时,很难定位故障原因。总结本文详细介绍了openGauss 6.0.0数据库的日常运维,包括安装与部署、数据导入与导出、备份与恢复、性能调优与监控以及安全加固与防护等方面。希望能够帮助用户更好地管理和维护openGauss 6.0.0数据库,保障企业信息化建设的稳定和发展。
-
作者:风一样自由一、环境部署服务器信息IP主机名版本端口发布端(源端)192.168.59.149yf46.0.0-RC115000订阅端(目标端)192.168.59.151yf56.0.0-RC1150001.修改配置文件发布端:cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF"wal_level=logicalmax_replication_slots=8EOFwal_level:必须设置logical才支持逻辑复制max_replication_slots>=每个节点所需的(物理流复制槽数+逻辑复制槽数)cat >> /opt/openGauss/install/data/dn1/pg_hba.conf << "EOF"host replication repl 0.0.0.0/0 sha256EOF订阅端:cat >> /opt/openGauss/install/data/dn1/postgresql.conf << "EOF"wal_level=logicalmax_replication_slots=8EOF修改完发布端与订阅端参数文件,重启生效。gs_om -t restart2.发布端创建逻辑复制用户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 TABLE4.发布端创建发布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 TABLE6.订阅端创建加密文件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 publisherCREATE 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 TABLEopenGauss=# \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再接再厉,再创辉煌。
-
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操作,提高系统的性能和安全性。openGauss触发器会在指定的数据库事件发生时自动执行函数。本文将详细介绍 openGauss 的触发器,并提供具体的代码和案例,以帮助读者更好地理解和应用这些工具。 一、触发器1. 什么是触发器触发器是一种特殊类型的存储过程,它会在特定事件(如插入、更新、删除)发生时自动执行。触发器能够自动响应数据库表中的变化,进行数据验证、日志记录等操作。使用触发器可以确保数据的完整性、一致性,并实现复杂的业务逻辑。触发器的特点包括:自动执行:触发器在指定事件发生时自动执行,无需显式调用。灵活性:可以根据具体业务需求,灵活定义触发器的执行逻辑。实时性:触发器在事件发生时立即执行,保证数据的实时性。2. 创建和使用触发器在 openGauss 中,创建触发器需要使用 CREATE TRIGGER 语句。触发器通常需要配合触发器函数(存储过程)一起使用。下面是多个触发器的例子,演示如何创建和使用触发器。创建日志表-- 创建日志表CREATE TABLE employee_changes (change_id SERIAL PRIMARY KEY,emp_id INT,change_type VARCHAR(10),change_time TIMESTAMP,old_name VARCHAR(100),new_name VARCHAR(100),old_salary NUMERIC(15, 2),new_salary NUMERIC(15, 2),old_department VARCHAR(100),new_department VARCHAR(100));创建触发器函数和触发器-- 创建插入触发器函数CREATE OR REPLACE FUNCTION log_insert_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, new_name, new_salary, new_department)VALUES (NEW.id, 'INSERT', CURRENT_TIMESTAMP, NEW.name, NEW.salary, NEW.department);RETURN NEW;END;$$;-- 创建更新触发器函数CREATE OR REPLACE FUNCTION log_update_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, new_name, old_salary, new_salary, old_department, new_department)VALUES (OLD.id, 'UPDATE', CURRENT_TIMESTAMP, OLD.name, NEW.name, OLD.salary, NEW.salary, OLD.department, NEW.department);RETURN NEW;END;$$;-- 创建删除触发器函数CREATE OR REPLACE FUNCTION log_delete_employee()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO employee_changes (emp_id, change_type, change_time, old_name, old_salary, old_department)VALUES (OLD.id, 'DELETE', CURRENT_TIMESTAMP, OLD.name, OLD.salary, OLD.department);RETURN OLD;END;$$;-- 创建触发器CREATE TRIGGER trigger_insert_employeeAFTER INSERT ON employeesFOR EACH ROWEXECUTE FUNCTION log_insert_employee();CREATE TRIGGER trigger_update_employeeAFTER UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION log_update_employee();CREATE TRIGGER trigger_delete_employeeAFTER DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_delete_employee();3. 验证触发器通过插入、更新和删除操作来验证触发器的功能,确保日志表记录了相应的变更。-- 插入员工数据以触发触发器INSERT INTO employees (id, name, salary, department)VALUES (1, 'John Doe', 50000, 'Engineering');-- 更新员工数据以触发触发器UPDATE employeesSET name = 'John Doe', salary = 55000, department = 'Marketing'WHERE id = 1;-- 删除员工数据以触发触发器DELETE FROM employeesWHERE id = 1;-- 查询日志表SELECT * FROM employee_changes;4. 触发器的高级应用触发器不仅可以用于基本的数据变更日志记录,还可以用于更复杂的业务逻辑处理。以下是一些触发器的高级应用场景:数据完整性维护触发器可以在数据插入、更新或删除时自动检查和维护数据的完整性。例如,可以在员工表中添加触发器,确保同一部门中的员工薪资总和不超过某个限制。-- 创建触发器函数CREATE OR REPLACE FUNCTION check_salary_limit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$DECLAREtotal_salary NUMERIC;BEGINSELECT SUM(salary) INTO total_salaryFROM employeesWHERE department = NEW.department;IF total_salary + NEW.salary > 1000000 THENRAISE EXCEPTION 'Total salary in department % exceeds limit', NEW.department;END IF;RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_check_salary_limitBEFORE INSERT OR UPDATE ON employeesFOR EACH ROWEXECUTE FUNCTION check_salary_limit();审计和日志记录触发器可以记录数据的变化历史,便于追踪和审计。例如,可以在员工表中添加触发器,记录每次更新操作的详细信息,包括操作人、操作时间和更新前后的数据。-- 创建审计日志表CREATE TABLE audit_log (log_id SERIAL PRIMARY KEY,emp_id INT,operation VARCHAR(10),operation_time TIMESTAMP,operator VARCHAR(100),old_data JSON,new_data JSON);-- 创建触发器函数CREATE OR REPLACE FUNCTION log_audit()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGININSERT INTO audit_log (emp_id, operation, operation_time, operator, old_data, new_data)VALUES (NEW.id,TG_OP,CURRENT_TIMESTAMP,current_user,ROW_TO_JSON(OLD),ROW_TO_JSON(NEW));RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_audit_logAFTER INSERT OR UPDATE OR DELETE ON employeesFOR EACH ROWEXECUTE FUNCTION log_audit();自动计算和更新触发器可以在数据发生变化时自动计算和更新相关联的数据,保持数据的一致性。例如,可以在订单表中添加触发器,当订单状态变为“已发货”时,自动更新库存表。-- 创建订单表CREATE TABLE orders (order_id INT PRIMARY KEY,product_id INT,quantity INT,status VARCHAR(20));-- 创建库存表CREATE TABLE inventory (product_id INT PRIMARY KEY,stock INT);-- 创建触发器函数CREATE OR REPLACE FUNCTION update_inventory()RETURNS TRIGGERLANGUAGE plpgsqlAS $$BEGINIF NEW.status = 'Shipped' THENUPDATE inventorySET stock = stock - NEW.quantityWHERE product_id = NEW.product_id;END IF;RETURN NEW;END;$$;-- 创建触发器CREATE TRIGGER trigger_update_inventoryAFTER UPDATE ON ordersFOR EACH ROWWHEN (NEW.status = 'Shipped')EXECUTE FUNCTION update_inventory();二、总结存储过程和触发器是 openGauss 数据库中的重要工具,能够帮助开发者简化复杂的数据库操作,实现自动化管理。在实际应用中,通过合理地使用存储过程和触发器,可以提高数据库系统的效率和可靠性。本文详细介绍了存储过程和触发器的基本概念、创建方法、应用场景,并提供了具体的代码和案例,帮助读者更好地理解和应用这些工具。希望本文能够对您在数据库开发和管理中有所帮助。
-
前言openGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统,然而其全功能部署对系统要求非常高。本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将openGauss部署到华为云的ECS上,以便快速进行功能验证以及小规模数据库应用开发。本教程预计实现的目标:开通安装有CentOS 8.2的华为云ECS安装并启动openGauss 5.0.0 LTS放通公网访问(本文部署到25432端口)能够使用Navicat等数据库软件以PostgreSQL兼容的方式进行连接本教程仅供实验测试使用,安全性较低,请勿在生产环境按该教程部署一、 开通华为云ECS在华为云控制台中搜索弹性云服务器产品并购买相关参数解释说明与推荐区域:服务器所在的区域,不同区域定价差异较大,可以选择成本较低的区域如西南-贵阳一计费模式:若需要长期部署应用(如课程作业开发),推荐选择包月规格:服务器的配置,为了运行openGauss,内存必须2GB以上,推荐至少4GB,经测试若配置过低会导致数据库无法安装、运行或中途崩溃。成本较低的可以选择通用计算型s6(s6.medium.4),基础报价约86元每月。镜像:服务器预装的操作系统,openGauss只支持OpenEuler和CentOS系列。考虑到一些软件的支持性,本教程采用CentOS 8.2 64bit,尽管官方只说明能够在CentOS7.6上运行,但实测该系统也能够正常运行部署。系统盘:服务器运行的硬盘,若要节省成本可以选择高IO点击下一步(网络配置)网络、子网:保持默认配置即可安全组:为了能够使服务器能够在外网访问数据库端口,我们必须预先放通相关端口,本教程以部署在25432端口为例(修改了默认的端口以降低扫描器发现并爆破密码的几率),此外我们可以顺便放通22、80等常用端口(使用“一键放通常用端口”按钮)IP:为了公网访问,必须购买弹性IP。若服务器应用流量不大,推荐按流量计费,带宽可以选最高的(300M),建议勾选“随实例释放”避免在服务器过期后继续计费。按带宽计费成本非常高,不建议测试使用。点击下一步(高级配置)登录凭证:自行设定云备份:为节省成本可以关闭(不购买)支付:拥有基座课程代金券的同学可以使用代金券连续购买多个月,节省部署成本。(按流量计费的服务器产生的流量可能仍会额外消耗余额)至此,华为云ECS已经创建完成二、安装openGauss创建数据库专用账户openGauss的安全性设计必须以root以外的用户运行首先用刚才的凭证使用root用户连接到服务器在终端中运行以下命令groupadd dbgroup useradd -g dbgroup omm passwd omm 输入你的omm账户密码 这创建了一个omm账户以及一个用户组下载openGauss下载、解压并调整相关文件权限curl -o opengauss.tar.gz https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/x86/openGauss-5.0.0-CentOS-64bit-all.tar.gz mkdir /opt/software/ mkdir /opt/software/openGauss tar -xvf opengauss.tar.gz -C /opt/software/ cd /opt/software/ tar -jxf openGauss-5.0.0-CentOS-64bit.tar.bz2 -C /opt/software/openGauss chown -R omm /opt/software/ 安装依赖对于本文档中的CentOS 8,由于已经停止支持,我们需要切换yum源,以清华大学源为例minorver=8.5.2111 sudo sed -e "s|^mirrorlist=|#mirrorlist=|g" \ -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/$minorver|g" \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo CentOS 8安装供CentOS 7.6使用的OpenGauss会遇到一些问题,我们必须安装一些依赖yum install -y readline-devel libaio libnsl compat-openssl10 cd /usr/lib64 ln -s libreadline.so.7 libreadline.so.6 安装以下的命令将openGauss安装到25432端口,密码请在命令行中“设定的高强度密码”修改su omm cd /opt/software/openGauss/simpleInstall sh install.sh -w 设定的高强度密码 -p 25432 vim ~/.bashrc # *注释*ulimit那行(在行最前加一个#)若没有可以忽略 source ~/.bashrc 配置兼容、外网访问众所周知,openGauss拥有PostgreSQL兼容的接口,若在此进行相关修改便可以在应用处无需修改使用主流软件的PG驱动连接数据库服务器使用。我们下面来修改默认配置使其兼容PG的连接器。cd /opt/software/openGauss/data/single_node vim postgresql.conf 添加/取消注释以下行listen_addresses = '*' local_bind_address = '0.0.0.0' password_encryption_type = 0 vim pg_hba.conf host all all 0.0.0.0/0 md5 启动或重启数据库(omm用户)gs_ctl restart -D $GAUSSHOME/data/single_node 进入数据库命令行(omm用户)创建一个名为postgres的管理用户(因为默认的omm用户无法从外部登录),密码请在命令行中定义gsql -d postgres -p 25432 create user postgres password '你的高强度密码'; GRANT ALL PRIVILEGES TO postgres; \q 退出 至此,你已经可以使用Navicat等软件连接到数据库了。若提示找不到gs_ctl、gsql等命令,请在/opt/software/openGauss/下找到bin目录,并将其加入Path至此,本教程结束~欢迎各位同学交流学习作者:黄浩
-
作者:DoDoQ前置校验项目及不通过的处理1、Kafka服务可用性检查:[test@dev-openeuler-arm ~]$ jps3757401 SchemaRegistryMain3757072 SupportedKafka3756341 QuorumPeerMain-- 可以先执行停止kafka的命令,确保Kafka进程已停止,避免启动时出错,停止kafka的命令如下java -Dpath=/{portal_path}/portal/ -Dorder=stop_kafka -Dskip=true -jar /{portal_path}/portal/portalControl-*-exec.jar-- 启动kafka进程的命令java -Dpath=/{portal_path}/portal/ -Dorder=start_kafka -Dskip=true -jar /{portal_path}/portal/portalControl-*-exec.jar-- 出现类似如下日志信息,表示启动kafka成功log4j: reset attribute= "false".log4j: Threshold ="null".log4j: Level value for root is [debug].log4j: root level set to DEBUGlog4j: Class name: [org.apache.log4j.ConsoleAppender]log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"log4j: Setting property [conversionPattern] to [%d{HH:mm:ss,SS} %-5p (%C{1}:%M) - %m%n].log4j: Setting property [levelMin] to [INFO].log4j: Setting property [levelMax] to [ERROR].log4j: Setting property [acceptOnMatch] to [true].log4j: Adding filter of type [class org.apache.log4j.varia.LevelRangeFilter] to appender named [log.console].log4j: Adding appender named [log.console] to category [root].log4j: Class name: [org.apache.log4j.DailyRollingFileAppender]log4j: Setting property [file] to [/data/test/portal/portal//logs/portal_.log].log4j: Setting property [append] to [true].log4j: Setting property [datePattern] to [yyyy-MM-dd].log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"log4j: Setting property [conversionPattern] to [%d{HH:mm:ss,SS} %-5p (%C{1}:%M) - %m%n].log4j: Setting property [levelMin] to [INFO].log4j: Setting property [levelMax] to [ERROR].log4j: Setting property [acceptOnMatch] to [true].log4j: Adding filter of type [class org.apache.log4j.varia.LevelRangeFilter] to appender named [log.file].log4j: setFile called: /data/test/portal/portal//logs/portal_.log, truelog4j: setFile endedlog4j: Appender [log.file] to be rolled at midnight.log4j: Adding appender named [log.file] to category [root].19:35:00,492 INFO (ParamsUtils:initMigrationParamsFromProps) - properties = {awt.toolkit=sun.awt.X11.XToolkit, java.specification.version=11, sun.cpu.isalist=, sun.jnu.encoding=UTF-8, java.class.path=/data/test/portal/portal/portalControl-6.0.0rc1-exec.jar, java.vm.vendor=BiSheng, sun.arch.data.model=64, path=/data/test/portal/portal/, java.vendor.url=https://gitee.com/openeuler/bishengjdk-11/, user.timezone=Asia/Shanghai, os.name=Linux, java.vm.specification.version=11, sun.java.launcher=SUN_STANDARD, user.country=US, order=start_kafka, sun.boot.library.path=/data/test/env/java/bisheng-jdk-11.0.20/lib, sun.java.command=/data/test/portal/portal/portalControl-6.0.0rc1-exec.jar, jdk.debug=release, sun.cpu.endian=little, user.home=/home/test, user.language=en, java.specification.vendor=Oracle Corporation, java.version.date=2023-07-18, java.home=/data/test/env/java/bisheng-jdk-11.0.20, file.separator=/, java.vm.compressedOopsMode=Zero based, line.separator=, java.specification.name=Java Platform API Specification, java.vm.specification.vendor=Oracle Corporation, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.protocol.handler.pkgs=org.springframework.boot.loader, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, java.runtime.version=11.0.20+11, user.name=test, skip=true, path.separator=:, os.version=4.19.90-2110.8.0.0119.oe1.aarch64, java.runtime.name=OpenJDK Runtime Environment, file.encoding=UTF-8, java.vm.name=OpenJDK 64-Bit Server VM, java.vendor.version=BiSheng, java.vendor.url.bug=https://gitee.com/openeuler/bishengjdk-11/issues/, java.io.tmpdir=/tmp, java.version=11.0.20, user.dir=/data/test/portal, os.arch=aarch64, java.vm.specification.name=Java Virtual Machine Specification, java.awt.printerjob=sun.print.PSPrinterJob, sun.os.patch.level=unknown, java.library.path=/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-5.1.1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0rc1:/data/test/portal/portal/tools/chameleon/chameleon-6.0.0:/data/xz_u2/base/opt/huawei/install/om/lib:/data/xz_u2/base/opt/huawei/install/om/script/gspylib/clib::/usr/java/packages/lib:/lib:/usr/lib:/usr/lib64:/lib64, java.vm.info=mixed mode, java.vendor=BiSheng, java.vm.version=11.0.20+11, java.specification.maintenance.version=2, sun.io.unicode.encoding=UnicodeLittle, java.class.version=55.0}19:35:00,567 INFO (MigrationConfluentInstanceConfig:getSystemParamAndParseEntity) - get MigrationConfluentInstanceConfig from system param = MigrationConfluentInstanceConfig(id=null, zookeeperPort=null, kafkaPort=null, zkIp=null, kafkaIp=null, installDir=null, bindPortalId=null, zkIpPort=null, kafkaIpPort=null, schemaRegistryIpPort=null, schemaRegistryIp=null, schemaRegistryPort=null, bindPortalHost=null, thirdPartySoftwareConfigType=null)19:35:00,569 INFO (KafkaUtils:changeConfluentDirFromSysParam) - no need change param19:35:00,576 INFO (FileUtils:createFile) - File /data/test/portal/portal/portal.portId.lock already exists.19:35:00,587 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1 already exists.19:35:00,587 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/tmp/ already exists.19:35:00,592 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs already exists.19:35:00,631 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/ already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/incremental/ already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/portal.txt already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/full_migration.txt already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/incremental_migration.txt already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/status/reverse_migration.txt already exists.19:35:00,632 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs/debezium/ already exists.19:35:00,633 INFO (FileUtils:createFile) - File /data/test/portal/portal/workspace/1/logs/datacheck/ already exists.19:35:00,650 INFO (ParamsUtils:changeDatacheckLogLevel) - global log level param is empty19:35:00,796 INFO (MigrationConfluentInstanceConfig:getSystemParamAndParseEntity) - get MigrationConfluentInstanceConfig from system param = MigrationConfluentInstanceConfig(id=null, zookeeperPort=null, kafkaPort=null, zkIp=null, kafkaIp=null, installDir=null, bindPortalId=null, zkIpPort=null, kafkaIpPort=null, schemaRegistryIpPort=null, schemaRegistryIp=null, schemaRegistryPort=null, bindPortalHost=null, thirdPartySoftwareConfigType=null)19:35:00,851 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/zookeeper-server-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/kafka/zookeeper.properties19:35:00,938 INFO (RuntimeExecUtils:executeStartOrder) - Start zookeeper.19:35:02,964 INFO (MqTool:start) - kafkaOrder====/data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/kafka-topics --list --bootstrap-server 192.168.0.118:909219:35:03,07 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/kafka-server-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/kafka/server.properties19:35:03,93 INFO (RuntimeExecUtils:executeStartOrder) - Start kafka.19:35:05,102 INFO (RuntimeExecUtils:removeFile) - Remove file /data/test/portal/portal/tmp/test_.txt finished.19:35:07,108 INFO (RuntimeExecUtils:removeFile) - Remove file /data/test/portal/portal/tmp/test_.txt finished.19:35:07,174 INFO (RuntimeExecUtils:executeStartOrder) - start command = /data/test/portal//portal/tools/debezium/confluent-5.5.1/bin/schema-registry-start -daemon /data/test/portal//portal/tools/debezium/confluent-5.5.1/etc/schema-registry/schema-registry.properties19:35:07,181 INFO (RuntimeExecUtils:executeStartOrder) - Start kafka schema registry.19:35:10,281 INFO (MqTool:start) - Start kafka success.2、检查源端和目标端数据库是否可连接MySQL: mysql -h ip -P port -u user -ppassword -S /~/mysql.sock\ OpenGauss: gsql -r -d database -p port -U user -W password3、权限检查Mysql连接用户权限要求如下:为确认数据的顺利迁移,源端数据库(Mysql)的数据源添加时,请按照迁移需要添加所需权限,也可以直接给all权限;1)全量迁移: select 、reload、 lock tables 、replication client2)增量迁移: select 、replication client 、replication slave3)反向迁移: select 、update 、insert 、delete查询和修改用户权限的命令如下,如果连接用户权限不满足,请修改对应权限值。-- 查询用户权限的命令SELECT * FROM mysql.user WHERE USER = '{用户名}';-- 修改用户权限的命令语法格式如下,其中privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL;databasename:数据库名;tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*。GRANT privileges ON databasename.tablename TO '{用户名}';-- 赋予用户全量迁移权限的命令GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO '{用户名}';-- 赋予用户增量迁移权限的命令GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO '{用户名}';-- 赋予用户反向迁移权限的命令GRANT SELECT, UPDATE, INSERT, DELETE ON *.* TO '{用户名}';-- 赋予所有权限的命令GRANT ALL ON *.* TO '{用户名}';-- 在赋权后,确保刷新权限以使更改生效FLUSH PRIVILEGES;openGauss连接用户权限要求如下:通过Datakit平台安装的目标端数据库(openGauss)可以直接迁移,导入的数据库以及在创建任务时添加的自定义openGauss数据源,需要提前将用户权限改为SYSADMIN角色;-- 首先使用连接用户连接openGauss-- 查询rolreplication权限的命令select rolreplication from pg_roles;-- 修改权限的命令alter role '{用户名}' replication;修改openGauss用户权限的方式如下:方式一:(推荐,符合最小权限)#给要迁移的目标库target_source赋all权限给迁移用户openGauss_testgrant all on database target_source to openGauss_test;方式二:(不推荐)#修改用户角色为SYSADMINalter user {用户名} SYSADMIN;#查询用户角色,字段值为t时说明具有sysadmin角色,f时则没有select rolsystemadmin from PG_ROLES where rolname='{用户名}';有sysadmin角色权限:查询结果为t;无sysadmin角色权限:查询结果为f;4、日志参数检查增量迁移时,源数据库Mysql需要开启复制功能,在配置中增加以下配置参数,并重启log_bin=ONbinlog_format= ROWbinlog_row_image=FULL查询参数值是否设置成功的命令如下:SHOW VARIABLES LIKE 'log_bin';SHOW VARIABLES LIKE 'binlog_format';SHOW VARIABLES LIKE 'binlog_row_image';反向迁移时,需要在openGauss数据库增加如下配置,并重启-- 根据连接用户和实际网络配置命令gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication {connected username} {ip/port} sha256"-- 直接允许所有用户和网络配置命令gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication all 0.0.0.0/0 sha256"-- 修改参数的sql语句alter system set wal_level to logical;-- 或直接修改配置文件中的参数,其中“/opt/datakit/opengauss/datanode/dn1”为实际数据库节点目录gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -c "wal_level = logical"查询日志参数wal_level是否设置成功的命令如下:-- 查询是否允许复制的参数,为1表示设置成功select rolreplication from pg_roles where rolname='{用户名}'-- 查询wal_level参数show variables like 'wal_level';5、大小写参数检查需确保Mysql和OpenGauss的大小写参数一致,查询大小写参数的命令如下:-- 查询Mysql的大小写参数show variables like 'lower_case_table_names';-- 查询openGauss的大小写参数show dolphin.lower_case_table_names;修改大小写参数,使两者保持一致,修改方式如下:修改Mysql的大小写参数更改数据库参数文件my.cnf在mysqld下添加或修改 lower_case_table_names = 1 之后重启数据库修改openGauss的大小写参数alter user {用户名} set dolphin.lower_case_table_names to 0;6、磁盘空间校验迁移过程中会产生一些临时文件,需要占用一定的磁盘空间,要求磁盘满足---源端单表的最大数据量。7、B库校验迁移的目标数据库要求是B库,查询是否为B库的命令如下:show sql_compatibility;创建B库的命令create database {dbname} with dbcompatibility = 'b';8、Mysql加密方式校验查询系统默认加密方式的命令select @@default_authentication_plugin;修改系统默认加密方式更改数据库参数文件my.cnf在mysqld下添加或修改 default-authentication-plugin=mysql_native_password 之后重启数据库同时修改连接用户的加密方式为mysql_native_password,修改的sql语句如下:ALTER USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';9、复制参数校验启动反向迁移会占用逻辑复制槽位,需要确保openGauss有可使用的槽位。-- 查询当前使用的槽位select count(*) from pg_get_replication_slots();-- 查询系统最大槽位show max_replication_slots;槽位很少出现被占满的情况,如若被占满,通过如下操作删除无用槽位。-- 获取当前复制槽列表select * from pg_get_replication_slots();-- 删除流复制槽,其中slot_name为流复制槽名称select pg_drop_replication_slot('slot_name');获取复制槽列表的示例如下:openGauss=# select * from pg_get_replication_slots(); slot_name | plugin | slot_type | datoid | active | xmin | catalog_xmin | restart_lsn | dummy_standby | confirmed_flush-----------+----------------+-----------+--------+--------+------+--------------+-------------+---------------+----------------- dn_s1 | | physical | 0 | t | | | 0/23DB14E0 | f | slot1 | mppdb_decoding | logical | 16304 | f | | 60966 | 0/1AFA1BB0 | f | 0/23DA5700(2 rows)注:逻辑复制槽的占用会在增量迁移停止后创建,如果此时结束迁移任务,就会有槽位占用的残留。而如果正常进行反向迁移,然后停止迁移任务,则会自动删除占用的槽位。可以将portal的migrationConfig.properties配置文件中的drop.logical.slot.on.stop参数设置为true,以保证迁移任务结束时,自动删除占用的槽位。进一步学习,请参考openGauss社区,社区地址:https://opengauss.org/zh/。10、迁移过程中,请勿关闭源数据库或目标数据库;11、执行迁移任务的服务器应具备一定的性能和配置,以保证迁移过程的顺利执行;12、迁移任务是在非root用户下执行,任务的执行机器来源于平台资源中心的设备管理,因此需要在设备管理的用户管理中添加非root用户。
-
作者:DoDoQ说明:此文档仅包含使用DataKit进行数据迁移时,搭建迁移任务相关教程,不包含一些必须的前置配置步骤,和环境要求等,请优先学习“DataKit数据迁移-1使用说明”文档。数据迁移实例搭建步骤1 离线模式迁移步骤创建源端数据库用例,并初始化数据详细说明,参考“迁移各步骤详细说明”目录下:“1 创建源端数据库用例,并初始化数据”,下同。创建目标端数据库B库详细说明:“2 创建目标端数据库B库”使用B库连接openGauss数据库,并在目标端创建与mysql对象definer同名的用户,并赋权详细说明:“3 在目标端创建与MySQL对象definer同名的用户,并赋权”DataKit新增目标端和源端数据源详细说明:“4 DataKit新增目标端和源端数据源”创建迁移任务详细说明:“5 创建迁移任务步骤”启动迁移任务,查看任务详情详细说明:“6 启动迁移任务,查看任务详情”解决前置校验失败详细说明:“7 解决前置校验失败”重置迁移任务, 查看任务详情详细说明:“8 重置迁移任务, 查看任务详情”等待迁移任务完成,手动校验迁移结果详细说明:“9 校验全量迁移结果”2 在线模式迁移步骤创建源端数据库用例,并初始化数据同离线模式步骤创建目标端数据库B库同离线模式步骤使用B库连接openGauss数据库,并在目标端创建与mysql对象definer同名的用户,并赋权同离线模式步骤DataKit新增目标端和源端数据源同离线模式步骤创建迁移任务同离线模式步骤启动迁移任务,查看任务详情同离线模式步骤解决前置校验失败同离线模式步骤重置迁移任务, 查看任务详情同离线模式步骤校验全量迁移结果同离线模式“校验迁移结果”步骤修改源端数据库数据,校验增量迁移结果详细说明:“10 修改源端数据库数据,校验增量迁移结果”结束增量迁移,启动反向迁移详细说明:“11 结束增量迁移,启动反向迁移”修改目标端数据库数据,检验反向迁移结果详细说明:“12 修改目标端数据库数据,检验反向迁移结果”结束迁移任务详细说明:“13 结束在线模式迁移任务”迁移各步骤详细说明1 创建源端数据库用例,并初始化数据连接MySQL数据库,并执行如下sql语句,在源端创建source_db数据库,作为迁移的源端数据库用例。DROP DATABASE IF EXISTS source_db;CREATE DATABASE source_db;USE source_db;CREATE TABLE table1(id INT, name VARCHAR(10), col VARCHAR(20), PRIMARY KEY(id));INSERT INTO table1 VALUES(1,'data', 'data1');INSERT INTO table1 VALUES(2,'data', 'data2');INSERT INTO table1 VALUES(3,'data', 'data3');INSERT INTO table1 VALUES(4,'data', 'data4');INSERT INTO table1 VALUES(5,'data', 'data5');INSERT INTO table1 VALUES(6,'data', 'data6');CREATE VIEW view1 AS SELECT * FROM table1;CREATE FUNCTION mysql_func1(s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('mysql_func1, ',s,'!');CREATE TRIGGER trigger1 BEFORE INSERT ON table1 FOR EACH ROW SET new.col = CONCAT(new.name, new.id);CREATE PROCEDURE procedure1() SELECT * FROM table1;2 创建目标端数据库B库连接openGauss数据库,并执行如下sql语句,创建B库。create database target_db with dbcompatibility = 'b';3 在目标端创建与MySQL对象definer同名的用户,并赋权当源端数据库中有视图(view),触发器(trigger)或存储过程(procedure)的对象时,需要在目标端创建与其对象definer同名的用户。查询MySQL端对象definer-- 查询MySQL对象definer的sql语句show create view view1;查询结果类似如下:View Create View character_set_client collation_connectionview1 CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `view1` AS select `table1`.`id` AS `id`,`table1`.`name` AS `name`,`table1`.`col` AS `col` from `table1` utf8mb3 utf8mb3_general_ci其中:“'test'@'%'”即为MySQL对象definer使用B库连接openGauss数据库-- 通过gsql连接B库gsql -d target_db -p 5680 -r-- 或,在gsql已连接情况下切换至B库\c target_db在目标端创建与mysql对象definer同名的用户,并赋权-- 创建与mysql对象definer同名的用户,并赋权的sql语句-- 设置b_compatibility_user_host_auth参数值为onset b_compatibility_user_host_auth to on;-- 创建同名用户create user 'username'@'%' with password 'Sample@123';-- 给新增用户赋权grant all privileges to 'username'@'%';4 DataKit新增目标端和源端数据源请按照如下步骤,分别添加源端MySQL数据源和目标端openGauss数据源。访问DataKit服务,点击进入“资源中心->实例管理”目录下点击“创建”按钮,弹出“新增数据源”窗口进行新增数据源配置集群名称可忽略,也可自定义数据库类型选择“MYSQL”或“OPENGAUSS”准确配置数据库服务的ip地址,端口,用户名,密码信息连接拓展属性,及使用jdbc连接数据库服务时,做的一些时区,字符集限制等,可忽略连接地址,即通过上述配置的连接信息拼出的jdbc连接数据库的url配置完成后,点击“测试连通性”“待检测”显示为“可用”,说明可以成功建立连接“待检测”显示为“不可用”,说明存在网络问题,或配置信息有误,请校验后重试。“测试连通性”可用后,点击“确认”按钮,成功添加数据库实例5 创建迁移任务步骤Datakit成功加载data-migration插件点击进入DataKit服务“数据迁移 -> 迁移任务中心”目录下点击“创建数据迁移任务”按钮开始“选择迁移源库和目的库”步骤选择源端数据库(MySQL端),选择目的端数据库(openGauss端),并点击“添加子任务”按钮,支持添加多条子任务。成功添加子任务后,在页面下方选择对应子任务的“迁移过程模式”,支持选择“在线模式”和“离线模式”。“选择迁移源库和目的库”配置成功,点击下一步。注:如果无数据源,点击“新增数据源”,输入所需参数进行新增,或参考目录“4 DataKit新增目标端和源端数据源”。目的端选择目录“2 创建目标端数据库B库”已创建好的B库。迁移过程模式,支持在线模式和离线模式。离线模式:自动执行全量迁移 + 全量校验,完成后自动结束。在线模式:可执行全量迁移 + 全量校验 + 增量迁移 + 增量校验 + 反向迁移。其中portal自动执行全量迁移 + 全量校验 + 增量迁移 + 增量校验,然后一直处于增量迁移状态(此时增量迁移和增量校验同时运行)。用户需要手动停止增量迁移,然后手动启动反向迁移,此后一直处于反向迁移状态。如果需要结束任务,需要用户手动结束迁移。开始“配置迁移过程参数”步骤直接使用默认参数即可,点击“下一步”。开始“分配执行机资源”步骤页面会展示所有的执行机列表信息,页面左侧复选框,勾选一台已安装迁移套件(portal)的执行机,点击完成,创建迁移任务成功。注:执行机,是指安装有portal(portal时具体执行迁移任务的插件)的服务器。即,迁移任务实际上是在安装portal的服务器上,使用portal插件执行的,DataKit这里只是作为一个集中管理迁移任务的客户端。如果没有已安装迁移套件的执行机,详细见文档“DataKit数据迁移-1使用说明”中,目录:“DataKit安装Portal教程”。查看迁移任务点击进入目录“数据迁移 -> 迁移任务中心”下,可以看到已创建成功的迁移任务列表信息。修改迁移任务配置迁移任务列表中,字段“执行状态”为未启动的任务,点击对应数据行右侧“详请”,可以看到上述“创建迁移任务步骤”的过程配置信息,并支持修改配置。6 启动迁移任务,查看任务详情点击进入DataKit服务“数据迁移 -> 迁移任务中心”目录下找到上述创建的迁移任务记录,点击记录右侧的“启动”,迁移任务启动成功点击记录右侧的“详情”,进入迁移任务详情页点击对应子任务右侧的“详情”,可查看子任务迁移的详细过程数据“在线/离线迁移过程记录”中,会展示详细的迁移情况其中全量迁移会展示表,视图,函数,触发器和存储过程的迁移情况,迁移状态为绿色“√”图标时,说明迁移成功,为橙色“×”图标时,说明迁移失败。全量校验则只校验拥有主键的表,同样校验状态为绿色“√”图标时,说明迁移成功,为橙色“×”图标时,说明校验失败。当存在失败的情况时,点击对应子任务右侧的“日志”,可以选择下载所需日志,查看日志中的报错信息并解决。7 解决前置校验失败如果未出现“前置校验失败”的状态,则不需要解决,跳过此步骤即可。当出现前置校验失败时,鼠标悬浮于对应子任务“前置校验失败”提示的右侧橙色“×”图标上,即可查看校验失败的详细信息,根据详细信息中提示的校验失败项,参考文档“DataKit数据迁移-3前置校验失败的处理”,对失败项进行解决。8 重置迁移任务, 查看任务详情如果未出现“前置校验失败”的状态,则不需要此操作,跳过此步骤即可。当解决完成“前置校验失败”的项目后,在页面的标签页栏中关闭此任务的“任务详情”页面,点击回到“迁移任务中心”页面,找到对应迁移任务记录,点击对应页面右侧的“结束迁移”,然后点击“重置”,再点击“启动”,重新启动此迁移任务,再次点击“详情”,即可查看迁移任务详细的过程信息。9 校验全量迁移结果当离线模式迁移任务完成,或在线模式全量校验完成后,可以手动连接到迁移的目标端数据库,通过如下sql语句,手动查看并校验库中数据是否于源端数据库中数据相同。-- 使用B库连接openGauss数据库gsql -d target_db -p 5680 -r-- 或在已连接的情况下,切换到目标端B库\c target_db-- 设置默认的schemaSET CURRENT_SCHEMA TO source_db;-- 查看表格和视图SHOW TABLES;-- 查询触发器SHOW TRIGGERS;-- 查看函数SHOW FUNCTION STATUS WHERE Db = 'source_db';-- 查看存储过程SHOW PROCEDURE STATUS WHERE Db = 'source_db';-- 查询表中数据SELECT * FROM table1;注:此处设置默认的schema,是由于数据迁移会默认在目标端数据库中创建与源端数据库同名的的schema,并将源端数据库中的数据迁移到此schema中。10 修改源端数据库数据,校验增量迁移结果在源端依次执行增删改和创建表格等操作,可以查看对应迁移任务详情中,“累计增量迁移对象数”会随着操作逐次增加,当“剩余待写入数据”条数为0时,说明所有数据库操作均已增量迁移成功。也可以每次源端做出操作后,在目标端手动校验数据是否同步,以验证增量迁移情况。修改源端数据库数据-- 增删改操作-- 插入数据INSERT INTO table1 VALUES(7, 'data', 'data7');-- 修改数据UPDATE table1 SET NAME = 'new_data' WHERE id = 7;-- 删除数据DELETE FROM table1 WHERE id = 7;-- DDL操作-- 创建表CREATE TABLE table2 ( id INT, NAME VARCHAR(10));-- 删除表DROP TABLE table2;手动校验增量迁移结果-- 增删改操作校验-- 查询表中修改的数据是否同步select * from table1;-- DDL操作校验-- 查询目标端表格的增删情况SHOW TABLES;-- 查询目标端表结构,与新增表结构是否一致SHOW CREATE TABLE table2;11 结束增量迁移,启动反向迁移点击对应子任务右侧的“停止增量”,点击“确认”按钮,等待增量迁移停止。增量迁移成功停止后,对应子任务右侧的“启动反向”,点击查看详情,可以查看反向迁移详细过程。12 修改目标端数据库数据,检验反向迁移结果在目标端依次执行增删改操作,可以查看对应迁移任务详情中,“累计反向迁移对象数”会随着操作逐次增加,当“剩余待写入数据”条数为0时,说明所有数据库操作均已反向迁移成功。也可以每次目标端做出操作后,在源端手动校验数据是否同步,以验证反向迁移情况。修改目标端数据库数据-- 增删改操作-- 插入数据INSERT INTO table1 VALUES(7, 'data', 'data7');-- 修改数据UPDATE table1 SET NAME = 'new_data' WHERE id = 7;-- 删除数据DELETE FROM table1 WHERE id = 7;手动校验反向迁移结果-- 增删改操作校验-- 依次查询修改是否同步select * from table1;13 结束在线模式迁移任务在线模式迁移任务不同与离线模式,当不手动进行停止操作时,会始终处于反向迁移状态下。点击对应子任务右侧“结束迁移”,等待迁移任务停止,则此在线模式迁移任务完成。
-
作者:DoDoQDataKit简介DataKit是开源的openGuass数据库管理工具,支持用户对openGuass进行安装,运维,卸载等其他功能。DataKit的开源Gitee地址为https://gitee.com/opengauss/openGauss-workbench,其中对DataKit的介绍如下:openGauss DataKit是基于Web的openGauss的可视化的平台系统,目的是方便客户使用和管理openGauss可视化工具,可以为客户降低openGauss数据库安装使用门槛,做到安全中心管理,插件管理,以及其它功能包括一键化部署、卸载、组件化安装、多版本升级、日常运维和监控。本文的概述本文主要对DataKit工具的数据迁移功能的使用进行详细讲解,DataKit数据迁移可以完成迁移MySQL数据到openGauss数据库中的功能。本文是博主整理的DataKit数据迁移功能使用的详细教程,主要包含的内容有:环境准备,迁移前配置,执行迁移任务,DataKit安装portal教程,DataKit数据迁移常见问题。阅读本文需要结合博主的另外两篇文章,分别是“DataKit数据迁移-2实例搭建步骤”,“DataKit数据迁移-3前置校验失败的处理”。三篇文章从不同方面,对DataKit数据迁移功能进行了全方位的使用教程。使用DataKit数据迁移功能,只需按照文章目录顺序阅读阅读即可。若有错误,不详,疑问或建议等,欢迎留言交流。1 环境准备DataKit服务要求:成功加载data-migration插件DataKit安装教程,请参考码云仓库(https://gitee.com/opengauss/openGauss-workbench)openGauss企业版服务要求:可以被DataKit服务所在服务器访问openGauss企业版安装请参考官方社区(https://opengauss.org/zh/)教程,也可使用DataKit base-ops插件的“集群安装-安装部署”功能进行安装。MySQL服务要求:可以被DataKit服务所在服务器访问CentOS或openEuler系统服务器要求:可以被DataKit服务所在服务器访问;JDK 11+环境用途:用于安装迁移插件(portal)2 迁移前配置2.1 openGauss配置2.1.1 参数配置修改配置文件pg_hba.conf和postgresql.conf相关参数,以支持迁移过程。配置白名单,以支持通过openGauss用户进行远程连接,配置命令如下:-- 修改pg_hba.conf文件gs_guc set -D <datanode> -h "host all all 0.0.0.0/0 sha256"-- 修改postgresql.conf文件gs_guc set -D <datanode> -c "listen_addresses = '*'"-- 其中,“<datanode>”为数据库节点路径,请替换为实际值,如“/opt/huawei/install/data/dn”,此文档中后续此参数含义不变。配置日志参数及复制权限,以支持反向迁移,配置命令如下:-- 修改pg_hba.conf文件gs_guc set -D <datanode> -h "host replication all 0.0.0.0/0 sha256"-- 修改postgresql.conf文件gs_guc set -D <datanode> -c "wal_level = logical"配置完成后,重启数据库,重启命令如下:gs_ctl restart -D <datanode>2.1.2 创建管理员用户连接数据库gsql -d postgres -p <port> -r-- 其中,“<port>”请替换为实际端口,如“5432”,此文档中后续此参数含义不变。创建用户并赋予管理员权限create user opengauss_test with password 'Sample@123';grant all privileges to opengauss_test;-- 其中,“opengauss_test”为用户名,可自定义,后续此文档中涉及到连接openGauss的用户,便使用此用户。-- “Sample@123”为用户密码,可自定义。3 执行迁移任务请参考文档:“DataKit数据迁移-2实例搭建步骤”4 DataKit安装Portal教程4.1 DataKit安装Portal注意事项root用户下,依次安装如下依赖yum install -y mysql-develyum install -y mysql5-develyum install -y mariadb-develyum install -y python3-develyum install -y python-devel注:如果mysql5-devel与mariadb-devel冲突,保留一个即可。其他包如果未找到,则可忽略。请确保安装用户的~/.bashrc已经配置java环境变量,并且版本满足11+。安装6.0.0-RC1的portal包,并确认在线安装的安装包是否匹配对应主机架构。可能存在DataKit未成功获取目标执行机系统及架构信息的情况,导致在线安装给出的包是默认的centos-x86的安装包。遇到此情况,请自行前往portal仓库,下载匹配目标执行机系统及架构的安装包,然后使用datakit的portal离线安装,上传下载的安装包进行安装。# portal码云仓库地址https://gitee.com/opengauss/openGauss-migration-portal安装目录尽量不要再用户的home目录下,即~目录下,并确保安装用户对安装目录有操作权限。因此建议使用安装用户创建目录,供安装portal使用。请确保第三方工具的三个端口未被占用,如果默认端口已被占用,支持自定义端口。4.2 DataKit安装Portal步骤访问Datakit服务,点击进入“数据迁移->迁移任务中心”目录下点击“创建数据迁移任务”按钮开始“选择迁移源库和目的库”步骤,分别选择源端数据库(database),选择目的端数据库(database),并点击“添加子任务”按钮。如果无数据源,点击“新增数据源”,输入所需参数进行新增。添加子任务成功后,在页面下方选择对应子任务的“迁移过程模式”,支持在线模式和离线模式。离线模式:自动执行全量迁移,完成后自动结束,释放资源。 在线模式:自动执行全量迁移+增量迁移,用户手动启动反向迁移,需要用户操作结束迁移,释放资源。“选择迁移源库和目的库”配置成功,点击下一步。进入“配置迁移过程参数”步骤,可直接使用默认参数,直接点击“下一步”。进入“分配执行机资源”步骤,页面会展示所有的执行机列表信息,选择对应执行机点击“开始安装”,进入“迁移套件安装”步骤。此处如果无执行机信息显示,请前往“资源中心->服务器管理”添加服务器资源,注意添加服务器时需要勾选“记住密码”,添加服务器成功后,页面会显示添加成功的服务器记录。点击所需服务器记录右侧的“用户管理”,添加普通用户。至此,此服务器可作为安装portal的执行机。进行portal安装,“安装用户”选择上述添加的服务器的普通用户。“安装目录”选择使用“安装用户”创建的已有目录,不建议使用默认的“安装用户”的home目录。“第三方工具配置方式”选择“本机新安装”,选择后会出现“zookeeper 端口”,“kafka 端口”,“schema_registry 端口”三条配置项,请确保配置的三个端口未被占用,如默认端口被占用,支持自定义端口。“第三方工具安装目录”使用默认的即可,支持自定义,但同样请配置到使用“安装用户”创建的目录下。选择安装方式,“在线安装”是在线下载安装包,完成安装,需要确保对应的服务器网络正常。“离线安装”支持手动上传portal安装包进行安装,注意自行下载时请下载匹配对应服务器系统及架构的安装包。“导入安装”支持导入对应服务器上已安装的portal,但要求已安装的portal成功安装了所有的mysql迁移插件,否则导入安装无法成功。“安装包名称”建议选用最新版本的安装包。至此“迁移套件安装”步骤配置成功,点击“确认”按钮,开始portal安装。进行portal安装时,“分配执行机资源”页面的对应执行机的“是否安装迁移套件”字段会显示为“安装中”,安装成功则显示为“已安装”。如果安装失败,可下载“安装日志”,排除故障后,点击“清理环境”,然后再次安装即可。4.3 DataKit安装Portal可能出现的问题无论遇到任何问题,请先按照“DataKit安装Portal注意事项”进行排查后,再次尝试安装。4.3.1 kafka启动失败的问题问题描述:安装portal,所有迁移工具安装成功,但是启动kafka失败,报错类似如下:Socket server failed to bind to 10.126.28.177:9089: Cannot assign requested address问题原因:网络问题,使用外网ip连接服务器时,本机无法感知,导致kafka无法成功启动,修改ip为本机ip,如192.168.0.123后,停止残留的zookeeper kafka等进程,重新启动kafka,启动kafka成功。解决方式:修改了配置文件的listeners属性中的ip地址为本机ip地址,配置文件位置:/portalpath/portal/tools/debezium/confluent-5.5.1/etc/kafka/server.properties。修改成功后,执行如下命令重启kafka:-- 可以先执行停止kafka的命令,确保Kafka进程已停止,避免启动时出错,停止kafka的命令如下java -Dpath=/data/dgq/portal/portal/ -Dorder=stop_kafka -Dskip=true -jar /data/dgq/portal/portal/portalControl-6.0.0rc1-exec.jar-- 启动kafka进程的命令java -Dpath=/data/dgq/portal/portal/ -Dorder=start_kafka -Dskip=true -jar /data/dgq/portal/portal/portalControl-6.0.0rc1-exec.jar5 DataKit数据迁移常见问题5.1 在线模式,任务长时间卡顿在全量迁移过程中的问题问题描述:成功创建在线迁移任务后,点击启动,无前置校验失败,任务状态长时间卡顿在全量迁移进行中,页面无报错,后台full_migration.log无报错。查看portal中对应任务workspace.id的log日志,日志目录为/portal_install_path/portal/logs/portal_3.log,其中的portal_install_path请替换为实际的portal安装路径,3请替换为实际的子任务worksapce.id(可以在子任务详情页面的左上角查看)。日志中包含报错信息“begin 0, end -1, length 0”,详细信息类似如下:16:56:15,851 ERROR (ThreadExceptionHandler:uncaughtException) - thread main occur excetion: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 0 at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319) at java.base/java.lang.String.substring(String.java:1874) at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.changeGtidSet(IncrementalMigrationTool.java:165) at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.findOffset(IncrementalMigrationTool.java:139) at org.opengauss.portalcontroller.tools.mysql.IncrementalMigrationTool.init(IncrementalMigrationTool.java:302) at org.opengauss.portalcontroller.task.Plan.execPlan(Plan.java:448) at org.opengauss.portalcontroller.PortalControl.startPlan(PortalControl.java:384) at org.opengauss.portalcontroller.command.mysql.StartCommandReceiver.action(StartCommandReceiver.java:41) at org.opengauss.portalcontroller.command.ConcreteCommand.execute(ConcreteCommand.java:24) at org.opengauss.portalcontroller.PortalControl.main(PortalControl.java:181) ... 8 more16:56:16,599 INFO (ChangeStatusTools:reduceDiskSpace) - isReduced:false,Plan.stopPlan:false,PortalControl.status:216:56:18,654 INFO (ChangeStatusTools:reduceDiskSpace) - isReduced:false,Plan.stopPlan:false,PortalControl.status:2问题原因:直接原因:查询openGauss的t_gtid_set为空所致-- 首先连接目标端数据库-- 查询openGauss的t_gtid_set的sql如下select t_binlog_name,i_binlog_position,t_gtid_set from sch_chameleon.t_replica_batch;根本原因:查询MySQL的Executed_Gtid_Set为空所致-- 查询MySQL的Executed_Gtid_Set的sql,其中字段Executed_Gtid_Set对应的值就是Executed_Gtid_SetSHOW MASTER STATUS;问题解决:设置MySQL 端的gtid_mode参数值为on,设置的sql如下:-- 逐行执行如下sql语句,完成设置SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;SET GLOBAL gtid_mode=OFF;SET GLOBAL gtid_mode=OFF_PERMISSIVE;SET GLOBAL gtid_mode=ON_PERMISSIVE;SET GLOBAL gtid_mode=ON;设置完成后,通过如下sql查询是否设置成功:-- 查询gitid_mode状态的sql语句SHOW GLOBAL VARIABLES LIKE 'gtid_mode';设置成功后,任意执行一条插入语句,再次查询Executed_Gtid_Set,使得字段Executed_Gtid_Set对应的值变为类似如下格式bb95ff80-f621-11ee-a803-fa163e5bb329:1-3,冒号后为1-n的格式,迁移过程中会强校验此值的格式,格式变成上述格式则问题解决。结束历史迁移任务,重新创建迁移任务并启动,问题解决。5.2 全量迁移未开始,便提示迁移失败的问题问题描述:启动迁移任务,迁移状态至“全量迁移开始”,然后便提示迁移失败的情况。查看全量迁移日志,日志进行到创建schema步骤,且报错信息为“syntax error at or near “-””,详细日志类似如下。 2024-05-20 16:57:25.322 MainProcess DEBUG mysql_lib.py (826): Creating the loading schema demo-portal_tmp.Traceback (most recent call last): File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/bin/chameleon.py", line 76, in <module> getattr(replica, args.command)() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/global_lib.py", line 575, in init_replica self.__init_mysql_replica() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/global_lib.py", line 585, in __init_mysql_replica self.mysql_source.init_replica() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/mysql_lib.py", line 3013, in init_replica self.create_destination_schemas() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/mysql_lib.py", line 827, in create_destination_schemas self.pg_engine.create_database_schema(loading_schema) File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/pg_lib.py", line 5291, in create_database_schema self.pgsql_conn.execute(sql_create) File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/py_opengauss/driver/pq3.py", line 2318, in execute self._pq_complete() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/py_opengauss/driver/pq3.py", line 2623, in _pq_complete self.typio.raise_error(x.error_message, cause = getattr(x, 'exception', None)) File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/py_opengauss/driver/pq3.py", line 544, in raise_error self.raise_server_error(error_message, **kw) File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/py_opengauss/driver/pq3.py", line 535, in raise_server_error raise server_errorpy_opengauss.exceptions.SyntaxError: syntax error at or near "-" CODE: 42601 LOCATION: SERVER POSITION: 20CONNECTION: [idle] client_address: 192.168.0.66/22 client_port: 6666 version: (openGauss 5.0.2 build 48a25b11) compiled at 2024-05-14 10:26:01 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bitCONNECTOR: [IP4] pq://gaussdb:***@192.168.0.66:5432/test1?[sslmode]=disable category: NoneDRIVER: py_opengauss.driver.pq3.DriverProcess Process-2:Traceback (most recent call last): File "/usr/lib64/python3.9/multiprocessing/process.py", line 315, in _bootstrap self.run() File "/usr/lib64/python3.9/multiprocessing/process.py", line 108, in run self._target(*self._args, **self._kwargs) File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/global_lib.py", line 380, in dump_Json self.write_Json() File "/ops/portal/tools/chameleon/chameleon-6.0.0rc1/venv/lib64/python3.9/site-packages/pg_chameleon/lib/global_lib.py", line 356, in write_Json dump_object = self.mysql_source.getmanagerJson().copy() File "<string>", line 2, in copy File "/usr/lib64/python3.9/multiprocessing/managers.py", line 809, in _callmethod conn.send((self._id, methodname, args, kwds)) File "/usr/lib64/python3.9/multiprocessing/connection.py", line 210, in send self._send_bytes(_ForkingPickler.dumps(obj)) File "/usr/lib64/python3.9/multiprocessing/connection.py", line 415, in _send_bytes self._send(header + buf) File "/usr/lib64/python3.9/multiprocessing/connection.py", line 372, in _send n = write(self._handle, buf)BrokenPipeError: [Errno 32] Broken pipe2024-05-20 16:57:38.525 MainProcess DEBUG pg_lib.py (704): There is already a database connection active.2024-05-20 16:57:38.529 MainProcess INFO global_lib.py (517): Dropping the replica schema2024-05-20 16:57:38.529 MainProcess DEBUG pg_lib.py (2831): Trying to connect to the destination database.2024-05-20 16:57:38.684 MainProcess INFO chameleon.py (91): drop_replica_schema finished.问题原因:问题是由于源端MySQL数据库名中包含“-”连字符导致,迁移过程中,迁移插件会根据源端MySQL数据库名,在目标端openGauss数据库中,创建于MySQL数据库名同名的schema,但是openGauss的schema命名不支持使用“-”连字符,因此会报错。问题解决:修改源端数据的命名,重新创建迁移任务并启动。或选择远端数据库命名无“-”连字符的数据库。5.3 全量校验失败的问题问题描述:成功创建迁移任务,并成功执行全量迁移,迁移校验失败,报错提示类似如下:failed (insert=0 update=6 delete=0)If you want to repair data.please read the following files:/data/dgq/portal/portal/workspace/25/check_result/result/repair_source_db_table1_0_0.txtrepair_source_db_table1_0_0.txt中内容如下:update `source_db`.`table1` set name='data' , col='data1' where id=1 ;update `source_db`.`table1` set name='data' , col='data2' where id=2 ;update `source_db`.`table1` set name='data' , col='data3' where id=3 ;update `source_db`.`table1` set name='data' , col='data4' where id=4 ;update `source_db`.`table1` set name='data' , col='data5' where id=5 ;update `source_db`.`table1` set name='data' , col='data6' where id=6 ;然而手动校验迁移后table1表中的数据,数据正确。问题原因:MySQL创建表table1时,字段NAME的字段名使用的是大写,建表语句如下:CREATE TABLE table1 ( id INT, NAME VARCHAR(10), col VARCHAR(20), PRIMARY KEY(id));由于,迁移到openGauss端后,迁移过程创建的table1表格的建表语句如下:CREATE TABLE table1 ( id integer NOT NULL, "NAME" character varying(10), col character varying(20))WITH (orientation=row, compression=no);ALTER TABLE table1 ADD CONSTRAINT pk_table1_1712058063_0 PRIMARY KEY USING btree (id);可见大写的NAME被双引号括起来,因此导致全量校验的时候,由于双引号的问题,导致检验时无法匹配两边的name字段名,导致校验无法通过。问题解决:MySQL端创建表格时,字段名使用小写,问题解决。5.4 全量检验未校验,便进行下一步骤增量迁移的问题问题原因: 内存不够问题解决: 释放服务器内存后,再次尝试5.5 增量迁移删除拥有主键的表失败的问题问题原因:对于drop table操作,当表含有关联对象是,例如视图,MySQL端可以用drop table只删除表而保留视图,openGauss端用drop table仅删除表会失败,此问题属于内核兼容性问题。因此对于MySQL端的drop table语句,openGauss端将采用drop table cascade一并删除表及其关联的对象。因此增量迁移源端删除有关联对象的表,目标端无法删除,导致此问题的出现。问题解决:删除表格关联对象后,再删除此表。5.6 增量迁移创建view失败的问题问题原因:由于增量迁移解析出的创建view的语句语法类似如下:CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `view1` AS SELECT * FROM table1;由于语句中包含@符号,而openGauss端执行此创建view的语句,会在@符号处报出语法错误。因此导致失败。问题解决:通过如下命令设置openGauss的b_compatibility_user_host_auth参数值为on使其支持此语法,问题便得到解决。set b_compatibility_user_host_auth to on;b_compatibility_user_host_auth参数说明:参数说明:控制是否允许创建user@host、‘user’@'host’之类的用户并兼容mysql的user@host认证鉴权,对兼容mysql的user@host进行认证时,需要在配置文件postgresql.conf中设为on。取值范围:布尔型默认值:off示例:openGauss=# show b_compatibility_user_host_auth; b_compatibility_user_host_auth-------------------------------- off(1 row)5.7 反向迁移成功启动,数据反向迁移未成功的问题问题描述:创建迁移任务,无前置校验问题,成功进行全量迁移,增量迁移,数据同步后,停止增量迁移,反向迁移成功启动,在openGauss端添加数据记录,反向迁移条数仍为0,且MySQL端未成功同步数据。问题原因:openGuass数据库未开启用户复制权限的支持,即使用户的权限管理中具有复制的权限,但是数据库也需要通过修改配置文件pg_hba.conf,在文件末尾配置host replication {用户名} 0.0.0.0/0 sha256,如此用户才能进行复制相关操作。其中,用户名也可以换成all,以支持所有用户的复制权限。个人理解: 用户虽然具有复制权限,但是数据库服务不支持用户使用复制权限进行复制相关操作,因此需要开启数据库对复制权限的管理。就比如我有从仓库拿东西的权限,所以我可以往外拿东西,但是后来仓库管理员说所有东西都不可以往外拿东西,那么即使我有往外拿东西的权限,他也不让我往外拿东西。配置的目的便是,领导告诉仓库管理员,现在可以让我往外拿东西,那么我再往外拿东西的时候,便能拿出来了。相当于用户有用户的权限管理,然后仓库管理员有仓库管理员的权限管理,两层权限都有,我才能往外拿东西。问题解决:修改配置文件pg_hba.conf,在文件末尾配置host replication {用户名} 0.0.0.0/0 sha256。或通过如下命令配置,命令如下:gs_guc set -D /opt/datakit/opengauss/datanode/dn1 -h "host replication {用户名} 0.0.0.0/0 sha256"配置完成后重启数据库,使配置生效,重启数据库的命令如下:gs_ctl restart -D /opt/datakit/opengauss/datanode/dn1
-
作者:宥谦openGauss 6.0.0-RC1是openGauss 2024年3月发布的创新版本,闲来无事翻阅文档,被一条新增特性内吸引了目光:内核工具:支持一站式交互安装用户通过交互界面输入数据库的相关信息,系统自动生成xml配置文件,并自动进行数据库的初始化安装。我是从去年开始接触国产数据库openGauss,之前一直使用的是成熟的Mysql,Oracle等数据库,对比之下,openGauss的安装方式要比他们麻烦不少,在折腾5.0的时候,预安装(初始化安装)这一步也阻塞了不少时间,看到这个特性,那必须要体验一番。环境准备先附上官方文档:一站式安装指南;可以看到默认的选项是一主两备集群;因此,先准备三台虚拟机用于测试;IP信息如下:10.125.10.1410.125.10.6710.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用户组,在测试过程中出现了错误关闭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到这一步根据提示,全部选择默认,跟随提示交互输入即可;初始化安装成功如下图:执行数据库安装初始化安装完成后,安装就简单了,切换到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安装成功截图如下:使用gs_om -t status --detail查询数据库状态可以看到数据库正常:注意实践过程中,饶是我已经有了很多安装5.0.0的经验,但还是耗费了一整体时间才安装成功,因此,感觉还是有几点需要注意,写在这里备忘。请选择是否部署资源池化和请选择是否部署CM的选项,1和2不是相同含义,如果不选择默认,一定要注意;除官方提醒的三个依赖外,还需要安装expect依赖,且三个节点都需要安装;所有的初始化安装和安装命令均需要解压OM安装包后进入script包执行;openGauss依赖SSE4_2指令集,使用不同厂商云平台创建虚机安装的时候一定要注意如何设置,使虚拟机支持此指令集;pssh提前拷贝(这是不是BUG)
上滑加载中
推荐直播
-
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
回顾中
热门标签