YashanDB Feature Test

1. 闪回功能测试

1.1 闪回查询

-- 创建测试表
CREATE TABLE tab_flash_01 (id INT);
INSERT INTO tab_flash_01 VALUES (111);
COMMIT;
SELECT * FROM tab_flash_01;

-- 执行闪回查询
SET SERVEROUTPUT ON;
DECLARE
t1 TIMESTAMP;
t2 TIMESTAMP;
vstr VARCHAR(2000);
res1 INT;
BEGIN
-- 获取当前时间点T1
SELECT CURRENT_TIMESTAMP INTO t1 FROM DUAL;
-- 插入新数据,提交
INSERT INTO tab_flash_01 VALUES (222);
COMMIT;
-- 获取当前时间点T2
SELECT CURRENT_TIMESTAMP INTO t2 FROM DUAL;
-- 闪回查询T1时间点,无第二次插入的数据
vstr := 'SELECT id FROM tab_flash_01 AS OF TIMESTAMP TIMESTAMP(' || '''' || t1 || '''' || ')';
EXECUTE IMMEDIATE vstr INTO res1;
DBMS_OUTPUT.PUT_LINE('获取时间点T1数据');
DBMS_OUTPUT.PUT_LINE('res1=' || res1);

END;
/

-- 清理环境
DROP TABLE tab_flash_01;

1.2 表闪回

-- 创建测试表
CREATE TABLE tab_flash_02 (id INT, name VARCHAR(20));
INSERT INTO tab_flash_02 VALUES (1, 'ZhangSan');
INSERT INTO tab_flash_02 VALUES (2, 'XiaoMing');
INSERT INTO tab_flash_02 VALUES (3, 'Tom');
COMMIT;

-- 开启row movement
ALTER TABLE tab_flash_02 ENABLE ROW MOVEMENT;

-- 执行表闪回操作
SET SERVEROUTPUT ON;
DECLARE
v1 TIMESTAMP;
vrowscn BIGINT;
vstr VARCHAR(2000);
BEGIN
-- 获取当前时间T1
SELECT SYSTIMESTAMP INTO v1 FROM DUAL;
-- 删除一条数据并提交
DELETE FROM tab_flash_02 WHERE id = 1;
COMMIT;
-- 闪回到删除前的时间点T1
vstr := 'FLASHBACK TABLE tab_flash_02 TO TIMESTAMP TIMESTAMP(' || '''' || v1 || '''' || ')';
EXECUTE IMMEDIATE vstr;
-- 查询数据
FOR res IN (SELECT * FROM tab_flash_02 WHERE id = 1) LOOP
DBMS_OUTPUT.PUT_LINE('获取T1时间点的数据');
DBMS_OUTPUT.PUT_LINE(res.id || ',' || res.name);
END LOOP;
-- 查询id=1的rowscn SCN1
SELECT ROWSCN INTO vrowscn FROM tab_flash_02 WHERE id = 1;
-- 删除id=2数据
DELETE FROM tab_flash_02 WHERE id = 2;
COMMIT;
-- 闪回到SCN1
vstr := 'FLASHBACK TABLE tab_flash_02 TO SCN ' || vrowscn;
EXECUTE IMMEDIATE vstr;
-- 查询数据
FOR res IN (SELECT * FROM tab_flash_02 WHERE id = 2) LOOP
DBMS_OUTPUT.PUT_LINE('获取SCN1点的数据');
DBMS_OUTPUT.PUT_LINE(res.id || ',' || res.name);
END LOOP;
END;
/

-- 清理环境
DROP TABLE tab_flash_02;

1.3 DROP 闪回

前置条件:回收站功能开启(默认开启)

测试过程

-- 创建测试表
CREATE TABLE tab_flash_03 (id INT, name VARCHAR(20));
INSERT INTO tab_flash_03 VALUES (1, 'ZhangSan');
INSERT INTO tab_flash_03 VALUES (2, 'XiaoMing');
INSERT INTO tab_flash_03 VALUES (3, 'Tom');
COMMIT;

-- DROP测试表
DROP TABLE tab_flash_03;
SELECT * FROM tab_flash_03;

-- 从回收站恢复表,并查询表内容
FLASHBACK TABLE tab_flash_03 TO BEFORE DROP;
SELECT * FROM tab_flash_03;

