db2数据库分区
‘壹’ db2数据库 怎么按日或者按月 自动创建表分区
CREATE TABLE lineitem(l_orderkey DECIMAL(10,0) NOT NULL, l_cpartkey INTEGER, l_suppkey INTEGER, l_linenumber INTEGER, l_quantity DECIMAL(12,2), l_extendedprice DECIMAL(12,2), l_discount DECIMAL(12,2), l_tax DECIMAL(12,2), l_returnflag CHAR(1), l_linestatus CHAR(1), l_shipdate DATE, l_commitdate DATE, l_receiptdate DATE, l_shipinstruct CHAR(25), l_shipmode CHAR(10), l_comment VARCHAR(44)) PARTITION BY RANGE(l_shipdate) (STARTING MINVALUE, STARTING '1/1/2000' ENDING '31/12/2020' EVERY 1 YEAR(按月就是 MONTH), ENDING MAXVALUE);
‘贰’ db2表分区删除
1.常规方法
delete 查询条件
1.1.删除效率较慢
1.2.经常确认归档日志是否占满
1.3.大的事务长期没有提交容易导致活动日志压力过大
2.detach效率较高
2.1.detach到临时表
db2 "alter table T_PERFORM detach partition PART221 into table perform_PART221";
2.2.删除临时表
db2 drop tableperform_PART221;
‘叁’ 添加DB2 DPF分区节点出错,紧急求助
普通的db2就都是单分区数据库。 只有dpf或者purescale架构的集群db2有多个节点的说法。 db2 数据仓库(DPF)情况下,是MPP架构,一个DB2的库可以有很多个逻辑分区,每个逻辑分区可以放在不同的物理服务器上,可以称为1个节点。
‘肆’ db2 查看表分区语句与创建表分区
创建分区:ALTER TABLE tablename ADD PARTITION statis_month STARTING'201301'
INCLUSIVE ENDING '20090102' INCLUSIVE。
查询分区select * from syscat.datapartitions t where tabschema =模式名 and tabname = 表名
‘伍’ db2表分区
表分区可扩展表的存储能力、对于大量数据表使用分区字段可提高查询效率。
create table IXP.ESBTLOG(
UUID VARCHAR(32),
UUID_POS VARCHAR(20),
MSG_ID VARCHAR(100),
ESB_CODE VARCHAR(20) ,
CLI_ID CHAR(3),
CLI_ID_BOCS CHAR(2),
SERV_ID CHAR(3),
SERV_TRAN_CODE VARCHAR(20),
SERV_TCODE VARCHAR(20),
ESB_RET_CODE VARCHAR(20),
ERR_MSG VARCHAR(200),
TRACE_NO VARCHAR(32),
TRAN_DATE CHAR(8),
TRAN_TIME CHAR(6),
TXN_STATUS CHAR(1),
JOURNAL_NO VARCHAR(32),
EXT_UUID VARCHAR(32),
TXN_TOKEN VARCHAR(32),
NODE_NAME VARCHAR(32),
TRAN_BEGIN_TIME TIMESTAMP,
TRAN_END_TIME TIMESTAMP,
SP1_BEGIN_TIME TIMESTAMP,
SP1_END_TIME TIMESTAMP,
USER_BOCS VARCHAR(20),
WKSTATION VARCHAR(20),
RET_TRAN_DATE VARCHAR(20),
RET_TRAN_TIME VARCHAR(20),
RET_AC_DATE VARCHAR(20),
RET_TRACE_NO VARCHAR(20),
AP_TRACE_NO VARCHAR(20),
BR_NO VARCHAR(20),
TM_SMP TIMESTAMP default current timestamp
)PARTITION BY RANGE(TM_SMP)
(
PARTITION PARTMAX starting '9999-12-31-00.00.00.000000' INCLUSIVE ending MAXVALUE EXCLUSIVE
)in USERSPACE1
注意:倒数三行是创建分区表的关键,此例中此TM_SMP为分区字段,第一个分区名为PARTMAX,从'9999-12-31-00.00.00.000000'到无穷大都是它的分区范围。我们还可以在EXCLUSIVE后面继 续定义其它的分区,定义规则与定义PARTMAX分区相同,当然定义每个分区需以逗号分隔。最后一行in USERSPACE1表示分区表创建在USERSPACE1表空间中。我们还能添加,删除表分区。
db2 "alter table ESBTLOG add partition part20181118 STARTING '2018-11-18-00.00.00.000000' INCLUSIVE ENDING '2018-11-19-00.00.00.000000' EXCLUSIVE"
其思路是:detach分区到一张临时表(该操作会创建临时表,临时表已存在会报错,detach是分离分区的意思),再将临时表删除。
db2 "alter table ixp.esbtlog detach partition PART20181118 into table tb_temp"
db2 "drop table tb_temp"
A. 查询该表共有多少分区
db2 "select substr(TABNAME ,1,11) t_name,substr(DATAPARTITIONNAME ,1,12) part_name,DATAPARTITIONID ,substr(LOWVALUE,1,28) low_value,substr(HIGHVALUE,1,28) high_value from syscat.datapartitions where tabname='ESBTLOG' order by datapartitionid"
B. 显示每个分区有多少数据(没有数据的不会显示)
db2 "select substr(tm_smp,1,10) as tran_day,count(*) from esbtlog where 1=1 group by substr(tm_smp,1,10)"
C. 查询某个分区有多少数据量
db2 "select count(*) from ixp.esbtlog where substr(tm_smp,1,10)='2019-01-08'"
1. 请注意上方例子中的名称和分区范围。
2. 要想将一个已存在的表改成分区表,需要先将原表数据保存下来,删除表。再新建分区表,设定好表的分区及其范围,将原数据导入进去。
‘陆’ 我在安装 DB2 老是报“创建分区实例的进程失败”,请问怎么处理 新手, 能解释的详细点吗!!!
检查一下你的DB2的实例名是什么,LINUX系统按默认DB2的实例名是db2inst1,用命令
export DB2INSTANCE=db2inst1 设置一下实例,然后用db2start启动数据库。
‘柒’ db2 表数据分区 是否可以修改
1.创建分区表,INCLUSIVE(包含),exclusive(不包含)
CREATE TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" ( "REPORT_DATE" DATE, "MA_ACCT_NO" VARCHAR(100), "TRANS_DATE" DATE, "ORG_UNIT_ID" VARCHAR(15), "ORG_PROD_ID" VARCHAR(15), "CURR_CD" VARCHAR(15), "ACCT_NO" VARCHAR(15), "TRANS_NUM" VARCHAR(15), "TRANS_NO" VARCHAR(15), "TRANS_DIF" VARCHAR(15), "DEPOSIT_CHAR" VARCHAR(15), "DEPOSIT_BAL" DECIMAL(18,2), "TRANS_AMT" DECIMAL(18,2), "TRANS_TYPE" CHARACTER(1), "FLG" CHARACTER(1), "RATE" DECIMAL(18,6), "TRXMEM" DECIMAL(4,0)) IN "MA_DATA" INDEX IN "MA_INDEX" PARTITION BY RANGE ( "REPORT_DATE" NULLS LAST ) ( PARTITION PART0 STARTING '2010-12-10' INCLUSIVE ENDING '2010-12-20' INCLUSIVE ) ;
ALTER TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" DATA CAPTURE NONE LOCKSIZE ROW APPEND OFF NOT VOLATILE;
COMMENT ON TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" IS '活期交易明细表';
COMMENT ON "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" ( "REPORT_DATE" IS '数据日期', "MA_ACCT_NO" IS '管会账号', "TRANS_DATE" IS '营业日期', "ORG_UNIT_ID" IS '行所号', "ORG_PROD_ID" IS '业务品种 ', "CURR_CD" IS '币别', "ACCT_NO" IS '帐号', "TRANS_NUM" IS '交易序号', "TRANS_NO" IS '交易代号', "TRANS_DIF" IS '交易区别', "DEPOSIT_CHAR" IS '存款性质 ', "DEPOSIT_BAL" IS '存款余额', "TRANS_AMT" IS '交易金额', "TRANS_TYPE" IS '交易别', "FLG" IS '连动标志', "RATE" IS '汇率' );
GRANT CONTROL ON TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" TO USER "DB2INST2";
GRANT SELECT, INSERT, UPDATE, ALTER, DELETE, INDEX, REFERENCES ON TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" TO USER "DB2INST2" WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, ALTER, DELETE, INDEX, REFERENCES ON TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" TO USER "DB2INST2" WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, ALTER, DELETE, INDEX, REFERENCES ON TABLE "MABAS"."BAS_MID_TRANS_LIST_CK_BAK" TO USER "MAPUB" WITH GRANT OPTION;
2.增加分区,注意这里的INCLUSIVE,exclusive,这时只有2011-01-31的数据可以进行insert
alter table MABAS.BAS_MID_TRANS_LIST_CK_BAK add partition LIST_CK_bak0131 STARTING '2011-01-31' INCLUSIVE ENDING '2011-02-01' exclusive
3.insert 数据
insert into MABAS.BAS_MID_TRANS_LIST_CK_BAK select * from MABAS.BAS_MID_TRANS_LIST_CK where report_date=date('2011-01-31');
4.转移分区到临里表
alter table MABAS.BAS_MID_TRANS_LIST_CK_BAK detach partition LIST_CK_bak0131 into MABAS.BAS_MID_TRANS_LIST_CK_BAK1
5.删除生成的分区迁移表,注意这时分区表的分区(LIST_CK_bak0131)己经不存在了,如果要insert必须新增该分区
drop table MABAS.BAS_MID_TRANS_LIST_CK_BAK1
以下为应用写的shell脚本,并参照syscat.datapartitions 进行判断,如果有则删除分区,否则进行新建,以下为具体的脚本。
. /home/odSUSEr1/.profile#配置文件SYSNAME=GDBMAMADS_HOME=/home/odsuser1/gdbma/etl#DS ConfigDSConfigFile=$MADS_HOME/dsconfig_gdbma#MARPT ETL2数据库#DB信息DBNAME=`awk 'FS="=" {if ($0~/^MABASDBName/) print $2}' $DSConfigFile`DBUSR=`awk 'FS="=" {if ($0~/^MABASDBUser/) print $2}' $DSConfigFile`DBPWD=`awk 'FS="=" {if ($0~/^MABASDBPassword/) print $2}' $DSConfigFile`DBSCHEMA=`awk 'FS="=" {if ($0~/^MABASDBSchema/) print $2}' $DSConfigFile`DBPWD=`$MADS_HOME/Encrypt/discrypt.sh $DBPWD`dbname=$DBNAMEuser=$DBUSRpasswd=$DBPWD#连接数据库db2 connect to $DBNAME user $DBUSR using $DBPWD >/dev/nulldb2 set schema=$DBSCHEMA;#传递参数JOB_NAME=$1DELETE_DATE=$2#DELETE_DBSCHEMA=$1#DELETE_TAB=$2#DELETE_COL=$3#DELETE_TYPE=$4#DELETE_DATE=$5#DELETE_VALUE=$6
delete_tab="select SCH_NAME,TAB_NAME,IF_PARTITION,TAB_DATE,DEL_VALUE from mabas.s_job_info_m t where JOB_NAME = '"$JOB_NAME"' "DEL_DATA=`db2 -t "$delete_tab"`if [ $? -ne 0 ]thenecho "$SDATA"fiecho "$DEL_DATA" | sed -e '4,/^$/!d;/^$/d'|#循环读取job,然后调度while read SCH_NAME TAB_NAME IF_PARTITION TAB_DATE DEL_VALUEdo#判断删除方式#分区字段拼写if [ "$IF_PARTITION" = 'Y' ] then #分区进行拼写 partiton_name=`db2 -tx "select upper('p'||replace(varchar(date('"$DELETE_DATE"')),'-','')) from sysibm.sysmmy1 "` tmp_tab=`db2 -tx "select upper('tmp'||substr(replace(replace(varchar(current timestamp),'-',''),'.',''),5,10)) from sysibm.sysmmy1 "` #判断分区是否存在 vi_result=`db2 -tx "select count(*) from syscat.datapartitions t where tabschema = upper('"$SCH_NAME"') and tabname = upper('"$TAB_NAME"') and datapartitionname=upper('"$partiton_name"') "` #对分区进行操作 if [ "$DEL_VALUE" = '-' ] then #判断分区是否存在 if [ $vi_result -ne 0 ] then #进行分区数据到临时表 alter_parition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME detach partition $partiton_name into $SCH_NAME.$tmp_tab"` #删除临时表 drop_tmp=`db2 -tx "drop table $SCH_NAME.$tmp_tab"` #分区结束 partition_end=`db2 -tx "select varchar(date('"$DELETE_DATE"') +1 days) from sysibm.sysmmy1"` #增加分区 add_partition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME add partition $partiton_name STARTING '"$DELETE_DATE"' INCLUSIVE ENDING '"$partition_end"' exclusive "` else #分区结束 partition_end=`db2 -tx "select varchar(date('"$DELETE_DATE"') +1 days) from sysibm.sysmmy1"` #增加分区 add_partition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME add partition $partiton_name STARTING '"$DELETE_DATE"' INCLUSIVE ENDING '"$partition_end"' exclusive "` fi else if [ $vi_result -ne 0 ] then #进行分区数据到临时表 drop_parition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME detach partition $partiton_name into $SCH_NAME.$tmp_tab "` #备份临时表中不属于该条件的数据 delete_tab_date=`db2 -tx "delete from $SCH_NAME.$tmp_tab where "$DEL_VALUE" "` #分区结束 partition_end=`db2 -tx "select varchar(date('"$DELETE_DATE"') +1 days) from sysibm.sysmmy1"` #增加分区 add_partition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME add partition $partiton_name STARTING '"$DELETE_DATE"' INCLUSIVE ENDING '"$partition_end"' exclusive "` #insert 不符合删除条件的数据 insert_date=`db2 -tx "insert into $SCH_NAME.$TAB_NAME select * from $SCH_NAME.$tmp_tab "` else #分区结束 partition_end=`db2 -tx "select varchar(date('"$DELETE_DATE"') +1 days) from sysibm.sysmmy1"` #增加分区 add_partition=`db2 -tx "alter table $SCH_NAME.$TAB_NAME add partition $partiton_name STARTING '"$DELETE_DATE"' INCLUSIVE ENDING '"$partition_end"' exclusive "` fi fielse #直接删除表 if [ "$DEL_VALUE" = "-" ] then delete_tab_data=`db2 -tx "delete from $SCH_NAME.$TAB_NAME where date("$TAB_DATE") = DATE('"$DELETE_DATE"') "` else delete_tab_data=`db2 -tx "delete from $SCH_NAME.$TAB_NAME where date("$TAB_DATE") = DATE('"$DELETE_DATE"') and $DEL_VALUE "` fifidone
‘捌’ DB2 分区数据库备份与恢复操作如何进行 (1)
恢复以及带有 OVERFLOW 选项的前滚操作。对于 DB2 的分区数据库,某些直接发出的 DB2 命令只作用于当前一个分区,备份和恢复(BACKUP/RESTORE)就属于这一类命令。但是对于硬盘数据恢复分区数据库,由于同一数据库的数据分布在多个分区上。 则对它的备份和恢复操作就要考虑到各分区上数据的完整及同步问题,因此可以在 DB2 命令前加上 db2_all 命令,以便 DB2 命令在数据库的各个分区上被执行,而无需分别对每个分区重复发出相同的命令。 另外在 DB2 中,启用了前滚数据恢复模式的数据库,使用的是归档日志方式,而非缺省的循环日志方式。这样,在进行恢复操作时,可在利用 RESTORE 命令恢复了数据库或表空间的备份后,再通过前滚命令(ROLLFORWARD)命令前滚归档日志中的事务,恢复数据库备份时间点之后提交的事务,最大程度的保护数据库的数据。 与备份和恢复命令不同的是,前滚命令仅能通过在分区数据库的编目分区上运行,来实现数据库各分区的前滚操作。 下面就以一个启用了前滚恢复模式的分区数据库 SAMPLE 为例介绍其备份、恢复以及前滚操作的具体步骤。这里假设该数据库创建在一台服务器上,具有四硬盘数据恢复个分区,其编目分区为0号分区。 一. 对分区数据库的备份操作: 前面已经介绍了,备份操作仅作用于分区数据库的当前分区,所以要使用“db2_all”的命令实现对所有分区进行备份(这里使用联机备份方式),即: db2_all "db2 backup db sample online" 但是上述命令对各分区的备份是以串行方式进行的,为提高备份操作的性能,还有一种可使分区间以并行方式进行的方法。即在上述命令的 DB2 命令前加上以下选项来实现命令的并行: <<+分区号< :表示后续命令作用于该分区。 <<-分区号< :表示后续命令作用于除该分区之外的其它分区。 ||<<-分区号< 或 <<-分区号; :表示后续命令作用数据恢复于除该分区之外的其它分区,并且是以并行方式进行的。 但由于备份和恢复操作要求独占编目分区,因此在对其它分区进行并行方式的备份操作之前,首先必须完成该分区的备份操作。其方法为: db2_all "<<+0< db2 backup db sample online" -- 对编目分区的备份 db2_all "||<<-0< db2 backup db sample online" -- 对其它分区硬盘数据恢复的并行备份 注:分区数据库的备份结束后会为每个分区都产生一个备份映象文件。
‘玖’ 如何在AIX操作系统上安装DB2 9的分区环境
磁盘和内存要求磁盘要求 磁盘要求取决于你安装的选件的多少,安装过程中有3个选件可以安装,分别是 ESE、CLIENT 和 RTCL,一般情况下,如果你安装所有的3个选件,2GB 空间是足够了。在 AIX 上,DB2 基本产品缺省是安装在/opt/IBM/DB2/V9.1目录下。内存要求 DB2 数据库系统至少需要 256 MB RAM。对于一个只运行 DB2 和 DB2 GUI 工具的系统,至少需要 512 MB RAM。但是,建议提供 1 GB 的 RAM 以提高性能。这些需求并不包括在系统上运行的其他软件所需要的内存。机器数目要求 你可以在一台机器上安装 DB2 分区数据库,也可以在多台机器上安装一个分区数据库,本文档假设你在 ServerA、ServerB、ServerC 和 ServerD 四台机器上进行安装。对操作系统的安装要求表1. 对操作系统的环境要求AIX 版本操作系统AIX V5.2.01)64-bit AIX kernel is required; 2)TL08 and SP2; 3)Minimum C++ runtime level is xlC.rte 8.0.0.4 and xlC.AIX50.rte 8.0.0.4AIX V5.3.01)64-bit AIX kernel is required; 2)TL04 and SP2; 3)Minimum C++ runtime level is xlC.rte 8.0.0.4 and xlC.AIX50.rte 8.0.0.4使用bosboot 命令切换至 64 位内核 要切换至 64 位内核,需要 root 用户权限并应输入下列命令:清单1 ln -sf /usr/lib/boot/unix_64 /unix
‘拾’ 如何获取DB2 V9.5版本中的DPF许可证
如何获取DB2 V9.5版本中的DPF许可证
环境情况---
产品:DB2 UDB
平台:跨平台
版本:V9.5
问题:
在版本 9.5 中,数据库分区功能没有单独的许可证与之对应,它只能作为 DB2仓库产品的一部分提供。
在 DB2 版本 9.1 中,数据库分区功能部件随 DB2 企业服务器版(ESE)一起提供。如果需要使用分区功能,那么就需要安装分区功能的许可证,这个许可证文件一般名为db2_dpf.lic。
在 DB2 版本 9.5 中,数据库分区功能部件仅作为 DB2 仓库产品的一部分提供。使用数据库分区功能部件的现有 DB2 ESE 用户将升级到 IBM DB2 基本仓库功能部件。要使用数据库分区功能部件的新的 DB2 版本 9.5 客户应升级到 DB2 仓库产品。
解答:
要使用数据库分区,可以使用 DB2 仓库安装程序。
如果您不需要其他仓储工具,可以运行 DB2 ESE 安装程序,然后应用仓库许可证证书来激活数据库分区,具体命令如下:
db2licm -a dwee.lic
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