sqlldr direct参数小测试

本文详细介绍了如何使用SQL的LOAD命令导入数据,并通过触发器实现数据操作的记录与审计。包括直接路径加载与普通路径加载的区别,以及触发器在数据插入、更新和删除时的响应方式。

首先建一表
 CREATE TABLE XEP.TEST
  (    ID NUMBER(*,0),                                              --主键
       NAME VARCHAR2(16) NOT NULL ENABLE, --非空
       AGE NUMBER(3,0),                                               --check
        CONSTRAINT CHECK_AGE CHECK (age>0),
        PRIMARY KEY (ID)
 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
 TABLESPACE XEP_SPACE  ENABLE
  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
 TABLESPACE XEP_SPACE
 
 
SQL> desc xep.test
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------

 ID                                        NOT NULL NUMBER(38)
 NAME                                      NOT NULL VARCHAR2(16)
 AGE                                                NUMBER(3)
 
1.创建 控制文件 ctr.txt
Load Data
infile  data.txt
badfile badfile.txt
discardfile discardfile.txt
replace
into table test
FIELDS TERMINATED ","
(
 id,
 name,
 age
)

2.创建数据文件 data.txt
1,"test1",1
2,"test2",2
3,"test3",3
4,"test4",4
3,"test5",5
6,"test6",6
6,"test7",-1
6,"test8",0
9,"test9",9

3.执行loader命令 D:\document\xep\load>sqlldr xep/xiaoep control=ctr.txt  skip=2

SQL> select * from xep.test;

        ID NAME                    AGE
---------- ---------------- ----------
         3 "test3"                   3
         4 "test4"                   4
         6 "test6"                   6
         9 "test9"                   9


4.执行带direct参数的loader命令 D:\document\xep\load>sqlldr xep/xiaoep control=ctr.txt  skip=2 direct=y

SQL> select * from xep.test;

        ID NAME                    AGE
---------- ---------------- ----------
         3 "test3"                   3
         4 "test4"                   4
         3 "test5"                   5
         6 "test6"                   6
         6 "test7"                  -1
         6 "test8"                   0
         9 "test9"                   9

已选择7行。

普通load相当于insert 每一条都会检查约束,直接路径加载(带direct=y) 只检查主键与唯一约束  其它的不做检查 如果主键冲突 也会插入表中。
skip参数是跳过前几行。

再测一下触发器
1.创建一序列 create sequence test_seq increment by 1 start with 1 cache 15 nocycle

2.创建一新表记录用户插入数据的详细信息
create table test_audit(id number,insert_user varchar2(16),cmd varchar2(16),val varchar2(32));

3.创建触发器
create or replace trigger t_insert
  after insert or  delete or update on test  
  for each row

begin
    if inserting then
    insert into test_audit values(test_seq.nextval,user,'insert',:new.name);
   
    elsif updating then
      insert into test_audit values(test_seq.nextval,user,'update',:new.name ||'_'||:old.name);
    
    elsif deleting then
      insert into test_audit values(test_seq.nextval,user,'delete',:old.name);
    end if;
    
end;


4.执行loader命令 D:\document\xep\load>sqlldr xep/xiaoep control=ctr.txt  skip=2

SQL> select * from xep.test;

        ID NAME                    AGE
---------- ---------------- ----------
         3 "test3"                   3
         4 "test4"                   4
         6 "test6"                   6
         9 "test9"                   9
         
SQL> select * from xep.test_audit;

        ID INSERT_USER      CMD              VAL
---------- ---------------- ---------------- --------------------------------
         1 XEP              insert           "test3"
         2 XEP              insert           "test4"
         3 XEP              insert           "test6"
         4 XEP              insert           "test9"
         
SQL> truncate table xep.test;

5.执行loader命令(带direct=y)   D:\document\xep\load>sqlldr xep/xiaoep control=ctr.txt  direct=y     

SQL> select * from xep.test;

        ID NAME                    AGE
---------- ---------------- ----------
         1 "test1"                   1
         2 "test2"                   2
         3 "test3"                   3
         4 "test4"                   4
         3 "test5"                   5
         6 "test6"                   6
         6 "test7"                  -1
         6 "test8"                   0
         9 "test9"                   9

SQL> select * from xep.test_audit;

        ID INSERT_USER      CMD              VAL
---------- ---------------- ---------------- --------------------------------
         1 XEP              insert           "test3"
         2 XEP              insert           "test4"
         3 XEP              insert           "test6"
         4 XEP              insert           "test9"

          

常规路径加载                                                                       直接路径加载
 
使用 COMMIT 来使所做的更 改能永久保留                    使用数据保存
 

始终生成重做日志条目                                                       仅在特定条件下才生成重做 日志条目
 

执行所有的约束                                                                   仅执行主键约束、唯一性约束 和 NOT NULL 约束
 
触发 INSERT 触发器    不触发 INSERT 触发器              可以加载到集簇表中    无法加载到集簇表中
 

其他用户可以对表进行更改                                                其他用户不能对表进行更改


<think> 我们讨论的是在实验室环境中通过硬件实验来验证HBase与Oracle的选型建议矩阵。这需要设计一套可重复的测试方案,包括硬件配置、软件部署、测试工具和具体测试步骤。以下是一个详细的可行性方案: ### **可行性分析** 1. **目标**:在受控实验室环境中,通过标准化测试验证选型矩阵中的结论(如写入吞吐、查询延迟、扩展性等)。 2. **挑战**: - HBase的分布式特性要求多节点集群,而Oracle RAC至少需要2节点(共享存储)。 - 需要模拟真实场景的数据模型(如金融交易日志、电商订单)。 - 硬件资源可能成为瓶颈(如网络带宽、磁盘IO)。 3. **可行性**:通过以下方式解决: - 使用云平台(如AWS/Azure)按需创建虚拟机集群。 - 采用YCSB、TPC-C等标准化测试工具生成负载。 - 通过脚本自动化测试流程,确保结果可复现。 --- ### **实验环境设计** #### **硬件配置** | **组件** | **HBase集群** | **Oracle RAC** | |----------------|-------------------------------|-------------------------------| | 计算节点 | 3台(8核/32GB RAM/SSD) | 2台(16核/64GB RAM/SSD) | | 存储 | 各节点本地SSD(1TB) | 共享SAN存储(2TB) | | 网络 | 10Gbps专用网络 | 10Gbps专用网络+光纤SAN | | 扩展性测试 | 动态增加至6节点 | 固定2节点(RAC扩展成本高) | > **注**:硬件规格需根据测试数据量调整,例如: > - 10亿条记录 ≈ 约500GB原始数据(HBase压缩后约150GB) > - 使用SSD避免磁盘IO瓶颈 #### **软件配置** | **类别** | **HBase** | **Oracle** | |----------------|-------------------------------|-------------------------------| | 数据库版本 | HBase 2.4 + HDFS 3.3 | Oracle 19c RAC | | 部署模式 | 独立ZooKeeper集群(3节点) | ASM管理共享存储 | | 关键参数 | `hbase.regionserver.handler.count=200`<br>`hbase.regionserver.global.memstore.size=0.4` | `sga_target=32G`<br>`db_writer_processes=16` | #### **测试工具** 1. **数据生成与写入**: - **YCSB**(Yahoo! Cloud Serving Benchmark):支持HBase和Oracle,可配置读写比例、数据分布(均匀/zipfian)。 - **自定义脚本**:模拟电商订单(宽表)或物联网设备数据(时间序列)。 2. **查询测试**: - **主键查询**:YCSB的read操作。 - **范围扫描**:HBase的`Scan`操作 vs Oracle的`SELECT ... BETWEEN`。 3. **事务测试**: - **TPC-C**:针对Oracle测试OLTP事务能力(HBase需配合Phoenix或自定义事务层)。 --- ### **测试步骤** #### **阶段1:基准写入测试** 1. **数据准备**: - 生成10亿条测试数据(例如:用户行为日志,每条1KB)。 - 数据模型:`(rowkey, cf:col1, cf:col2, ...)`。 2. **HBase测试**: ```bash # YCSB命令示例 ./bin/ycsb load hbase20 -P workloads/workloada -p table=test -p columnfamily=cf -p recordcount=1000000000 -threads 100 ``` 3. **Oracle测试**: ```bash # 使用SQL*Loader或JDBC批量导入 sqlldr userid=test/test control=load.ctl direct=true ``` 4. **指标记录**: - 吞吐量(ops/sec) - 平均写入延迟(ms) - 资源使用率(CPU、IO、网络) #### **阶段2:查询性能测试** 1. **主键查询**: - 随机选择100万条记录的主键进行查询。 2. **范围扫描**: - 执行时间范围查询(如`SELECT * WHERE timestamp BETWEEN t1 AND t2`)。 3. **指标记录**: - P50/P95/P99延迟 - 查询吞吐量(QPS) #### **阶段3:扩展性测试** 1. **HBase横向扩展**: - 初始3节点,逐步添加至6节点。 - 在扩容过程中持续运行写入负载,观察吞吐量变化。 - 验证线性扩展公式: $$ \text{理论吞吐增益} = \frac{\text{新节点数}}{\text{原节点数}} \times \text{原吞吐量} $$ 2. **Oracle RAC扩展**: - 由于共享存储架构,增加节点对写入提升有限(重点测试连接数扩展)。 #### **阶段4:故障恢复测试** 1. **HBase RegionServer宕机**: - 随机停止一个RegionServer进程。 - 记录Region迁移时间和查询中断时间。 2. **Oracle RAC节点宕机**: - 关闭一个实例,观察服务切换时间。 --- ### **预期结果验证** | **测试结论** | **验证方法** | **通过标准** | |----------------------------|----------------------------------------------|----------------------------------| | HBase写入吞吐高于Oracle | 相同硬件下YCSB写入测试 | HBase吞吐 ≥ 2倍Oracle | | Oracle主键查询延迟更低 | 主键查询P99延迟对比 | Oracle P99 ≤ HBase P99的50% | | HBase扩展性线性增长 | 添加节点后写入吞吐提升比例 | 扩容至1.5倍节点,吞吐提升≥1.4倍 | | Oracle范围扫描性能优势 | 扫描10万行数据耗时 | Oracle耗时 ≤ HBase耗时的60% | --- ### **关键风险与规避** 1. **网络瓶颈**: - 使用`iperf`测试节点间带宽,确保≥9Gbps。 2. **HBase Compaction影响**: - 限制Compaction时间窗口(如凌晨),测试时关闭自动Compaction。 3. **Oracle缓存干扰**: - 每次测试前重启实例并清空缓存(`ALTER SYSTEM FLUSH BUFFER_CACHE`)。 --- ### **实验交付物** 1. **性能报告**: - 包含各测试场景的吞吐、延迟、资源占用图表。 - 例如:HBase扩容吞吐变化曲线图。 2. **自动化脚本**: - 部署脚本(Ansible)、测试脚本(Python/YCSB)、监控脚本(Prometheus)。 3. **配置文档**: - 详细的参数调优记录(如HBase的`hbase-site.xml`、Oracle的`init.ora`)。 --- §§ 延展问题 §§ 1. 如何量化HBase的LSM树压缩效率对写入放大的影响? 2. 在Oracle RAC中,Cache Fusion机制如何影响高并发查询性能? 3. 测试中如何模拟真实的电商“秒杀”场景(极端写入峰值)? 4. 针对物联网时序数据场景,HBase与TimescaleDB的对比测试方案如何设计? 5. 如何通过火焰图分析HBase RegionServer的GC瓶颈? 通过上述实验方案,可系统验证选型矩阵中的结论,并为实际生产部署提供数据支撑[^1][^2][^3]。 </think>### 实验室环境验证选型矩阵的可行性方案 在实验室环境中通过硬件实验验证 **HBase vs Oracle 选型矩阵** 完全可行,但需严格设计测试场景和资源配置。以下是具体实施方案: --- ### **一、可行性分析** 1. **核心结论可验证性** - ✅ **写入吞吐**:通过LSM树(HBase)与B+树(Oracle)的架构差异可复现写入性能差距 - ✅ **查询延迟**:主键查询、范围扫描等场景可量化对比 - ✅ **扩展性**:通过动态增删节点测试线性扩展能力 - ⚠️ **事务一致性**:需模拟分布式事务场景(如2PC协议验证) 2. **成本与周期** | **项目** | 最小规模 | 预估周期 | |----------------|------------------------|----------| | HBase集群 | 3节点(32核/128GB/SSD)| 2周 | | Oracle RAC | 2节点+共享存储 | 3周 | | 测试数据 | ≥1TB | 1周 | --- ### **二、硬件与软件配置** #### **硬件要求** | **组件** | HBase集群 | Oracle RAC | |----------------|------------------------|-----------------------| | 服务器 | 3台(最小规模) | 2台 | | CPU | 32核/节点 | 32核/节点 | | 内存 | 128GB/节点 | 128GB/节点 | | 存储 | 1TB NVMe SSD/节点 | 共享SAN存储(2TB) | | 网络 | 10Gbps专用交换 | 10Gbps+光纤通道 | #### **软件栈** | **类型** | HBase方案 | Oracle方案 | |----------------|------------------------|-----------------------| | 数据库版本 | HBase 2.4 + HDFS 3.3 | Oracle 19c RAC | | 测试工具 | YCSB, HBase PE | Swingbench, SLOB | | 监控工具 | Prometheus+Grafana | Oracle EM + AWR | | 部署工具 | Ansible剧本 | Oracle Grid Control | --- ### **三、关键测试步骤** #### **阶段1:写入性能验证** 1. **场景设计** - 使用YCSB生成10亿条宽表数据(单条1KB) - 控制变量: - WAL机制开启 - 相同压缩算法(Snappy) - 相同JVM参数(-Xmx64g) 2. **执行命令** ```bash # HBase批量写入 hbase pe --rows=1000000000 --nomapred randomWrite # Oracle批量写入 sqlldr userid=scott/tiger control=load.ctl direct=true ``` 3. **测量指标** $$ \text{吞吐量} = \frac{\text{写入数据量}}{\text{时间}} \quad (MB/s) $$ $$ \text{IOPS} = \frac{\text{写入次数}}{\text{时间}} \quad (ops/s) $$ #### **阶段2:查询性能验证** | **查询类型** | 测试工具 | 关键参数 | |----------------|----------------|------------------------| | 主键点查 | YCSB | workloada (50% read) | | 范围扫描 | HBase Scan | `setCaching(5000)` | | 聚合查询 | Phoenix | `SELECT COUNT(*)...` | #### **阶段3:扩展性验证** 1. **HBase横向扩展** ```bash # 动态添加节点 hbase-daemon.sh start regionserver # 触发负载均衡 balance_switch true ``` 2. **Oracle RAC扩展** ```sql ALTER SYSTEM ADD INSTANCE 'node3' HOST='192.168.1.3'; ``` #### **阶段4:故障恢复测试** | **故障类型** | HBase验证方式 | Oracle验证方式 | |------------------|----------------------------|-------------------------| | 节点宕机 | kill -9 RegionServer进程 | crs_stop -f node2 | | 网络分区 | iptables阻断5000ms | ifconfig eth0 down | | 磁盘损坏 | rm -rf /hbase/data/regionX | rm Oracle数据文件 | --- ### **四、预期结果对照矩阵** | **指标** | HBase预期值 | Oracle预期值 | 验证方法 | |------------------|---------------------|--------------------|------------------------| | 写入吞吐 | >50,000 ops/s | <10,000 ops/s | YCSB测量ops/s | | 主键查询P99 | <15ms | <5ms | Prometheus直方图 | | 扩展线性度 | $$ \approx 1.0 $$ | $$ \leq 0.7 $$ | 增节点后吞吐增长比例 | | 故障恢复时间 | <5s | >30s | 日志分析+服务恢复监测 | --- ### **五、风险与规避** 1. **硬件差异偏差** - 规避方案:所有节点使用同型号SSD,禁用NUMA 2. **JVM GC干扰** - 规避方案: ```bash # HBase GC优化 export HBASE_REGIONSERVER_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=500" ``` 3. **Oracle缓存干扰** - 规避方案:每次测试前执行 ```sql ALTER SYSTEM FLUSH BUFFER_CACHE; ALTER SYSTEM FLUSH SHARED_POOL; ``` --- ### **六、交付物清单** 1. 性能对比报告(含图表) 2. 自动化测试脚本集(Ansible+YCSB) 3. 监控数据快照(Grafana看板/AWR报告) 4. 配置参数清单(hbase-site.xml / init.ora) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值