-- 清理环境
DROP TABLE tab_flash_03;

1.4 TRUNCATE 闪回

前置条件:回收站功能开启

测试过程

-- 创建测试表
CREATE TABLE tab_flash_04 (id INT, name VARCHAR(20));
INSERT INTO tab_flash_04 VALUES (1, 'ZhangSan');
INSERT INTO tab_flash_04 VALUES (2, 'XiaoMing');
INSERT INTO tab_flash_04 VALUES (3, 'Tom');
COMMIT;

-- TRUNCATE测试表
TRUNCATE TABLE tab_flash_04;
SELECT * FROM tab_flash_04;

-- 从回收站恢复表,并查询表内容
FLASHBACK TABLE tab_flash_04 TO BEFORE TRUNCATE;
SELECT * FROM tab_flash_04;

-- 清理环境
DROP TABLE tab_flash_04;

1.5 全库闪回

前置条件:已开启全库闪回功能

测试过程

-- 开启全库闪回
ALTER DATABASE FLASHBACK ON;
--创建测试表
CREATE TABLE tab_flash_05 (A INT);
--插入数据
INSERT INTO tab_flash_05 VALUES (1);
--提交数据
COMMIT;

-- 创建永久还原点
CREATE RESTORE POINT p20260101 GUARANTEE FLASHBACK DATABASE;

-- 模拟误操作
DROP TABLE tab_flash_05;

-- 闪回到还原点
yasboot cluster restart -c yashandb -m mount
FLASHBACK DATABASE TO RESTORE POINT p20260101;
ALTER DATABASE OPEN RESETLOGS;

-- 验证恢复
SELECT * FROM tab_flash_05;

-- 清理环境
DROP TABLE tab_flash_05;

2. 备份恢复功能测试

2.1 SQL 命令全量备份

前置条件:数据库已开启归档模式

2.1.1 备份

  1. 全量备份
-- 不指定路径,在yasdb_data的backup目录下自动生成备份文件目录
BACKUP DATABASE FULL;
-- 指定路径
BACKUP DATABASE FULL FORMAT '/home/yashan/backup/full_01';
-- 查看备份视图
SELECT * FROM DBA_BACKUP_SET;
  1. 并行备份
BACKUP DATABASE FULL FORMAT '/home/yashan/backup/full_p8' PARALLELISM 8;
  1. 备份加密
BACKUP DATABASE ENCRYPTION AES256 IDENTIFIED BY test2025 FORMAT '/home/yashan/backup/full_pwd';
  1. 备份压缩
BACKUP DATABASE COMPRESSION ALGORITHM ZSTD HIGH;
BACKUP DATABASE COMPRESSION ALGORITHM LZ4 LOW;
  1. 增量备份
-- LEVEL 0 增量备份
BACKUP DATABASE INCREMENTAL LEVEL 0 FORMAT '/home/yashan/backup/incr_01';

-- LEVEL 1 增量备份
BACKUP DATABASE INCREMENTAL LEVEL 1 FORMAT '/home/yashan/backup/incr_02';

-- 基于TAG的增量备份
BACKUP DATABASE INCREMENTAL LEVEL 0 FORMAT '/home/yashan/backup/incr_03' TAG 'full001' INDEPEND;

2.1.2 恢复

  1. 全量恢复
-- 步骤 1:创建测试表并插入数据
-- 以 sysdba 身份登录
yasql / as sysdba
DROP TABLE IF EXISTS t_backup;
-- 创建测试表
create table t_backup (a int, b char);
-- 插入测试数据
insert into t_backup values(1,'a'),(2,'b');
commit;

-- 步骤 2:执行全量备份
backup database full format '/home/yashan/backup/full_02';

--步骤 3:查看备份集
-- 查看备份集信息
select * from dba_backup_set;
-- 查看生成的物理文件(在操作系统层面检查备份目录)
ls /home/yashan/backup/

-- 步骤 4:模拟故障(删除数据文件)
cd $YASDB_DATA/dbfiles
rm -rf *

-- 步骤 5:重启到 NOMOUNT 状态
yasboot cluster restart -c yashandb -m nomount -u sys -p yasdb_123

