load data csv大量数据写库

【产品名称】

OceanBase

【产品版本】

社区版

【问题描述】

obd部署集群:三台机器1-1-1,16c64G,memory_limit=32G,导入csv文件,一亿数据量,通过时间字段分区100 个,未设置主键,使用load data/*+ parallel(9) load_batch_size(18)*/ 方式导入,非常耗时,需要怎么处理才能快速导入这一亿数据呢?

系统内置租户设置: alter system set system_memory=‘15g’; alter resource unit sys_unit_config max_memory=‘15g’,min_memory=‘15g’; #调优参数 alter system set enable_merge_by_turn= False; alter system set trace_log_slow_query_watermark=‘100s’; alter system set max_kept_major_version_number=1; alter system set enable_sql_operator_dump=True; alter system set _hash_area_size=‘3g’; alter system set memstore_limit_percentage=50; alter system set enable_rebalance=False; alter system set memory_chunk_cache_size=‘1g’; alter system set minor_freeze_times=5; alter system set merge_thread_count=20; alter system set cache_wash_threshold=‘30g’; alter system set _ob_enable_prepared_statement=true; ##调整日志级别及保存个数 alter system set syslog_level=‘PERF’; alter system set max_syslog_file_count=100; alter system set enable_syslog_recycle=‘True’; 自定义租户设置: CREATE RESOURCE UNIT unit1 max_cpu = 9,max_memory = 3006477108,min_memory = 3006477108, max_iops = 10000,min_iops = 1280,max_session_num = 3000,max_disk_size = 214748364800 – 200 GB; set global NLS_DATE_FORMAT=‘YYYY-MM-DD HH24:MI:SS’; set global NLS_TIMESTAMP_FORMAT=‘YYYY-MM-DD HH24:MI:SS.FF’; set global NLS_TIMESTAMP_TZ_FORMAT=‘YYYY-MM-DD HH24:MI:SS.FF TZR TZD’; set global ob_sql_work_area_percentage=80; set global optimizer_use_sql_plan_baselines = true; set global optimizer_capture_sql_plan_baselines = true; alter system set ob_enable_batched_multi_statement=‘true’; ##租户下设置,防止事务超时 show variables like ‘%timeout%’; set global ob_query_timeout=72000000000; set global ob_trx_timeout=72000000000; set global max_allowed_packet=67108864; # 执行load data 权限 set global secure_file_priv=’’; grant file on *.* to sqluser01;

请先发一下下面SQL结果,看看资源情况。

select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version 

from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port)

order by a.zone, a.svr_ip

;




select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, round(t2.max_memory/1024/1024/1024) max_mem_gb, round(t2.min_memory/1024/1024/1024) min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name

from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)

    join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)

    left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)

order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id

;

在 root@sys 下修改下面参数

alter system set net_thread_count = 32;  --  Libeasy网络线程个数,调大到32以期望增加Libeasy的网络吞吐量。

ALTER SYSTEM SET enable_sql_audit=false;

alter system set merge_thread_count = 32;  --  增大合并的线程数。

alter system set minor_merge_concurrency = 32;  --  增大转储的线程数,期望提高转储的速度。

alter system set memory_limit_percentage = 90;    --  OB占系统总内存的比例,提高OB可用的内存量。

alter system set memstore_limit_percentage = 70;  --  memstore占租户的内存比,尽量增大memstore的空间(数据导完后改回50或60.)。

alter system set freeze_trigger_percentage = 50;  --  启动major/minor freeze的时机,让转储(minor freeze)尽早启动,memstore内存尽早释放。

alter system set minor_freeze_times = 100;        --  minor freeze的次数,尽量不在测试期间触发major freeze。

alter system set minor_warm_up_duration_time = 0;  --  加快minor freeze

alter system set sys_bkgd_io_high_percentage=100;  --  从默认的90调整到100,提高转储的IO使用上限。

alter system set sys_bkgd_io_low_percentage=100;  --  从默认的0调整到100,提高转储的IO使用上限。
1 个赞

好的,我试验一下


使用obloader导入csv文件。在社区官网上有使用文档和资源下载。

使用文档:https://open.oceanbase.com/docs/productDocs



建议把 load_batch_size 去掉,因为这个值默认的batch是1000,改成18之后batch太小,可能影响导入性能