-- 步骤 6:执行全量恢复
-- 登录数据库
yasql sys/yasdb_123
-- 从指定备份文件恢复
restore database from '/home/yashan/backup/full_02';
-- 打开数据库
alter database open;
-- 验证数据恢复
select * from t_backup;
  1. 基于 TAG 增量备份的连续恢复
-- 步骤 1:执行增量备份
-- LEVEL 0 增量备份
backup database incremental level 0 format '/home/yashan/backup/incr_04';

-- 插入新数据
insert into t_backup values(3,'c'),(4,'d');
commit;

-- LEVEL 1 增量备份
backup database incremental level 1 format '/home/yashan/backup/incr_05';

-- 步骤 2:模拟故障(删除数据文件)
cd $YASDB_DATA/dbfiles
rm -rf *

-- 步骤 3:重启到 NOMOUNT 状态
yasboot cluster restart -c yashandb -m nomount -u sys -p yasdb_123

-- 步骤 4:执行连续恢复
-- 登录数据库
yasql sys/yasdb_123
-- 恢复 LEVEL 0 备份
restore database incremental from '/home/yashan/backup/incr_04';
-- 恢复 LEVEL 1 增量备份
restore database incremental from '/home/yashan/backup/incr_05';
-- 挂载数据库
ALTER DATABASE MOUNT;
-- 应用重做日志进行恢复
RECOVER DATABASE;
-- 打开数据库
ALTER DATABASE OPEN;
-- 验证数据
select * from t_backup;
  1. 指定时间点恢复(PITR)
-- 步骤 1:准备测试数据并备份
-- 重建测试表并插入数据
DROP TABLE IF EXISTS t_backup;
CREATE TABLE t_backup (
a INT,
b CHAR
);

INSERT INTO t_backup VALUES
(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd');
COMMIT;
-- 执行全量备份
BACKUP DATABASE FULL FORMAT '/home/yashan/backup/pitr_01';

-- 插入更多数据并记录 SCN
INSERT INTO t_backup VALUES
(5, 'e'),
(6, 'f');
COMMIT;

SELECT CURRENT_SCN FROM V$DATABASE;

-- 步骤 2:备份归档日志
-- 查看备份集和归档日志信息
ALTER SYSTEM ARCHIVE LOG CURRENT;

-- 记录备份的最新序列号为 14
SELECT RCY_END_ASN FROM dba_backup_set;

-- 备份从序列号 14 开始的归档日志
BACKUP ARCHIVELOG FROM SEQUENCE 10 FORMAT '/home/yashan/backup/arch_01';

-- 注意:步骤 3 是 shell 命令,不在 SQL 文件中执行
-- # 步骤 3:模拟故障(删除数据文件和归档日志)
-- cd $YASDB_DATA/archive
-- rm -rf *
-- cd $YASDB_DATA/dbfiles
-- rm -rf *
--
-- # 步骤 4:重启到 NOMOUNT 状态
-- yasboot cluster restart -c yashandb -m nomount -u sys -p yasdb_123

-- 步骤 5:执行时间点恢复
-- 注意:以下恢复操作需要在数据库重启到 NOMOUNT 状态后执行
-- 恢复全量备份
RESTORE DATABASE FROM '/home/yashan/backup/pitr_01';

-- 恢复归档日志
RESTORE ARCHIVELOG ALL FROM BACKUPSET '/home/yashan/backup/arch_01';

-- 恢复到指定时间点(使用之前记录的 SCN)
-- 注意:请将 785336872845299712 替换为实际记录的 SCN
RECOVER DATABASE UNTIL SCN 785336872845299712;

-- 以 resetlogs 方式打开数据库
ALTER DATABASE OPEN RESETLOGS;
-- 验证数据
select * from t_backup;

2.2 工具备份与恢复

--创建测试表
DROP TABLE IF EXISTS t_backup;
CREATE TABLE t_backup (
a INT,
b CHAR
);

INSERT INTO t_backup VALUES
(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd');
COMMIT;
# 创建catalog文件
mkdir /home/yashan/catalog
yasrman sys/yasdb_123 -c "create catalog" -D /home/yashan/catalog

# 执行全量备份
yasrman sys/yasdb_123 -c "backup database tag 'full_backup' FULL FORMAT 'full_rm1' PARALLELISM 3 DEST SERVER" -D /home/yashan/catalog

# 执行level 0增量备份
yasrman sys/yasdb_123 -c "backup database incremental level 0 tag 'incr_0' format 'incr_bak_1'" -D /home/yashan/catalog

# 查看备份集
yasrman sys/yasdb_123 -c "list backup" -D /home/yashan/catalog

# 恢复备份集
# 停止数据库服务,人为破坏数据库文件(删除dbfiles/下面的文件),nomount方式启动数据库,从备份集恢复
cd $YASDB_DATA/dbfiles
rm -rf *
yasboot cluster clean -c yashandb --restore --with-arch
yasrman sys/yasdb_123 -c "restore database from tag 'full_backup'" -D /home/yashan/catalog
-- 验证数据
yasql / as sysdba
select * from t_backup;
-- 清理环境
DROP TABLE IF EXISTS t_backup;

2.3 exp/imp 工具

# 1. 完整数据库导出
exp sys/yasdb_123 file=exp.full full=y

# 2. 创建测试用户并准备数据
yasql sys/yasdb_123
create user u_testexp identified by 123;
grant dba to u_testexp;
conn u_testexp/123
create table t_test1(a int, b varchar(20));
insert into t_test1 values(1,'a'),(2,'b');
commit;
exit;


# 3. 用户级导出(按用户导出)与按表导出
exp u_testexp/123 file=exp.u_testexp owner=u_testexp
exp u_testexp/123 file=exp.t_test1 tables=t_test1

# 4. CSV 格式导出(使用 cat 生成配置文件并导出)
cat > expconfig.ini <<EOF
owner = u_testexp
format = csv
user = u_testexp
password = 123
server-host = 192.168.33.136:1688
tables = t_test1
logfile = /home/yashan/exp/
file = /home/yashan/exp/
loglevel = info
fields-enclosed-by = "
fields-terminated-by = ,
EOF

exp --csv --config-file expconfig.ini

# 5. 创建导入用户
yasql sys/yasdb_123
create user u_testimp identified by 123;
grant dba to u_testimp;
exit;


# 6. 数据导入(用户级导入与按表导入)
imp u_testimp/123 file=exp.u_testexp fromuser=u_testexp touser=u_testimp

yasql u_testimp/123
drop table t_test1;
imp u_testimp/123 file=exp.u_testexp fromuser=u_testexp touser=u_testimp tables=t_test1

# 7. 导入验证
yasql u_testimp/123
select * from t_test1;
exit;


4. 安全性测试

4.1 密码策略

测试过程

# 1. 系统用户密码设置
# 使用yasboot工具设置集群密码
yasboot cluster password set -n yasdb_123 -c yashandb

# 2. 普通用户创建和密码设置
-- 创建普通用户并设置初始密码
create user u_1 identified by 123;

-- 修改用户密码
alter user u_1 identified by Abc123;

# 3. 密码复杂度检查设置
-- 查看当前密码复杂度检查参数
select * from x$parameter where name='_CHECK_PASSWORD_COMPLEXITY';

-- 开启密码复杂度检查(强密码策略)
alter system set _check_password_complexity = true;

# 4. 密码复杂度测试
-- 在开启密码复杂度检查后测试各种密码
-- 以下密码会因为不符合复杂度要求而创建失败:
create user u_2 identified by 123; -- 密码太简单
create user u_2 identified by Abc123; -- 可能长度不足或复杂度不够
create user u_2 identified by 12345678; -- 只有数字,无字母
create user u_2 identified by Abcd1234; -- 可能缺少特殊字符
create user u_2 identified by Abcd_123; -- 符合要求的强密码
grant dba to u_2;
# 5. 密码策略配置
-- 创建密码策略profile
create profile prof_1 limit
failed_login_attempts 2 --尝试几次账户锁定
password_life_time 180 --密码可使用天数
password_reuse_time unlimited --密码不可复用天数
password_reuse_max unlimited --密码被复用需要变更次数
password_lock_time 1 --超过错误次数锁定天数
password_grace_time 0; --密码过期后可宽限天数

-- 将密码策略应用到用户
ALTER USER u_2 PROFILE prof_1;

-- 设置策略后,错误密码登录2次后锁定,无法登录
conn u_2/123
conn u_2/456

# 6. 操作系统免密登录
yasql / as sysdba

# 7. 清理用户
-- 删除用户(cascade级联删除用户的所有对象)
drop user u_1 cascade;
drop user u_2 cascade;

# 8. 关闭密码复杂度检查
-- 关闭密码复杂度检查
alter system set _check_password_complexity = false;

4.3 审计日志

测试过程

-- 1.启用安全审计,设置审计策略
-- 开启审计
ALTER SYSTEM SET unified_auditing = TRUE;

-- 创建审计策略
CREATE AUDIT POLICY AUD_1_4_5_2 ACTIONS CREATE TABLE, INSERT, DELETE, UPDATE, SELECT;

-- 启用审计策略
AUDIT POLICY AUD_1_4_5_2;

-- 2.执行建表、插入、删除、查询报错等操作
CREATE TABLE tab_1_4_5_2 (id INT, name VARCHAR(32));
INSERT INTO tab_1_4_5_2 VALUES (1, 'Tom');
INSERT INTO tab_1_4_5_2 VALUES (2, 'Bob');
DELETE FROM tab_1_4_5_2 WHERE id = 2;
SELECT * FROM tab_1_4_5_2 WHERE id = 'a';

-- 3.查看审计日志
SELECT action, unified_audit_policies, RETURN_CODE, sql_text
FROM unified_audit_trail
WHERE SQL_TEXT LIKE '%tab_1_4_5_2%';

-- 4.清理环境
ALTER SYSTEM SET unified_auditing = FALSE;
DROP TABLE tab_1_4_5_2;
NOAUDIT POLICY AUD_1_4_5_2;
DROP AUDIT POLICY AUD_1_4_5_2;

4.3 三权分立

测试过程

-- 1. 创建3个用户并分别授权,创建测试表
CREATE USER user1 IDENTIFIED BY user1;
CREATE USER user2 IDENTIFIED BY user2;
CREATE USER user3 IDENTIFIED BY user3;

GRANT CREATE SESSION TO user1;
GRANT CREATE SESSION TO user2;
GRANT CREATE SESSION TO user3;

GRANT DBA TO user1;
GRANT security_admin TO user2;
GRANT audit_admin TO user3;

CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1);
SELECT * FROM t1;

-- 2. 打开三权分立开关后重启库
ALTER SYSTEM SET enable_separate_duty = TRUE SCOPE = spfile;
yasboot cluster restart -c yashandb;

-- 3. 验证数据库管理员具备的操作权限(ddl/dml/dcl)
CONN user1/user1;
-- TABLE操作
DROP TABLE IF EXISTS test_sr6248_03;
CREATE TABLE test_sr6248_03 (c1 INT);
INSERT INTO test_sr6248_03 VALUES (1),(2);
CREATE USER user5 IDENTIFIED BY user5;
CREATE ROLE role1;
COMMIT;

-- 4. 验证安全管理员具备的权限(授权)
CONN user2/user2;
GRANT SELECT ON sys.t1 TO user5;
REVOKE SELECT ON sys.t1 FROM user5;
GRANT role1 TO user5;
REVOKE role1 FROM user5;


-- 5. 验证审计管理员具备的权限(配置审计)
CONN user1/user1;
ALTER SYSTEM SET "unified_auditing" = TRUE;
DROP TABLE IF EXISTS test_sr6248_04;
CREATE TABLE test_sr6248_04 (c1 INT);

CONN user3/user3;
CREATE AUDIT POLICY audit_sr6248_04 ACTIONS ALL ON user1.test_sr6248_04;
ALTER AUDIT POLICY audit_sr6248_04 DROP ACTIONS DELETE ON user1.test_sr6248_04;
AUDIT POLICY audit_sr6248_04;

CONN user1/user1;
insert into test_sr6248_04 values(1),(2);
select * from test_sr6248_04;

CONN user3/user3;
select * from UNIFIED_AUDIT_TRAIL where CURRENT_USER='USER1';


-- 6.清理环境
CONN user1/user1;
ALTER SYSTEM SET enable_separate_duty = FALSE SCOPE = spfile;
yasboot cluster restart -c yashandb;
yasql / as sysdba
drop user user1 cascade;
drop user user2;
drop user user3;

4.4 IP 黑白名单

测试过程:

# 1.配置黑名单a
$ vi $YASDB_DATA/config/yasdb_net.ini
tcp.validnode_checking=yes
tcp.excluded_nodes=192.168.33.145
# 2.配置白名单b
vi $YASDB_DATA/config/yasdb_net.ini
tcp.invited_nodes=192.168.33.146
# 3.重启实例
yasboot cluster restart -c yashandb
在主机a和主机b上登录数据库服务

5. 一主一备高可用故障演练测试

5.0 准备

5.0.1 配置开机自启动

  1. 配置启停脚本
sudo sh -c "cat  > /usr/local/bin/yashan_monit.sh" <<'EOF'
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <PORT> or $0 bashrc"
echo "Example: $0 1788"
echo "Example: $0 bashrc"
exit 1
fi

MONIT_AUTOSTART="true"
YCSROOTAGENT_AUTOSTART="false"
YASDB_USER=yashan
INTERVAL=3
PORT=$1

ENV_FILE="/home/${YASDB_USER}/.${PORT}"
if [ -f "$ENV_FILE" ]; then
source "$ENV_FILE"
fi

if [ -z "$YASDB_HOME" ]; then
echo "$(date) Error: YASDB_HOME is not set. Please check $ENV_FILE"
exit 1
fi

export LD_LIBRARY_PATH=$YASDB_HOME/lib

MONITRC_FILE="$YASDB_HOME/om/monit/monitrc"
if [ -f "$MONITRC_FILE" ]; then
CURRENT_OWNER=$(stat -c '%U' "$MONITRC_FILE" 2>/dev/null || stat -f '%Su' "$MONITRC_FILE" 2>/dev/null)
if [ "$CURRENT_OWNER" != "$YASDB_USER" ]; then
echo "$(date) Fixing monitrc owner: $CURRENT_OWNER -> $YASDB_USER"
chown $YASDB_USER "$MONITRC_FILE"
fi

CURRENT_PERM=$(stat -c '%a' "$MONITRC_FILE" 2>/dev/null)
if [ -z "$CURRENT_PERM" ]; then
PERM_STR=$(ls -ld "$MONITRC_FILE" 2>/dev/null | awk '{print $1}')
if [ -z "$PERM_STR" ]; then
CURRENT_PERM="000"
else
CURRENT_PERM="000"
fi
fi
if [ "$CURRENT_PERM" != "700" ]; then
echo "$(date) Fixing monitrc permissions: $CURRENT_PERM -> 700"
chmod 0700 "$MONITRC_FILE"
fi
else
echo "$(date) Warning: $MONITRC_FILE not found"
exit 1
fi

while true; do
if [ "$MONIT_AUTOSTART" = "true" ]; then
if ! pgrep -a monit | grep "$YASDB_HOME" > /dev/null; then
echo "$(date) monit abnormal, try restart..."
su - $YASDB_USER -c "source /home/${YASDB_USER}/.${PORT} && $YASDB_HOME/om/bin/monit -c $YASDB_HOME/om/monit/monitrc" &
fi
fi
if [ "$YCSROOTAGENT_AUTOSTART" = "true" ]; then
if [ -n "$YASCS_HOME" ]; then
if ! pgrep -a ycsrootagent | grep "$YASCS_HOME" > /dev/null; then
echo "$(date) ycsrootagent abnormal, try restart..."
su - $YASDB_USER -c "source /home/${YASDB_USER}/.${PORT} && sudo env LD_LIBRARY_PATH=$YASDB_HOME/lib $YASDB_HOME/bin/ycsrootagent start -H $YASCS_HOME" &
fi
fi
fi
sleep "$INTERVAL"
done
EOF

sudo chmod +x /usr/local/bin/yashan_monit.sh
  1. 配置启停服务
sudo sh -c "cat > /etc/systemd/system/yashan_monit.service" << 'EOF'

[Unit]
Description=Yashan Monitor
After=network.target

[Service]
ExecStart=/usr/local/bin/yashan_monit.sh bashrc
Type=simple
Restart=always
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF
  1. 启用服务
sudo systemctl daemon-reload
sudo systemctl enable yashan_monit
sudo systemctl start yashan_monit
  1. 查看服务的状态
sudo systemctl status yashan_monit

5.1 主节点实例 kill 故障

测试专项 高可用测试 kill 故障
用例描述 Kill 主节点实例
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时在主节点执行注入故障:kill -9 yasdb 进程 (记录故障注入时间)。date;kill -9 pid
【步骤 3】tpcc 结束查看主备切换完成时间:yasboot election event show -c yashandb
【步骤 4】计算 RTO 时间 = 切换完成时间 - 故障注入时间
预期结果 RTO < 30 秒。
实际结果 [待补充实际结果]

5.2 备节点实例 kill 故障

测试专项 高可用测试 kill 故障
用例描述 Kill 备节点实例
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时在备节点执行注入故障:kill -9 yasdb 进程。date;kill -9 pid
预期结果 1、主节点正常,业务不报错
2、备节点自动拉起实例,恢复正常
实际结果 1、主节点正常,业务不报错
2、备节点自动拉起实例,恢复正常
[插入实际结果截图]

5.3 仲裁节点 kill 故障

测试专项 高可用测试 kill 故障
用例描述 Kill 仲裁节点进程
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时在仲裁节点执行注入故障:kill -9 yasom 进程。date;kill -9 pid
预期结果 1、主备节点正常,业务不报错
2、仲裁节点自动拉起 yasom 服务,恢复正常
实际结果 1、主备节点正常,业务不报错
2、仲裁节点自动拉起 yasom 服务,恢复正常
[插入实际结果截图]

5.4 主节点实例 reboot 故障

测试专项 高可用测试 reboot 故障
用例描述 主节点实例 reboot
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
已开启开机自启配置
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时在主集群实例 1 节点执行注入故障:date;sudo reboot
【步骤 3】tpcc 结束查看主备切换完成时间:yasboot election event show -c yashandb
【步骤 4】计算 RTO 时间 = 切换完成时间 - 故障注入时间
预期结果 机器重启后自动恢复实例 1 成功。
实际结果 RTO=139 秒(TPMC 压力为 10 万),机器重启后自动恢复实例 1 成功。
[插入实际结果截图]

5.5 主备实例 reboot 故障

测试专项 高可用测试 reboot 故障
用例描述 主备所有节点 reboot
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
已开启开机自启配置
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时注入故障:(记录故障注入时间)。在主、备集群所有节点执行 date;sudo reboot
预期结果 业务报错,重启后自动拉起集群,恢复正常
实际结果 业务报错,重启完成后自动拉起集群,主备角色不变。
[插入实际结果截图]

5.6 仲裁节点 reboot 故障

测试专项 高可用测试 reboot 故障
用例描述 仲裁节点 reboot
预置条件 一主一备已部署
备节点心跳超时时间设置为 2 秒
Tpcc 测试工具已安装,加载 tpcc 数据完成
已开启开机自启配置
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时注入故障:(记录故障注入时间)。在仲裁节点执行 date;sudo reboot
预期结果 1、主备节点正常,业务不报错
2、仲裁节点重启后自动拉起 yasom 服务,恢复正常
实际结果 1、主备节点正常,业务不报错
2、仲裁节点重启后自动拉起 yasom 服务,恢复正常
[插入实际结果截图]

5.7 主节点实例网络故障

测试专项 高可用测试网卡故障
用例描述 主节点网卡故障
预置条件 一主一备已部署
Tpcc 测试工具已安装,加载 tpcc 数据完成
已开启开机自启配置
心跳超时时间设置为 9 秒
操作步骤 【步骤 1】客户端执行 tpcc 测试 10 分钟:./runBenchmark.sh props.yashandb
【步骤 2】第 5 分钟时在主节点执行注入故障:date;sudo ifdown 网卡名
故障持续 5、20 秒后取消:sleep 20;sudo ifup 网卡名
【步骤 3】tpcc 结束查看主备切换完成时间:yasboot election event show -c yashandb
【步骤 4】计算 RTO 时间 = 切换完成时间 - 故障注入时间
预期结果 心跳配置 9 秒。故障持续 5 秒取消,数据库正常;故障持续 20 秒,触发 RTO
实际结果 故障持续 5 秒取消,集群正常;
[插入实际结果截图]
故障持续 20 秒,触发 RTO 耗时 13 秒,其中有 9 秒是心跳检测时间。
[插入实际结果截图]