关于oracle:ubuntu配置samba解决linux的svn使用舒适问题

个人感觉,svn的命令行应用起来没有git那么舒服,然而windows上的svn GUI客户端TortoiseSVN 应用十分不便。因而对于常常在虚拟机中做服务程序开发然而又不得不用svn的同学来说,联合linux开发环境和TortoiseSVN 来治理代码版本就显得尤其有用。 装置配置sambaubuntu上应用apt-get装置 apt-get install samba samba-common<!--more--> 敞开防火墙 systemctl stop ufw应用vim /etc/samba/smb.conf命令编辑samba配置文件,在配置文件最初增加即可 [homes] comment = qk_python Directories browseable = no path = /root/qk_python valid users = root read only = no增加用户,除了root用户外也能够输出其余的存在用户名。 smbpasswd -a root重启samba服务失效 systemctl restart smbd在Windows下运行窗口输出\\加上IP,例如:\\192.168.1.177\root。在弹出的窗口,输出刚刚增加的用户名和明码,就能够拜访Linux的文件目录了。 配置svn因为配置samba的时候配置成了非只读的,因而能够间接checkout相应的svn我的项目到Linux文件目录中。实现之后对svn做以下配置: 勾选svn的网络驱动类型 TortoiseSVN->Settings->Icon Overlays 勾选Driver Types中的”Network drives”显示svn我的项目绿色图标: TortoiseSVN->Settings->Icon Overlays 抉择Shell而后就能够显示绿色图标了,接下来就欢快的应用TortoiseSVN治理Linux代码吧。 记得帮我点赞哦! 精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!! 朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。 我是职场亮哥,YY高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。听我说,提高多,程序人生一把梭 如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。 职场亮哥文章列表:更多文章 自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

August 29, 2020 · 1 min · jiezi

关于oracle:常用Oracle-SQL集锦

罕用dml和query开并行--开并行ALTER SESSION FORCE PARALLEL DML PARALLEL 16;ALTER SESSION FORCE PARALLEL QUERY PARALLEL 16;--关并行ALTER SESSION DISABLE PARALLEL DML ;ALTER SESSION DISABLE PARALLEL QUERY;索引开并行drop index IDX_SB_SBZT_LRRQ;create index IDX_SB_SBZT_LRRQ on SB_SBZT (LRRQ, CWLX_DM, SWJG_DM) tablespace TS_GS_SB_IDX pctfree 20 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ) parallel 6;alter index IDX_SB_SBZT_LRRQ noparallel;查看ASM-- 查看asm的各个disk group是否超过80%-- name:name of the disk group-- total_mb:total capacity of the disk group(in megabytes)-- free_mb:unused capacity of the disk group(in megabytes)select t.name,t.TOTAL_MB /1024, round(100 * (t.TOTAL_MB - t.FREE_MB) / t.TOTAL_MB, 2)||'%' from v$asm_diskgroup t;<!--more--> ...

August 29, 2020 · 4 min · jiezi

关于oracle:Oracle定时任务

定时工作查问查问oracle定时工作,能够通过: -- 所有用户的定时工作SELECT * FROM dba_jobs;-- 本用户的定时工作select * from user_jobs;查问后果中,what字段个别寄存存储过程名称(或者具体的存储过程内容),BROKEN=N示意工作执行中,BROKEN=Y示意进行。要依据存储过程名称,查问存储过程内容,能够通过: select * from user_source where type = 'PROCEDURE'and name = 'YXTESTJOB'order by name, line;这样,就能够梳理出定时工作到底做了些什么事件。 定时工作创立定时工作个别用于定时的执行存储过程。所以先创立存储过程,而后再创立工作。创立存储过程: -- 创立存储过程create or replace procedure YxtestJob isbegin insert into test1(id, name) values(1, to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));end;创立定时工作: -- 通过脚本创立定时工作declare job_no number;begin sys.dbms_job.submit(job => job_no, what => 'YxtestJob;', next_date => to_date('19-08-2020 15:53:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'TRUNC(sysdate, ''mi'') + 1/(24*60)'); commit;end;这里,job_no会由数据库主动调配,并且会避开已被应用过的数字,避免反复。 留神:what对应的值,必须有分号结尾。并且对应的存储过程必须是失常状态的没有分号结尾的报错: interval距离的设置阐明每分钟执行:TRUNC(sysdate,'mi') + 1/(24*60)TRUNC(sysdate,'mi')示意日期截取到分钟,1/(2460)示意: 1天/(2460)=24小时/(24*60)=1/60小时=1分钟 ...

August 19, 2020 · 1 min · jiezi

关于oracle:oracle函数表复制CT和IS

CT和IS(表复制)1、CT(create table ... as)语法 create table <new table> as select * from <exists table><br/> 案例 查问emp表中deptno为10的数据,创立表emp10 (创立出emp10表) create table emp10 as select * from emp where deptno=10; <br/><br/> 2、IS (insert into ...select..)语法 insert into table2(f1,f2...) select v1,v2....from table1 <br/> 案例 查问emp表中deptno为50的数据,插入到emp10表中(emp10已存在) insert into emp10(empno,ename,job) select empno,ename,job from emp where deptno=50;<br/><br/>

August 17, 2020 · 1 min · jiezi

关于oracle:oracle函数表复制CT和IS

CT和IS(表复制)1、CT(create table ... as)语法 create table <new table> as select * from <exists table><br/> 案例 查问emp表中deptno为10的数据,创立表emp10 (创立出emp10表) create table emp10 as select * from emp where deptno=10; <br/><br/> 2、IS (insert into ...select..)语法 insert into table2(f1,f2...) select v1,v2....from table1 <br/> 案例 查问emp表中deptno为50的数据,插入到emp10表中(emp10已存在) insert into emp10(empno,ename,job) select empno,ename,job from emp where deptno=50;<br/><br/>

August 17, 2020 · 1 min · jiezi

关于oracle:oracle子查询关联子查询与非关联子查询的区别

关联子查问和非关联子查问1、关联子查问阐明外层查问的每一行数据,外部查问都会再查问一次。 <br/> 特点 1、子查问不能独自运行,是和外查问相干的2、先执行外层查问,再执行内层查问 <br/> 示例如下例,在子查问中用到了外层查问的字段(t.deptno),且不能独自运行(因为用到了外层查问的字段) select t.*, t.rowid from dept t where exists (select 1 from emp e where e.deptno = t.deptno); <br/><br/> 2、非关联子查问阐明子查问先将值查问进去,而后再返回给外层查问。 <br/> 特点 1、子查问能独自运行2、先执行内层查问,再执行外层查问 <br/> 示例如下所示,子查问的语句能够独自执行--》 select max(e.deptno) from emp e select t.*, t.rowid from dept t where t.deptno = (select max(e.deptno) from emp e); <br/>

August 10, 2020 · 1 min · jiezi

关于oracle:oracle子查询关联子查询与非关联子查询的区别

关联子查问和非关联子查问1、关联子查问阐明外层查问的每一行数据,外部查问都会再查问一次。 <br/> 特点 1、子查问不能独自运行,是和外查问相干的2、先执行外层查问,再执行内层查问 <br/> 示例如下例,在子查问中用到了外层查问的字段(t.deptno),且不能独自运行(因为用到了外层查问的字段) select t.*, t.rowid from dept t where exists (select 1 from emp e where e.deptno = t.deptno); <br/><br/> 2、非关联子查问阐明子查问先将值查问进去,而后再返回给外层查问。 <br/> 特点 1、子查问能独自运行2、先执行内层查问,再执行外层查问 <br/> 示例如下所示,子查问的语句能够独自执行--》 select max(e.deptno) from emp e select t.*, t.rowid from dept t where t.deptno = (select max(e.deptno) from emp e); <br/>

August 10, 2020 · 1 min · jiezi

关于oracle:oracle集合运算UNIONUNION-ALL

在Oracle中提供了三种类型的汇合操作: 并(UNION)、交(INTERSECT)、差(MINUS) UNION:求并,重复记录只显示一次。UNION ALL:求并集,显示所有记录信息。INTERSECT:求交加MINUS:返回两个查问后果的差集 以下咱们来介绍下对于oracle的汇合运算: 一、数据筹备依据emp表数据创立emp10表 create table emp10 as (select * from emp where deptno=10);以后表数据: emp10表 emp表 二、oracle汇合运算1、UNION阐明 取并集,重复记录只显示一次 写法select * from emp union select * from emp10; 后果 2、UNION ALL阐明取并集,显示所有数据 写法select * from emp union all select * from emp10; 后果 3、INTERSECT阐明求交加,两个汇合中公共的局部 写法 select * from emp intersect select * from emp10; 后果 4、MINUS阐明求差集,即返回的是emp中有,emp10中没有的数据 写法select * from emp minus select * from emp10; 后果 ...

August 2, 2020 · 1 min · jiezi

oracle运维08内存使用情况分析查看

1、SGA、PGA应用状况查问;select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctused from(select 'SGA' name,(select sum(value/1024/1024) from v$sga) total,(select sum(bytes/1024/1024) from v$sgastat where name='free memory')free from dual)unionselect name,total,round(used,2)used,round(total-used,2)free,round(used/total*100,2)pctused from (select 'PGA' name,(select value/1024/1024 total from v$pgastat where name='aggregate PGA target parameter')total,(select value/1024/1024 used from v$pgastat where name='total PGA allocated')used from dual);2、内存使用率;-- pctused: 使用率select * from (select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctused from(select 'SGA' name,(select sum(value/1024/1024) from v$sga) total,(select sum(bytes/1024/1024) from v$sgastat where name='free memory')free from dual)unionselect name,total,round(used,2)used,round(total-used,2)free,round(used/total*100,2)pctused from (select 'PGA' name,(select value/1024/1024 total from v$pgastat where name='aggregate PGA target parameter')total,(select value/1024/1024 used from v$pgastat where name='total PGA allocated')used from dual) unionselect name,round(total,2) total,round((total-free),2) used,round(free,2) free,round((total-free)/total*100,2) pctused from (select 'Shared pool' name,(select sum(bytes/1024/1024) from v$sgastat where pool='shared pool')total,(select bytes/1024/1024 from v$sgastat where name='free memory' and pool='shared pool') free from dual)unionselect name,round(total,2)total,round(total-free,2) used,round(free,2) free,round((total-free)/total,2) pctused from (select 'Default pool' name,( select a.cnum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 total from x$kcbwds a, v$buffer_pool p where a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=(select value from v$parameter where name='db_block_size')) total,(select a.anum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 free from x$kcbwds a, v$buffer_pool pwhere a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=(select value from v$parameter where name='db_block_size')) free from dual)union select name,nvl(round(total,2),0)total,nvl(round(total-free,2),0) used,nvl(round(free,2),0) free,nvl(round((total-free)/total,2),0) pctused from (select 'KEEP pool' name,(select a.cnum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 total from x$kcbwds a, v$buffer_pool p where a.set_id=p.LO_SETID and p.name='KEEP' and p.block_size=(select value from v$parameter where name='db_block_size')) total,(select a.anum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 free from x$kcbwds a, v$buffer_pool pwhere a.set_id=p.LO_SETID and p.name='KEEP' and p.block_size=(select value from v$parameter where name='db_block_size')) free from dual)unionselect name,nvl(round(total,2),0)total,nvl(round(total-free,2),0) used,nvl(round(free,2),0) free,nvl(round((total-free)/total,2),0) pctused from (select 'RECYCLE pool' name,( select a.cnum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 total from x$kcbwds a, v$buffer_pool p where a.set_id=p.LO_SETID and p.name='RECYCLE' and p.block_size=(select value from v$parameter where name='db_block_size')) total,(select a.anum_repl*(select value from v$parameter where name='db_block_size')/1024/1024 free from x$kcbwds a, v$buffer_pool pwhere a.set_id=p.LO_SETID and p.name='RECYCLE' and p.block_size=(select value from v$parameter where name='db_block_size')) free from dual)unionselect name,nvl(round(total,2),0)total,nvl(round(total-free,2),0) used,nvl(round(free,2),0) free,nvl(round((total-free)/total,2),0) pctused from(select 'DEFAULT 16K buffer cache' name,(select a.cnum_repl*16/1024 total from x$kcbwds a, v$buffer_pool p where a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=16384) total, (select a.anum_repl*16/1024 free from x$kcbwds a, v$buffer_pool pwhere a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=16384) free from dual)unionselect name,nvl(round(total,2),0)total,nvl(round(total-free,2),0) used,nvl(round(free,2),0) free,nvl(round((total-free)/total,2),0) pctused from(select 'DEFAULT 32K buffer cache' name,(select a.cnum_repl*32/1024 total from x$kcbwds a, v$buffer_pool p where a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=32768) total, (select a.anum_repl*32/1024 free from x$kcbwds a, v$buffer_pool pwhere a.set_id=p.LO_SETID and p.name='DEFAULT' and p.block_size=32768) free from dual)unionselect name,total,total-free used,free, (total-free)/total*100 pctused from (select 'Java Pool' name,(select sum(bytes/1024/1024) total from v$sgastat where pool='java pool' group by pool)total,( select bytes/1024/1024 free from v$sgastat where pool='java pool' and name='free memory')free from dual)unionselect name,Round(total,2),round(total-free,2) used,round(free,2) free, round((total-free)/total*100,2) pctused from (select 'Large Pool' name,(select sum(bytes/1024/1024) total from v$sgastat where pool='large pool' group by pool)total,( select bytes/1024/1024 free from v$sgastat where pool='large pool' and name='free memory')free from dual)order by pctused desc);3、查看内存应用的其它指标select * from v$sga_dynamic_components;select * from v$pgastat;-- 查问share pool的闲暇内存select a.*,round(a.bytes/1024/1024,2) M from v$sgastat a where a.NAME = 'free memory';-- 通过上面的sql查问占用share pool内存大于10M的sqlSELECT substr(sql_text,1,100) "Stmt", count(*), sum(sharable_mem) "Mem", sum(users_opening) "Open", sum(executions) "Exec" FROM v$sql GROUP BY substr(sql_text,1,100) HAVING sum(sharable_mem) > 10000000;-- 查问一下version count过高的语句SELECT address, sql_id, hash_value, version_count, users_opening, users_executing, sql_text FROM v$sqlarea WHERE version_count > 10;

July 9, 2020 · 3 min · jiezi

PLSQLRebuild-index-和-Rebuild-Index-区别

看完这章你会学习到以下内容: 区别在那?针对大表做索引重建的时候,要注意什么?区别:1、当rebuild 时一般对原先索引进行INDEX FAST FULL SCAN。2、当rebuild online的时不用原先索引而执行TABLE ACCESS FULL3、rebuild和rebuild online都会发生sort,即需要用到temp表空间。4、rebuild 会阻塞dml语句而rebuild online则不会。5、rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。 素材来源: 1.索引rebuild和rebuild online时要慎重 2.Rebuild index 对DML的影响3.ORACLE中index的rebuild 4.记录一则rebuild index消除索引碎片的效果

June 26, 2020 · 1 min · jiezi

PLSQLHWM-高水位-含义解决之道

看完这章你会学习到以下内容: HWM是什么意思?HWM有何影响?HWM在哪里可以查询?HWM问题如何解决?HWM是什么意思? A)HWM指的是所有oracle的segments 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。 反过来讲,HWM说明还有多少没有被使用的数据块分配给这个segment。 数据块 - 区 - 段 - 表空间 HWM有何影响? B) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低。具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位。 C) 查看用户表是否高水位?第一种方法:用User_tables 中的 Blocks,empty_Block 和num_rows方法查看一张表里面的数据块有多少。 SELECT blocks, --该表曾经使用过的数据块的数目,即水线 empty_blocks, --代表分配给该表,但是在水位线以上的数据块,即从来没有使用过的数据块 num_rowsFROM user_tablesWHERE table_name = ‘table_name’; 第二种方法:在SYS用户里操作查询数据字典,如果SYS有赋予权利给其它用户的话也行,输入如下: SELECT TABLESPACE_NAME ,BYTES/1024/1024 AS FREE_MB -- 已用的 ,MAXBYTES/1024/1024 AS MAX_MB FROM DBA_DATA_FILES; 原文素材提供:1.ORACLE 11g 生产中高水位线(HWM)处理2.Oracle 高水位(HWM)回收原理及操作方法

June 26, 2020 · 1 min · jiezi

PLSQL基础练习-14-下

14.有如下两张表:交易表deli_t: 日期Busi_date 交易时间Exch_time 客户编号Cust_piy_no 交易类型Exch_type 产品代码Prd_no 交易量Del_amt 机构编号Org_no20170101 93102 0312003 证券买入 00001 1000 031220170101 103102 0312003 证券买入 00002 500 031220170101 133102 0312003 证券卖出 00003 800 0312...... 20171231 143102 0320004 期权买入 00004 500 0320客户信息表info_t: 机构编号Org_no 机构名称Org_name0312 黄埔东路0320 农林下路... 0306 中年广场需求1: 请写一段筒单的sql,提取出201712月每个部门每天各种交易类型的交易量给业务部门.展示字段为:日期、机构名称、证券买入当日交易量、证券卖出当日交易量分析: 1.用Where语句首先判断日期是否等于201712月2.然后观察字段内容得知,涉及两张表,需要关联,用Inner Join SELECT d.busi_date AS 日期, i.org_name AS 机构名称, SUM(CASE WHEN d.exch_type='证券买入' THEN d.del_amt END) AS 证券买入当日交易量, SUM(CASE WHEN d.exch_type='证券卖出' THEN d.del_amt END) AS 证券卖出当日交易量 FROM deli_t d JOIN info_t i ON d.org_no=i.org_no WHERE SUBSTR(d.busi_date,1,6)='201712' -- d.busi_date 为字符串类型 GROUP BY d.busi_date,i.org_name;需求2: ...

June 25, 2020 · 1 min · jiezi

PLSQL-练习题6-银行日常业务

看完这章你会学习到以下内容: 解题的思路解题的方法问题1: 解题思路: 1.YTD 数据按照产品名分类聚合求和(Group by + Sum函数) 2.产品名称出自TblProduct表,月份出自TblPayments,两表关联。 3.关联后用With...AS 子查询套入查询 4.列数比行数多,通常都是行列转换的结果 创建两张表格1.tblpayment表格创建语句 --- tblpayment 创建语句:CREATE TABLE TBLPAYMENTS (SID VARCHAR2(10), PAYMENTTIME DATE, PRODUCTID VARCHAR2(10), AMOUNT NUMBER(10,0), PAYMENTSTATUS VARCHAR2(10), SALES VARCHAR2(10), REGION VARCHAR2(10), DELAYWEEKS VARCHAR2(20) ); insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-1', to_date('02-01-2019 12:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-1', 30, 'Paid', '张三', '华南', '每日按要求更新');insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-2', to_date('02-02-2019 12:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-2', 60, 'Waiting', '张三', '华南', '每日按要求更新');insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-3', to_date('02-03-2019 22:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-3', 90, 'Paid', '李四', '华东', '每日按要求更新');insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-4', to_date('04-03-2019 15:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-1', 100, 'Waiting', '张三', '华南', '每日按要求更新');insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-5', to_date('02-04-2019 12:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-2', 200, 'Waiting', '李四', '华南', '每日按要求更新');insert into TBLPAYMENTS (SID, PAYMENTTIME, PRODUCTID, AMOUNT, PAYMENTSTATUS, SALES, REGION, DELAYWEEKS)values ('S-6', to_date('22-05-2019 17:20:30', 'dd-mm-yyyy hh24:mi:ss'), 'P-3', 3000, 'Paid', '张三', '华东', '每日按要求更新'); 2.tblproduct表格创建语句 ...

June 24, 2020 · 3 min · jiezi

Oracle-数据库-对象命名规范

看完这章你会学习到以下内容: 什么时候用的最多,这样做的好处?不同对象一般的命名规范编写目的 使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读、理解和继承!总领:不要用中文标识,一般用英文进行翻译使用,或者用中文首字母。 2.1表(Table) 一般表采用“所处层+t_+模块名+_+表义名” 格式构成。 若数据库中只含有单个模块,命名可采用“所处层+t_+表义名”格式构成。 2.2临时表(Temporary Table) 临时表采用“所处层+t_tmp_+表义名” 格式构成。 2.3关联表(Relative Table) 关联表命名为"所在层Re_表A_表B"格式构成. Re是Relative的缩写,表A和表B均采用其表义名或缩写形式。 3.1 主键 任何表都必须定义主键 表主键命名为:“pk+_+表名(或缩写)+_+主键字段” 如“pk_dept_deptno”等。 3.2.外键 表外键命名为: “fk+_+表名(或缩写)+_主表名(或缩写)+_+主键字段” 如“fk_dept_deptno_Empdetno”等。 3.3 CHECK约束 CHECK约束命名为: “chk+_+CHECK约束的列名(或缩写)” 3.4 UNIQUE约束 UNIQUE约束命名为: “unq+_+UNIQUE约束的列名(或缩写)” 3.5 索引 索引的命名为:“idx+表名(或缩写)+_+列名”。 4.触发器 AFTER型触发器 :系统名+tr_+<表名>_+ **_+[_row] _BEFORE型触发器 :系统名+tr_+<表名>_+bef__+[_row] _*INSTEAD OF型触发器 :系统名+ti_+<表名>+_+_*+[_row] 5.**_视图 视图命名以**系统名vw_+模块名 **作为前缀,其他命名规则和表的命名类似 6.序列 序列命名以seq_+含义名组成 7.同义词 同义词命名**与其基础对象的名称一致 但要去除其用户前缀或含有远程数据库链接的后缀以“syn+_+某张表表名**”组成 8 存储过程 存储过程命名由“系统名+sp+_+存储过程标识(缩写)”组成 存储过程标识要以实际含义的汉语拼音的首字符构成,并用下划线分割各个组成部分。 如增加代理商的帐户的存储过程为“sfsp_ZJDLSZH”。 9.函数 函数命名由“系统名+f+_+函数标识”组成 10.包 包命名由“系统名+pkg+_+包标识”组成 11.用户及角色用户命名由“系统名称+_+user+_+名词(或缩写)或名词短语(或缩写)”组成 角色命名由“系统名称+_+role+_+名词(或缩写)或名词短语(或缩写)”组成 12.数据库链接数据库链接命名由“远程服务器名+_+数据库名+_+link”组成 例如:table_name@DB_Link; 若远程服务器名和数据库名一致,上式“_+数据库名”部分省去 ...

June 24, 2020 · 1 min · jiezi

PLSQL-练习题3-前多少百分比划等级

创建表T_GOOGS,插入7行语句。 CREATE TABLE T_GOOGS(GOODS_TYPE VARCHAR2(10),GOODS_NAME VARCHAR2(20),PRICE NUMBER(5));INSERT INTO T_GOOGS VALUES('手机','华为mate',2999);INSERT INTO T_GOOGS VALUES('手机','苹果ipone',7999);INSERT INTO T_GOOGS VALUES('手机','小米',1999);INSERT INTO T_GOOGS VALUES('水果','车厘子',79);INSERT INTO T_GOOGS VALUES('水果','葡萄',79);INSERT INTO T_GOOGS VALUES('水果','苹果',12);INSERT INTO T_GOOGS VALUES('电脑','金士顿',499);SELECT * FROM T_GOOGS;结果如下图: 现要求:按照价格升序排列,按照价格的前20%,定义为低档;按照价格的20%到85%为中档,剩下的则为高档。 解题思路: 1)分不同的档次,一定要用Case When。 2)前20%如何找出来 -> 小于序号最大值*20% ->创建序号列 ->按照价格升序 -> 分析函数 第一步:新添加一列按价格排序的序号列,用分析函数。 WITH TB AS (SELECT T.*,ROW_NUMBER()OVER(ORDER BY PRICE) AS RANK_NUM FROM T_GOOGS T )第二步:对比排名数字要小于原表里最大序号的20%,20%-85%,85%以上。 SELECT TB.* ,CASE WHEN RANK_NUM <= (SELECT MAX(RANK_NUM) FROM TB)*0.2 THEN '低档' -- 筛选前20%的物品 WHEN RANK_NUM <= (SELECT MAX(RANK_NUM) FROM TB)*0.85 AND RANK_NUM > (SELECT MAX(RANK_NUM) FROM TB)*0.2 THEN '中档' -- 筛选前20%到85%的物品 ELSE '高档' END AS RANK_Percent -- 剩下的15%物品FROM TB最后的结果: ...

June 24, 2020 · 1 min · jiezi

PLSQL-练习题5多条件限定-And字段1字段2

这里直接可以用子查询和关联做。 原表与结果: SELECT * FROM EMP ORDER BY DEPTNO DESC; 如果先用Deptno分组再求最小值。 这里的关键是两个合并条件进行筛选,因为这个是分组后再求每个分组的最小值,唯一值 如果只匹配SAL,那有个部门的最小值恰好是其他部门的最小值,则会返回多个员工的信息。 方法一: 这可以理解,相当于And(Deptno,Sal)做一个合逻辑运算。 SELECT * FROM EMPWHERE(DEPTNO,SAL) IN (SELECT DEPTNO,MIN(SAL) FROM EMP GROUP BY DEPTNO);字段对应着字段的 Where 后面的字段和后面的Select子查询字段要一样。 Where(Deptno,Sal) =Select Deptno,Min(sal) From 方法二:表左连接 把挑选出来的每个部门的最低工资求出来,然后作为临时表A SELECT * FROM EMP EJOIN(SELECT DEPTNO,MIN(SAL) AS MIN_SAL FROM EMP GROUP BY DEPTNO ) AON E.DEPTNO = A.DEPTNOAND E.SAL = A.MIN_SAL; 2020年5月30日更新: 方法三: 分析函数,用Row_number按照部门然后薪酬升序排序,然后套用子查询取值为1 SELECT * FROM (SELECT E.* ,ROW_NUMBER()OVER(PARTITION BY DEPTNO ORDER BY SAL ASC) AS RN FROM EMP E)T WHERE T.RN =1;

June 24, 2020 · 1 min · jiezi

PLSQL-练习题6添加汇总行的两种方法

问题:统计部门的名称,以及对应的人数,添加到最后一列汇总原始结果,没有汇总列: SELECT D.DNAME,COUNT(*) AS 人数 FROM DEPT D LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO GROUP BY D.DNAME 方法一原理: 两张表的上下合并Union all,其中一个表即是原表,还有一个只有一行汇总表。 我这边添加一个字段名和原表一样,但值等于总结,用As语句赋值。 SELECT '总计' AS DNAME,COUNT(DISTINCT EMPNO)from EMP;结果将两张表合并一起,但注意先后顺序。 SELECT D.DNAME,COUNT(*) AS 人数 FROM DEPT D LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO GROUP BY D.DNAME UNION all SELECT '总计' AS DNAME,COUNT(DISTINCT EMPNO)from EMP; 方法二原理: 用函数Rollup和Nvl空值转换。 SELECT nvl(D.DNAME,'总计') as DNAME,COUNT(*) AS 人数 FROM DEPT D LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO GROUP BY rollup(D.DNAME); ...

June 24, 2020 · 1 min · jiezi

PLSQl-练习题2Groupby-多个字段不一定返回唯一值

有以下两张表,一张是交易表一张客户信息表 需求是提取出201712月每天第一个下单的客户。最后一个下单的时间信息。 展示字段为:日期、第一个下单时间、第一个下单客户、最后下单时间、最后下单客户。 分析:第一个下单和最后一个下单,分别可以用Max和Min函数得出。 下单的客户和下单信息都在同一张表,因此不用做其它表关联。 根据: 第一笔下单时间 (唯一) - > 第一笔下单的客户 (√) 最后一笔下单时间 (唯一)-> 最后一笔下单的客户 (√) 一个错误的示范: 如果为了要让客户编号出现,便自行添加到Group by后面。 那这样就不只返回最早和最晚的下单用户,反倒把当天所有的人都返回。 SELECT d.busi_date, d.cust_piy_no, MIN(exch_time) AS min_exch_time, MAX(exch_time) AS max_exch_time FROM deli_t d WHERE SUBSTR(d.busi_date, 1, 6) = '201712' GROUP BY d.busi_date, d.cust_piy_no 因此,当我们首先找到一个最小(最早)下单日期,最大(最晚)下单日期。然后,我们做表的自身连接,用唯一的交易时间作为表的关联(On)去匹配对应的客户信息。 SELECT tmp.busi_date AS 日期, d1.exch_time AS 第一个下单时间, d1.cust_piy_no AS 第一个下单客户, d2.exch_time AS 最后下单时间, d2.cust_piy_no AS 最后下单客户 FROM ( SELECT d.busi_date, MIN(exch_time) AS min_exch_time, MAX(exch_time) AS max_exch_time FROM deli_t d WHERE SUBSTR(d.busi_date,1,6)='201712' -- d.busi_date 为字符串类型 GROUP BY d.busi_date -- 找到了最早最晚下单的, ) tmp JOIN deli_t d1 ON d1.busi_date=tmp.busi_date AND d1.exch_time=tmp.min_exch_time -- 第一个下单 JOIN deli_t d2 ON d2.busi_date=tmp.busi_date AND d2.exch_time=tmp.max_exch_time -- 最后一个下单 ORDER BY tmp.busi_date;第二种方法可以一分为二,即将最早下单时间和客户信息作为表1(table a), 然后再计算出最晚下单时间和客户信息作为表2(table b). 然后table a union all table b. ...

June 24, 2020 · 1 min · jiezi

PLSQL-练习题1计算满足条件的人数

问题:求每个部门工资高于部门平均工资的员工数量占整个部门人数的百分比 分析:这里所有的信息都来自EMP表,不用做表连接。 其次,要新增一列按每个部门的平均工资,这里就用分析函数Avg()Over(Partiton by... ...) 接着,要计算百分比。分子是高出平均工资的人数,分母是整个部门的人数 关键字: 1)计算满足某条件的人数 累计求和 2)生成字段百分比字段 难点之一: 如何写出高出平均工资的人数?且保留有整张表所有人数的Count() 解决方法: CASE WHEN 满足的Count +1 否则0; 然后用全表作为子查询 注意: 不要用Count , 因为这个只计数,并不会把符合条件的都求和 SELECT A.DEPTNO, TO_CHAR(ROUND(SUM(CASE WHEN A.SAL > A.AVG THEN 1 ELSE 0 END) / COUNT(*) * 100, 2), '99D99') || '%' AS 百分比 -- 因为要突出Count(*)是总人数,所以子查询需要E.* FROM (SELECT E.*, AVG(E.SAL) OVER(PARTITION BY E.DEPTNO) AVG FROM EMP E) A GROUP BY A.DEPTNO

June 24, 2020 · 1 min · jiezi

SQL-常用函数-第三集-字符函数

看完这章你会掌握以下内容。 INSTR 和 SUBSTR 经典组合套用场景TRIM,LTRIM,RTRIM 不带参数和带参数的区别Replace 函数替换不存在的字符,是否报错*INSTR函数语法(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1,可正可负(正向逆向) J 出现的位置,默认为1 SQL> select instr("abcde",'b'); 结果是2,即在字符串“abcde”里面,字符串“b”出现在第2个位置。如果没有找到,则返回0;不可能返回负数 SBUSTR(str,pos); 就是从pos开始的位置,一直截取到最后。还有一种比较常用的是: SUBSTR(str,pos,len); 这种表示的意思是,就是从pos开始的位置,截取len个字符(空白也算字符),pos默认为1。 经典练习题1: 从字符串中'1#qfq#3df#520#d234#dlaj#' 查找第3个#号和第4个#号之间的字符串 两个函数的嵌套使用,Substr和Instr Substr 截取字符 Instr 查找字符所在位置,返回位置数值。 SUBSTR('1#qfq#3df#520#d234#dlaj#', 起始位置, 截取长度)INSTR('1#qfq#3df#520#d234#dlaj#','#',1,3)+1 --起始位置INSTR('1#qfq#3df#520#d234#dlaj#','#',1,4)-INSTR('1#qfq#3df#520#d234#dlaj#','#',1,3)-1 -- 截取长度SELECT SUBSTR('1#qfq#3df#520#d234#dlaj#', INSTR('1#qfq#3df#520#d234#dlaj#','#',1,3)+1, INSTR('1#qfq#3df#520#d234#dlaj#','#',1,4)- INSTR('1#qfq#3df#520#d234#dlaj#','#',1,3)-1) FROM dual; 经典练习题2: 从字符串中'dfas#dffr#saf#fdad#fsfa#ds#dfa' 查找最后一个#号后面的字符串 select substr('dfas#dffr#saf#fdad#fsfa#ds#dfa',Instr('dfas#dffr#saf#fdad#fsfa#ds#dfa','#',-1,1)+1 )from dualselect instr('ds#as#dfa','#',-1,1) from dual; -- 计数位置方向始终从左往右select substr('ds#as#dfa',6) FROM DUAL; LTrim,Trim,RTrim 函数本身有两种用法,一是不带参数,二是带参数。-- TRIM 函数的基本用法:SELECT TRIM(' AS '),LTRIM(' AS '),RTRIM(' AS ') FROM DUAL;SELECT TRIM(' A S ')FROM DUAL;不带截取参数,就是截取字符串里的空格。 ...

June 23, 2020 · 1 min · jiezi

SQL-常用函数第七集-分析函数重点

看完这章你会学习到以下内容: 和group by 的区别分析的搭配(聚合,排序,位移)ORDER BY 累计求和属性 Q1: 和group by 分组有什么区别? A1:Over(Partition by)它可以在数据中进行分组然后 计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值 SELECT E.DEPTNO,AVG(SAL) FROM EMP E GROUP BY DEPTNO; SELECT E.*, AVG(SAL)OVER(PARTITION BY DEPTNO) AS 平均工资 FROM EMP E; 1.函数为聚合函数(AVG,SUM,COUNT) 1.FUNCTION_NAME(<参数>,…) OVER (PARTITION BY 表达式,… ) -- 分组求值2.FUNCTION_NAME(<参数>,…) OVER (ORDER BY 表达式 <ASC DESC> ) -- 整体数据未做分组,先排序,在求累计求值3.FUNCTION_NAME(<参数>,…) OVER (PARTITION BY 表达式,… ORDER BY 表达式 <ASC DESC> ) -- 先分组,按组内排序,对组内求累计求值 -- PARTITION BY 1.查看员工表中员工信息以及对应部门的总人数 /* SELECT * FROM EMP; SELECT DEPTNO, COUNT(1) FROM EMP GROUP BY DEPTNO; SELECT E.*, T.CNT FROM EMP E JOIN (SELECT DEPTNO, COUNT(1) AS CNT FROM EMP GROUP BY DEPTNO) T ON E.DEPTNO = T.DEPTNO; */ SELECT E.*, COUNT(EMPNO) OVER (PARTITION BY DEPTNO) AS CNT FROM EMP E; -- ORDER BY 2.对员工表的工资从低到高排序,求累计应发放薪资 SELECT E.*, SUM(SAL) OVER (ORDER BY SAL) FROM EMP E; 区别 SELECT E.*, SUM(SAL) OVER (ORDER BY SAL,EMPNO) FROM EMP E;---- 按照每个部门的工资从高到低排序,计算每个部门的累计工资 ...

June 23, 2020 · 2 min · jiezi

SQL-常用函数第五集-日期函数

看完这章你会学习以下: Months_BETWEEN 两个日期的顺序NEXT_DAY 返回日期的注意事项--ADD_MONTHS(d,n),在某一个日期d上,加上指定的月数n,返回计算后的新日期。d表示日期,n表示要加的月数(n可以为负值) SELECT ADD_MONTHS(SYSDATE, 1), ADD_MONTHS(DATE'2019-08-30', -6), ADD_MONTHS(DATE'2020-08-30', -6) FROM DUAL; --LAST_DAY(d),返回指定日期当月的最后一天 SELECT LAST_DAY(SYSDATE),LAST_DAY(DATE'2019-08-30') FROM DUAL; -- MONTHS_BETWEEN (date1, date2),用于计算date1和date2之间有几个月 SELECT MONTHS_BETWEEN(TO_DATE('2014-3-21', 'yyyy-mm-dd'), TO_DATE('2014-1-10', 'yyyy-mm-dd')) mon_diff FROM DUAL; --注意:日期可以加减数字,表示加减多少天;日期减去日期表示相隔多少天;日期不能相加 SELECT DATE'2019-08-30'+6, DATE'2019-08-30'-6, DATE'2019-08-30'-DATE'2019-08-16' FROM DUAL;注意:Months_Between的第一个日期要大于第二个日期,否则返回负数。 Next_day注意:如果今天是星期六,如果要查询下一个星期六,则返回下周的星期六;如果要查询下一个星期日,则返回值是这个周的星期日。 --NEXT_DAY(d,date2[Mon,Tues,... ..]),返回指定日期的接下(指定日期)日子 SELECT NEXT_DAY(DATE'2019-08-30','friday') FROM DUAL; SELECT NEXT_DAY(SYSDATE,1) FROM DUAL;Date强制转化注意: 日期只能相减,返回两者的天数。 功能相当于Months_Between,但不能相加! --注意:日期可以加减数字,表示加减多少天;日期减去日期表示相隔多少天;日期不能相加 SELECT DATE'2019-08-30'+6, DATE'2019-08-30'-6, DATE'2019-08-30'-DATE'2019-08-16' ---- DATE'2019-08-30'+DATE'2019-08-16' 不允许日期+日期 FROM DUAL; 发布于 05-30 ...

June 23, 2020 · 1 min · jiezi

SQL-常用函数第六集-其余判断函数

看完这章你会学会以下内容: NVL和NVL2语法和常用实例DECODE 和 CASE WHEN 的区别1.NVL函数的格式如下:NVL(expr1,expr2) 含义:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。 SELECT NVL(NULL,0), -- 空转0 NVL(NULL,100), -- 空转100 NVL('', 99), -- 空字符转99 NVL(10, 100), -- 非空不会转 NVL('AD',77) -- 非空不会转 FROM DUAL; 2.NVL2函数的格式如下:NVL2(expr1,expr2, expr3) 含义:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。 SELECT NVL2(NULL, 0, 1), -- 空转1 NVL2('', 99, 2), -- 空字符转2 NVL2(10, 3, 100), -- 非空转3 NVL2('AD', 'AD', 7) -- 非空转'AD' FROM DUAL; 3.应用实例:查看员工信息和其年薪(薪酬+奖金) SELECT E.*,(SAL + NVL(COMM,0))*12 AS 年薪 FROM EMP E 4.应用实例二:对EMP表中的奖金为空的转换为100,不为空的转换为NULL; ...

June 23, 2020 · 2 min · jiezi

SQL-常用函数第四集-数字函数

看完本章你会学习到以下 数字函数有那些Round和TRUNC之间的区别SELECT ABS(-2) FROM DUAL; -- 2SELECT ROUND(2.281,1) FROM DUAL; -- 2.3SELECT MOD(10,3) FROM DUAL; --- 1SELECT POWER(2,3) AS 平方,POWER(2,-1) AS 求导 FROM DUAL;SELECT TRUNC(4.1231,2) FROM DUAL; ---- 截取小数点后几位,不参与四舍五入 4.12SELECT ABS(-2)AS 绝对值 ,ROUND(2.281,1)AS 四舍五入 ,MOD(10,3 )AS 求余 ,POWER(2,3) AS 平方,POWER(2,-1) AS 求导 ,TRUNC(4.1231,2) AS 不四舍五入取整 FROM DUAL;

June 23, 2020 · 1 min · jiezi

SQL常用函数-第二集-转换函数

看完这章你会学到以下内容 转换函数有那几种,通常用得最多的是那个?为什么要用转换函数?各自转换的关系,适用条件是什么?*数据类型有三类:数字,字符,日期 对应就用转换它们三种类型的函数 :转换函数! To_Date 转日期 Date 强制转换,里面一定要有'-'才能转换,数字只会出现错误,例如: SELECT DATE'2019-01-01' FROM DUAL; --- 强制转换为日期格式 SELECT TO_DATE('2019-01-01','YYYY/MM/DD') FROM DUAL; SELECT TO_DATE('2019-01-01','YYYY-MM-DD') FROM DUAL; SELECT TO_DATE('2019-01-01','YYYYMMDD') FROM DUAL; ---- 错误, 日期转换只有以上两种形式 注意:字符或数字中的年月日必须是日期范围内的值 SELECT TO_DATE('2019-13-08','YYYY-MM-DD'), -- 月份不对 TO_DATE(20190732,'YYYY-MM-DD') -- 天数不对 FROM DUAL; -- 字符日期中有-或/转化为日期类型必须加-或/ SELECT TO_DATE('2019-07-08','YYYYMMDD'), -- 错误 TO_DATE(20190708,'YYYY-MM-DD') FROM DUAL; --- 成功 To_Char() 转换为字符 SELECT TRUNC(TO_DATE(SYSDATE),'Y') FROM DUAL; SELECT TO_CHAR(DATE'2019-08-30','YYYY'), -- '2019' TO_CHAR(DATE'2019-08-30','YYYYMM'), -- '201908' TO_CHAR(DATE'2019-08-30','WW'), -- '35' 第35周 TO_CHAR(DATE'2019-08-30','IW'), -- '35' 第35周(自然周) TO_CHAR(DATE'2019-08-30','Q'), -- '3' 第3季度 TO_CHAR(DATE'2019-08-30','MM'), -- '08' TO_CHAR(DATE'2019-08-30','DD'), -- '30' TO_CHAR(DATE'2019-08-30','D') -- '6' 当周的第几天(星期天为第一天) FROM DUAL; ...

June 23, 2020 · 1 min · jiezi

oracle运维07查看锁资源情况

1.查看锁表情况;SELECT /*+ RULE */ Ls.Osuser Os_User_Name, Ls.Username User_Name, Decode(Ls.TYPE, 'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock', 'TX', 'Transaction enqueue lock', 'UL', 'User supplied lock') Lock_Type, o.Object_Name OBJECT, Decode(Ls.Lmode, 1, NULL, 2, 'Row Share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', NULL) Lock_Mode, o.Owner, Ls.Sid, Ls.Serial# Serial_Num, Ls.Id1, Ls.Id2 FROM Sys.Dba_Objects o, (SELECT s.Osuser, s.Username, l.TYPE, l.Lmode, s.Sid, s.Serial#, l.Id1, l.Id2 FROM V$session s, V$lock l WHERE s.Sid = l.Sid) Ls WHERE o.Object_Id = Ls.Id1 AND o.Owner <> 'SYS' ORDER BY o.Owner, o.Object_Name;2.查看锁表、主机、SID/SERIALselect l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user_name, s.machine, s.terminal, o.object_name, s.logon_time, 'alter system kill session '''||l.session_id||','||s.serial#||''';' kill会话 from v$locked_object l, all_objects o, v$session swhere l.object_id = o.object_id and l.session_id = s.sid order by sid, s.serial#;3.查看导至锁表的sql语句(汇总查询);select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#, l.os_user_name, s.machine, s.terminal, a.sql_text, a.SQL_FULLTEXT, o.object_name from v$sqlarea a, v$session s, v$locked_object l,all_objects owhere l.object_id = o.object_id and l.session_id = s.sid and s.prev_sql_addr = a.addressorder by sid, s.serial#;4.sid查看sql语句;select b.sql_text from v$session a, v$sql bwhere a.sid = SID号 --session_id and a.SQL_ADDRESS = b.ADDRESS(+);5.删除锁表的会话;----3028:SID,15898:SERIAL#alter system kill session '3028,15898';

June 22, 2020 · 1 min · jiezi

oracle运维05监视执行sql正在执行已执行执行性能查看

1.正在执行的sqlselect a.username, a.sid,b.SQL_TEXT,b.SQL_FULLTEXT,b.sql_id,b.EXECUTIONS from v$session a, v$sqlarea b where a.sql_address = b.address2.执行过的sqlselect b.SQL_TEXT,b.FIRST_LOAD_TIME,b.SQL_FULLTEXTfrom v$sqlarea bwhere b.FIRST_LOAD_TIME between '2020-06-20/01:52:00' and '2020-06-22/13:52:02'order by b.FIRST_LOAD_TIME desc;3.查找前10条性能最差sql;SELECT * FROM (select PARSING_USER_ID, EXECUTIONS, SORTS, COMMAND_TYPE, DISK_READS, sql_text, sql_fulltext, parsing_schema_name FROM v$sqlarea order BY disk_reads DESC) where ROWNUM < 10;

June 22, 2020 · 1 min · jiezi

oracle运维查询占用物理读资源性能

1.查询占用物理读资源性能分析select sql_text,sql_id, disk_reads, buffer_gets, parsing_schema_name, executionsfrom v$sqlarea where parsing_schema_name='用户对象'order by disk_reads desc;

June 20, 2020 · 1 min · jiezi

实用Oracle数据库常用命令整理

这篇文章主要介绍了oracle查询语句,有助于新手迅速熟悉ORACLE基本语法有助于新手迅速熟悉ORACLE基本语法,需要的朋友可以收藏下 oracle查看用户状态 select username,account_status from dba_users;查看所有角色 select * from dba_roles;锁定用户 alter user XXX account lock;Linux下新建用户 useradd -d /home/XXX -s /usr/bin/ksh -m XXX passwd XXX用户创建 useradd -d /home/XXX -g users -s /bin/bash -m XXX -G users  passwd XXX删除用户 userdel -r XXXLinux查看进程 ps -e|grep *** kill -9 ***(PID)linux查看版本信息 lsb_release -a赋予debug权限给用户 grant debug any procedure, debug connect session to prodb;oracle查询用户 select username,password from dba_users;oracle删除用户 drop user XXX cascade;如果遇到报错 oracle cannot drop a user that is currently connected 则执行以下命令 以sysdba登陆 shutdown immediate; startup restrict; drop user *** cascade; alter system disable restricted session;Oracle监听 lsnrctl start即可启动 如果出现以sysdba用户连接无法连接到数据库的现象  检查环境变量ORACLE_HOME,ORACLE_SID sqlplus下的删除符号 ctrl+backspacesqlplus远程连接 sqlplus 用户名/密码@10.10.10.10:1521/orcl查询表空间和对应数据文件的关系 select t1.name, t2.name  from v$tablespace t1, v$datafile t2 where  t1.ts# = t2.ts#;删除表空间 drop tablespace **** including contents and datafiles;取数据重复插入表 insert into table_A(X,X,X,X) select X,X,X,X from table_B where XXXtable_A和table_B可以是一张表,数据当然要经过更新之后再插入 为用户赋debug权限 GRANT debug any procedure, debug connect session TO USER XXX;查看不同用户的连接数 select username,count(username) from v$session where username is not null group by username;查看执行日志 select t."SQL_TEXT",t."SQL_FULLTEXT",t."LAST_ACTIVE_TIME" from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('XXX') and t."SQL_TEXT" like '%XXX%'收集整理于网络如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。 欢迎大家关注民工哥的公众号:民工哥技术之路

June 16, 2020 · 1 min · jiezi

Oracle中使用decode优雅的行转列

Oracle中使用decode优雅的行转列最近笔者在工作中终于还是碰到了行转列的应用场景,做一下笔记供自己查看和帮助有需求的人。 在其他关系数据库中,大多推荐用case when then end这种臃肿复杂的写法,最近看到oracle数据库中独有的函数decode十分优雅,下面简单介绍一下。 decode函数定义:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 在代码中可以理解为: if 条件==值1: 返回值1elif 条件==值2: 返回值2elif 条件==值n: 返回值nelse: 缺省值在关系数据库中可以理解为: case 条件 when 值1 then 返回值1 when 值2 then 返回值2 when 值n then 返回值n else 缺省值 end as 列示例:TYPENAMECLASSNUM_FLAG水果香蕉出售50水果香蕉剩余23水果香蕉单价7宠物小猫出售3宠物小猫剩余5SQL语句: SELECT TYPE,NAME, SUM(DECODE(CLASS,'出售',NUM_FLAG,0)) AS 出售, SUM(DECODE(CLASS,'剩余',NUM_FLAG,0)) AS 剩余, SUM(DECODE(CLASS,'单价',NUM_FLAG,0)) AS 单价FROM TEMP_TABLE GROUP BY TYPE,NAME执行后效果 TYPENAME出售剩余单价水果香蕉50237宠物小猫350

June 5, 2020 · 1 min · jiezi

数据库表被锁的原因分析和数据库乱码解决

一、记录一次准备给客户预演示出现的问题 事故的背景:当所以功能开发完成后,开发人员在本地进行了测视已经没问题了。就把所有开发的功能模块合并到 dev 分支,进行打包,发布到预演示的线上环境。当在给相关人员进行演示的时候,出现了问题。 我们使用 https 调用对方的接口发送 Json 数据,对方进行校验马上返回校验的响应结果。问题出现在我们每次发送数据都是成功的,但是对方发送回来的数据,一直不能正常插入 DB(使用的是 Oracle)。 事故的真正原因: 因为有个同事在进行了 delete 后没有进行 commit 提交。导致表一直被锁住,不能被其他人使用。 但是杀死进程和本地 commit 几次后,依旧无法插入数据,提示还是 DB 被这个同事锁住。 最后查出的真正原因是,这个同事首先使用了 无线网络 进行了 DB 的操作,当时并没有 commit 提交操作。而后又插上网线继续工作,问题就出现在这里。 首先,当我们使用无线网络操作 DB 时,Oracle 会默认这是一次会话(session),当开发人员对 DB 进行操作后(没有 commit ),又切换到了有线网络状态下,而这 2 种状态下的本机 IP 是不一样的(有兴趣的朋友可以试试使用无线和有线连接状态下,同一台电脑的 IP 地址是否一样)。 Oracle 会认为第一次 session 没有关闭,会将表锁住,等待这次 session 会话的提交直到结束。 所以当同事再连接上网线,使用有线网络进行 commit 时候会提示操作失败。因为 Oracle 数据库认为这又是一次新的 session 会话。而第一次的 session 会话并没有结束,就会导致出现了 DB 一直被锁的情况。 事故的解决办法: 首先使用语句查询(只有 Admin 用户才可以)出被锁住的表和锁表的开发人员的工号。 然后杀死这个进程或者进行 DB 重启即可。 ...

November 4, 2019 · 1 min · jiezi

oracle中的DATE类型存储的是日期和时间

微信公众号:51码农网专业编程问答社区www.51manong.comoracle中DATE类型存储的是date日期和time时间。对每个DATE类型的值,都会存储年、月、日、时、分、秒。无论你是否指定,都会存贮。当你指定“年月日”的日期时,它存储的是“年月日0点0分0秒”,在PLSQL中展示的是“yyyy-mm-dd”,没有带时间。当你存储的是“年月日时分秒”,PLSQL中展示的是“yyyy-mm-dd hh24:mi:ss”带上了时间。记住,它的存储格式就一种“yyyy-mm-dd hh24:mi:ss”。

October 22, 2019 · 1 min · jiezi

亚马逊宣布永久关闭-Oracle-数据库已完成迁移

北京时间 10 月 15 日晚间,AWS 的首席布道者 Jeff Barr 在官方博客发布标题为《迁移完成–亚马逊的消费者业务部关闭最后的 Oracle 数据库》的文章,正式宣布:亚马逊消费者业务永久关闭 Oracle 数据库。 下方为文章部分截取: 《迁移完成–亚马逊的消费者业务刚刚关闭了最终的 Oracle 数据库》 在亚马逊工作的 17 年间,我发现工程团队的同事们永远不满足于独自一人保持良好状态。他们定期重新评估每个内部系统,以确保其尽可能地可扩展,高效,高性能和安全。当他们找到改进的途径时,他们将使用他们所学到的知识对我们的体系结构和实现进行彻底的现代化,通常甚至将现有系统拆散并在必要时从头开始进行重建。 今天,我想向您介绍这种内部数据库迁移工作,该工作经过几年的工作才刚刚结束。多年来,我们意识到我们花了太多时间来管理和扩展数千个旧的 Oracle 数据库。我们的数据库管理员(DBA)不再专注于高价值的差异化工作,而是花费大量时间只是在事务率上升和装入的存储数据总量不断增加的情况下保持亮灯状态。这包括花费在处理复杂且效率低下的硬件配置,许可证管理和许多其他问题上的时间,而这些问题现在最好由现代的托管数据库服务来处理。 亚马逊消费者业务的 100 多个团队参与了迁移工作。这包括 Alexa,Amazon Prime,Amazon PrimeVideo,Amazon Fresh,Kindle,Amazon,Music,Audible,Shopbop,Twitch和Zappos等着眼于客户的知名品牌和网站,以及AdTech,Amazon Fulfillment 等内部团队技术,消费者付款,客户退货,目录系统,提供体验,数字设备,外部付款,财务,InfoSec,市场,订购和零售系统。 迁移完成 我很高兴地报告,该数据库迁移工作现已完成。亚马逊的消费者业务部门刚刚关闭了最终的 Oracle 数据库(某些第三方应用程序已与 Oracle 紧密绑定,并且尚未迁移)。 我们将存储在近 7,500 个 Oracle 数据库中的 75 PB 内部数据迁移到多个 AWS 数据库服务,包括Amazon DynamoDB,Amazon Aurora,Amazon Relational Database Service(RDS)和Amazon Redshift。迁移几乎无需停机即可完成,覆盖了我们专有系统的100%。这包括复杂的采购,目录管理,订单履行,会计和视频流工作负载。我们仔细跟踪了成本和性能,并实现了以下结果: 降低成本 –我们根据规模商定的折扣率大大降低了数据库成本,降低了60%以上。客户定期报告从Oracle切换到AWS可以节省90%的成本。性能改进 –面向消费者的应用程序的延迟减少了40%。 管理开销 –切换到托管服务可将数据库管理开销减少70%。迁移使每个内部团队可以自由选择最适合其需求的专用AWS数据库服务,还可以更好地控制其预算和成本模型。低延迟服务已迁移到DynamoDB和其他高度可扩展的非关系数据库,例如Amazon ElastiCache。具有高数据一致性要求的事务性关系工作负载已移至Aurora和RDS;分析工作负载已迁移到我们的云数据仓库 Redshift 。 我们捕获了最终 Oracle 数据库的关闭,并进行了简短的庆祝: ...

October 16, 2019 · 1 min · jiezi

可视化越做越丑这五个高级图表效果能瞬间抬升你的逼格

今天我们来说一说数据可视化,想必很多人在入门数据分析之后,就会经常进行可视化的工作,所谓一图胜千言,图表用的好,真的是会事半功倍的。但现实情况下,很多人遇到的问题是: 你做的图表太丑了?你做的图表到底想表达什么?图表太多,该用哪一个更好呢? 很多人看着下面这些高级上档次的数据可视化都觉得羡慕,但是到自己动手的时候又不知从何下手,或者实现难度太大,只能“望图兴叹”。 其实我们想要做好可视化并不难,最简单的方法就是要学一些高级的图表效果,折线图、柱状图这种常见图表很容易给人一种普通感,而高级的图表效果不仅可以提升颜值和逼格,而且能够更清晰地实现数据展示。 下面我就分享五个可视化中常用的高级图表,以及实现这些图表效果的具体方法。 首先,挑个可视化工具想要做出优秀的可视化,一个好的工具是必不可少的。 其实,简单一点的如excel,这个基本人人都会用,还能配置图表颜色,是数据可视化的入门基础。但是这个对原始数据有一定要求,量不能大数据要干净,也不能绘制地图等更加酷炫的图表,最后的结果是什么呢? 结果就是,数据可视化沦为了千篇一律的柱形图和折线图,还有那一成不变的配色。 因此数据分析师一般都使用专业的可视化工具,比较常见的就是python、R这些编程语言和FineBI、tableau这些专业BI工具,这次我就以FineBI为例,教大家怎么做出高级图表。 这里要先说一下FineBI进行可视化操作的流程: 数据准备:通过数据连接,将数据库中的数据以自助数据集的形式存储在业务包中,为可视化进行数据准备 数据加工:根据需求对数据进行初步加工,比如过滤、分组、排序、合并等操作 可视化图表制作:通过拖拽指标的形式,实现可视化图表的制作 仪表板设计完成:在仪表板上进行图表的排列设计,最终形成完整的可视化仪表板 高级图表一:流向地图地图图表是我们在进行可视化中经常会用的组件之一,比较普通的就是区域地图、线地图,比较高级的比如热力地图、点地图,这些基本都是静态地图;而流向地图则是更为高级的动态图表,经常应用于区际贸易、交通流向、人口迁移、购物消费行为等场景。 1、数据准备 在进行春运迁徙流向分析之前,我们需要准备流向地图的制作数据,包括迁徙路线、城市、城市对应经纬度和ID,如下图: 在准备好数据以后,我们就可以开始制作春运迁徙流向地图了。 2、拖拽地理字段 因为我们直接准备的经度、纬度字段,因此我们先将经纬度字段转换为地理角色,然后将转换后的经纬度字段拖入横纵轴中,如下图: 3、设置细粒度 经纬度默认汇总方式为求平均,此时图表中仅显示了一个点。我们还需要一个维度字段来为经纬度字段划分细粒度,因此我们将迁徙路线字段拖拽到细粒度中,并在图表类型中选择流向地图,如下图: 然后进一步划分细粒度,即每条迁徙路线下对应的城市维度。将城市字段拖拽至细粒度下、迁徙路线字段移到图形属性下的颜色栏,就可以做出这种效果了: 4、增加流向效果 在实现按照迁徙路线和城市划分连线以后,我们还需要指定流向的顺序,将ID字段拖入图形属性下的连线栏,如下图: 点击确定进行动画效果设置。可以看到图表中即按照迁徙路线的方向来流动。 5、优化效果 如果我们想增加迁徙人数的说明,即按照迁徙人数来调整流向线的颜色,此时就需要将迁徙人数字段拖拽至图形属性下的颜色栏,并将原来的迁徙路线字段移动至标签/提示/细粒度中城市上方,选择任一位置移动即可,如下图: 高级图表二:瀑布图瀑布图本质上属于一种柱状图,当用户想表达两个数据点之间数量的演变过程,比如薪酬支出构成,经过连续的数值加减关系得到最终的实发工资,就可以用瀑布图实现。 1、数据处理 数据准备同上,我们首先要进行数据的处理,先新增一列,并添加列名为“累计值准备”,公式如下图: 再新增列,添加列名为y值准备,选择累计值/组内,并设置取值规则为累计值,数值来自累计值准备,如下图: 再新增列,添加列名为y轴值,公式如下图: 再次新增列将其命名为标签,公式为如下图,此步骤即将基本、绩效、加班标记为增加,保险、公积金、个税标记为减少,应发工资和实发工资标记为汇总; 2、创建瀑布图 新建仪表板和组件,拖拽项目字段到横轴,拖拽y轴值、数据字段到纵轴,在图表类型下选择瀑布图,则数据字段被自动移至图形属性下的大小栏,且图表显示为瀑布图,如下图; 对项目字段选择自定义排序,自行排序如下图: 拖拽标签字段至图形属性下的颜色栏,瀑布图中的矩形块颜色即按照增加、减少、汇总来显示,如下图: 3、效果展示 调整矩形块、组件背景、标题栏等的颜色和字体,即可得到如下示例的效果: 高级图表三:人口金字塔人口金字塔图显示人口中各个年龄组的分布,通常用于此可视化类型的一种常见分布是按年龄列出的女性和男性人口,如下图: ...

October 14, 2019 · 1 min · jiezi

ibatis中批量插入更新删除数据的写法

微信公众号:51码农网专业编程问答社区www.51manong.com数据库是oracle1.批量插入数据: <insert id="insertData" parameterClass="java.util.List"> insert all <iterate conjunction=""> into tableA(custom,flag) values (#dataList[].custom#,#dataList[].flag#) </iterate> select * from dual</insert>2.批量删除数据 <delete id="insertData" parameterClass="java.util.List"> delete from tableA where custom in <iterate conjunction="," open="(" close=")"> #dataList[].custom# </iterate></delete>一次传入list的数据不要超过1000,用的是in2.批量更新数据3.批量更新数据 <update id="insertData" parameterClass="java.util.List"> update tableA set flag='1' where custom in <iterate conjunction="," open="(" close=")"> #dataList[].custom# </iterate></update>

October 13, 2019 · 1 min · jiezi

oracle中undo表空间的理解

微信公众号:51码农网专业编程问答社区www.51manong.comOracle中,undo是保存记录的前镜像的。从原理上说。undo有四个作用1.回顾事物2.一致性读3.事物恢复4.闪回查询例如你删除一张表的时候,delete from table;就会产生undo。而且产生的undo容量会比你删除表的容量多7倍多。比如你现在表容量150MB。你执行删除全表数据的操作。产生的undo容量大致会达到1128MB。产生的undo容量为啥会比表容量多出了很多?多出的又存储的是什么信息?undo容量,除了考虑表大小,还有表上索引的总大小,是否存在触发器,物化试图日志,另外还看数据库级的supplemental log是否打开。undo记录还有一些额外成本,比如rowid,scn等信息。 微信公众号:51码农网

October 13, 2019 · 1 min · jiezi

蚂蚁金服自研数据库拿下世界第一性能超Oracle-100

10月4日消息 据中新网报道,10月2日,国际事务处理性能委员会(Transaction Processing Performance Council,简称TPC)公布了数据库最新性能测试结果,阿里巴巴关联公司蚂蚁金服自主研发的数据库位列第一位。 蚂蚁金服自主研发的数据库OceanBase打破数据库基准性能测试的世界记录,成绩是前世界记录保持者、老牌巨头甲骨文(Oracle)的两倍。数据库领域最权威的国际机构国际事务处理性能委员会(TPC,Transaction Processing Performance Council)在官网发表了这一最新结果。

October 4, 2019 · 1 min · jiezi

JDBC-调用-Oracle-Collections

使用 Java 通过数据库连接(JDBC)访问和操作 Oracle 自定义类型.大致就是这个网页中说的. https://docs.oracle.com/cd/E1... Oracle中支持在数据库中定义数据格式.(嵌套数据格式)在JAVA中调用时,传入相应格式的数据即可.找了下没找到对应资料,记录下.只是找到了一种简单的可行方案,因为有人专门写PLSQL来处理逻辑,所以将逻辑全部放在数据库中处理,JAVA这边弄点简单代码传数据就行. CREATE TYPE TDC_SUPPLIER_ADDR AS OBJECT (ADDRESS VARCHAR2(240),ADDRESS_ID NUMBER); CREATE TYPE TDC_SUPPLIER_ADDR_L AS TABLE OF TDC_SUPPLIER_ADDR; CREATE TYPE TDC_SUPPLIER AS OBJECT (NAME VARCHAR2(50),SUPPLIER_ID NUMBER, ADDR TDC_SUPPLIER_ADDR_L); CREATE TABLE TDC_TEST (TEXT VARCHAR2(2000)); CREATE OR REPLACE PACKAGE TDC_TEST_PKG IS PROCEDURE CREATE_SUPPLIER ( SUP_OBJ IN TDC_SUPPLIER);END TDC_TEST_PKG; CREATE OR REPLACE PACKAGE BODY TDC_TEST_PKG IS PROCEDURE CREATE_SUPPLIER ( SUP_OBJ IN TDC_SUPPLIER) IS BEGIN INSERT INTO TDC_TEST VALUES (SUP_OBJ.NAME); COMMIT; END CREATE_SUPPLIER;END TDC_TEST_PKG;上面的SQL是个简单的例子.声明了一个数据类型TDC_SUPPLIER, 在 call CREATE_SUPPLIER 时需要传入TDC_SUPPLIER类型数据作为参数.其中将TDC_SUPPLIER转换为json,大致是下面的格式 ...

September 8, 2019 · 2 min · jiezi

使用sql获取各数据库MySQLPostgreSQLOracleMsSQL的表结构

通常我们提到数据库表结构的时候,比较关心的几个属性:字段名称、类型、长度、是否主键、是否自增、是否为空、默认值、备注。那么,使用SQL语句获取这些属性,在各主流数据库下是什么样的呢?MySQL数据库作为时下最流行的数据库,MySQL的获取SQL是最简单的。一般我们用下面一行语句就能搞定: SHOW FULL COLUMNS FROM xxx;当然,也可以用MySQL自带的数据库information_schema中的表,例如:columns等查询更全的信息。 PostgreSQL数据库使用其两个最重要的Schema(information_schema、pg_catalog)下表,进行关联查询,获取常用属性。 SELECT d.column_name AS "Field", d.udt_name AS "Type", COALESCE(d.character_maximum_length, d.numeric_precision, d.datetime_precision) AS "Length", CASE WHEN t.conname IS NOT NULL THEN 'PRI' ELSE '' END AS "Key", CASE WHEN s.extra IS NOT NULL THEN 'auto_increment' ELSE '' END "Extra", d.is_nullable AS "Null", f.adsrc AS "Default", col_description(a.attrelid, a.attnum) AS "Comment" FROM information_schema.columns d, pg_class c, pg_attribute a LEFT JOIN pg_constraint t ON (a.attrelid = t.conrelid AND t.contype = 'p' AND a.attnum = t.conkey[1]) LEFT JOIN pg_attrdef f ON (a.attrelid = f.adrelid AND a.attnum = f.adnum) LEFT JOIN (SELECT 'nextval(''' || c.relname || '''::regclass)' AS extra FROM pg_class c WHERE c.relkind = 'S') s ON f.adsrc = s.extraWHERE a.attrelid = c.oidAND a.attnum > 0AND c.relname = d.table_nameAND d.column_name = a.attnameAND c.relname = 'xxx'ORDER BY a.attnum;Oracle数据库系统表:user_col_comments能提供大部分信息,只有:备注(Comment)、主键(Key)需要关联其他表进行获取。 ...

August 28, 2019 · 2 min · jiezi

SQLServerMySQLOracle三种数据库的优缺点总结

一、SQLServer优点易用性、适合分布式组织的可伸缩性;用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等;为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势。从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要。作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序、为企业赢得核心竞争优势打开了胜利之门;作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLServer是一个具备完全Web支持的数据库产品,提供了对可扩展标记语言 (XML)的核心支持以及在Internet上和防火墙外进行查询的能力;缺点开放性 :SQL Server 只能windows上运行没有丝毫开放性操作系统系统稳定对数据库十分重要Windows9X系列产品偏重于桌面应用NT server只适合小型企业而且windows平台靠性安全性和伸缩性非常有限象unix样久经考验尤其处理大数据库;伸缩性并行性 :SQL server 并行实施和共存模型并成熟难处理日益增多用户数和数据卷伸缩性有限;安全性:没有获得任何安全证书。性能 :SQL Server 多用户时性能佳 ;客户端支持及应用模式:客户端支持及应用模式。只支持C/S模式,SQL Server C/S结构只支持windows客户用ADO、DAO、OLEDB、ODBC连接;使用风险:SQL server 完全重写代码经历了长期测试断延迟许多功能需要时间来证明并十分兼容;二、MySQL优点体积小、速度快、总体拥有成本低,开源;支持多种操作系统;是开源数据库,提供的接口支持多种语言连接操作;MySQL的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的mysql能很容易充分利用CPU;MySql有一个非常灵活而且安全的权限和口令系统。当客户与MySql服务器连接时,他们之间所有的口令传送被加密,而且MySql支持主机认证;支持ODBC for Windows, 支持所有的ODBC 2.5函数和其他许多函数, 可以用Access连接MySql服务器, 使得应用被扩展;支持大型的数据库, 可以方便地支持上千万条记录的数据库。作为一个开放源代码的数据库,可以针对不同的应用进行相应的修改。拥有一个非常快速而且稳定的基于线程的内存分配系统,可以持续使用面不必担心其稳定性;MySQL同时提供高度多样性,能够提供很多不同的使用者介面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言介面,例如C+,Perl,Java,PHP,以及Python。你可以使用事先包装好的客户端,或者干脆自己写一个合适的应用程序。MySQL可用于Unix,Windows,以及OS/2等平台,因此它可以用在个人电脑或者是服务器上;缺点不支持热备份;MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变;没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制;MySQL的价格随平台和安装方式变化。Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或linux 自行安装 免费 、Unix或Linux 第三方安装 收费;三、Oracle优点开放性:Oracle 能所有主流平台上运行(包括 windows)完全支持所有工业标准采用完全开放策略使客户选择适合解决方案对开发商全力支持;可伸缩性,并行性:oracle 并行服务器通过使组结点共享同簇工作来扩展windownt能力提供高用性和高伸缩性簇解决方案windowsNT能满足需要用户把数据库移UNIXOracle并行服务器对各种UNIX平台集群机制都有着相当高集成度;安全性:获得最高认证级别的ISO标准认证;性能:Oracle 性能高 保持开放平台下TPC-D和TPC-C世界记录;客户端支持及应用模式:Oracle 多层次网络计算支持多种工业标准用ODBC、JDBC、OCI等网络客户连接;使用风险:Oracle 长时间开发经验完全向下兼容得广泛应用地风险低缺点对硬件的要求很高;价格比较昂贵;管理维护麻烦一些;操作比较复杂,需要技术含量较高;推荐阅读1、今天,一周年,感谢有你 2、Linux下MySQL基本操作 3、我必须得告诉大家的MySQL优化原理 4、千行 MySQL 详细学习笔记,你收藏了吗? 5、记住,永远不要在 Mysql 中使用 “utf8” 6、一次超有意思的 SQL 优化经历! 7、Oracle SQL 性能优化40条,必看! 8、Oracle数据库环境搭建 9、Oracle客户端PLSQL的使用说明 10、Linux环境下Oracle数据库常用命令 欢迎关注微信公众号杰哥的IT之旅

August 20, 2019 · 1 min · jiezi

硬货Oracle数据库出现问题时这十个脚本帮你快速定位原因

“喂,李总您好!” “小张,快点看看ERP数据库,应用又打不开了!” “好的,马上。” 小张从黑色背包拿出电脑,连上手机热点就开始检查,刚连上数据库,电话铃声又响起来了..... 这样的场景对于Oracle DBA来说太熟悉了,只要应用一出问题,不论何时,不论何地,总是第一个接到电话,严重情况下会是一轮电话轰炸。 新手和专家之间遇到此类问题,首先是心态,新手遇到问题心里慌,不知从何下手,胆小粗心,专家因为经验丰富,往往沉着冷静、运筹帷幄、抽丝剥茧、胆大心细,但是经验这东西就跟吃过的盐、走过的桥一样,必须亲自多做、多学才能获得。而另外一个非常重要的就是诊断思路和辅助脚本,本文讲述各种场景下的通用处理思路,分享用到的一些脚本,帮助大家快速定位问题并解决,减少业务的中断事件,早日成为专家,升职加薪,迎娶... >>>>查看操作系统负载 登上数据库服务器后,第一个就是通过系统命令确认下CPU、内存、I/O是否异常,每个系统的命令不一样,常见的有top、topas、vmstat、iostat。 >>>>查看等待事件 第二步就是连到数据库查看活动的等待事件,这是监控、巡检、诊断数据库最基本的手段,通常81%的问题都可以通过等待事件初步定为原因,它是数据库运行情况最直接的体现,如下脚本是查看每个等待事件的个数、等待时长,并排除了一些常见的IDLE等待事件。 --墨天轮 wait_event col event for a45 SELECT inst_id,EVENT, SUM(DECODE(WAIT_TIME, 0, 0, 1)) "Prev", SUM(DECODE(WAIT_TIME, 0, 1, 0)) "Curr", COUNT(*) "Tot" , sum(SECONDS_IN_WAIT) SECONDS_IN_WAIT FROM GV$SESSION_WAITWHERE event NOT IN ('smon timer','pmon timer','rdbms ipc message','SQL*Net message from client','gcs remote message') AND event NOT LIKE '%idle%' AND event NOT LIKE '%Idle%' AND event NOT LIKE '%Streams AQ%' GROUP BY inst_id,EVENT ORDER BY 1,5 desc;这里就需要掌握一些常见异常等待事件的原因,并形成条件反射,比如library cache lock、read by other session、row cache lock、buffer busy waits、latch:shared pool、gc buffer busy、cursor: pin S on X、direct path read、log file sync、enq: TX - index contention、PX Deq Credit: send blkd、latch free、enq: TX - row lock contention等等,如果异常等待事件的个数和等待时间很长,那么排查原因的入口就在这里。 ...

July 15, 2019 · 3 min · jiezi

开发进阶篇书写高效的SQL语句

调查显示,SQL是目前第二大编程语言,自诞生以来40多年一直发挥着重要的作用,有50%的开发者都在使用SQL。虽然使用非常广泛,但是SQL的质量水平却并不令人满意。 根据经验,80%的数据库问题是由于SQL引起的,而80%的SQL问题来自于20%的SQL语句,在一些高并发高负载的系统中,由于一条SQL的性能问题导致数据库整体出现异常的情况屡见不鲜。 那么,面对SQL引起的数据库问题,我们又该如何解决呢? 虽然我们都知道问题,但是该如何解决?如果你对SQL有一些了解,想必也就知道,大体有四种能力是必备的: 1.充分理解新特性的功能以及其适用场景 2.将数据整理处理作为思路 3.从一开始就考虑好这个SQL的执行计划,驱动表是谁,采用何种JOIN方式连接到被驱动表 4.严格过滤不必要的数据 可见,如果你能够拥有以上四种能力,必然可以解决SQL引起的数据库问题,也必然会成为SOL语句编写市场上极具价值、抢手的存在。 但是此刻,也许你会有个疑惑:我要如何才能拥有这些能力呢? 这也正是我们今天想要给你的答案:其实墨天轮里面一门课程可以帮你完美锻炼这四项能力,成为真正能通过SQL语句编写解决实际业务问题的稀缺人才。 这门课程就是——ACOUG 核心专家、Oracle ACE 总监,号称"Oracle 的百科全书"——杨廷琨老师主讲的《高效SQL语句编写》 至今,这门课程已经全部完结,饱受好评,想要得到解决问题的你,快戳下方链接领取99元优惠券,免费的观看学习吧(注:本课程原价99,优惠券99,课程完全免费哦~) 优惠券:https://cs.enmotech.com/invit... 领完优惠券快戳课程链接学习吧~ 课程链接:https://cs.enmotech.com/course/6接下来,我们再详细介绍下这门《高效SQL语句编写》课程凭什么可以帮你解决SQL引起的数据库问题 第一,这门课程足够系统和深入,能够让你全面的了解到SQL语句编写引起的问题,从而重视SQL的执行效率。 第二,这门课程中有众多真实需求和案例,结合理论逐一找到完美解决方案,项目组可以直接使用。 一名合格的开发人员,要成为更有价值的存在,仅仅只有单点技能,是远远不够的,你需要了解的足够全面,小到数据处理,大到执行计划的制定,你需要了解的足够全面。 基于此,帮助更多的开发人员解决SQL引起的数据库问题是《高效SQL语句编写》课程的初衷。 所以,这门课程几乎涵盖了SQL引起的数据库问题的全部知识点。(下面放上课程大纲供你参考) 第三,专业的主讲人老师,在《高效SQL语句编写》课程中,主讲老师是ACOUG 核心专家、Oracle ACE 总监,号称"Oracle 的百科全书"——杨廷琨老师 杨廷琨先生是中国地区的第一批Oracle ACE总监,也是 ITPUB 论坛上最活跃的分享者之一,他日均一篇的博客更新坚持了10年之久,影响了很多Oracle DBA和开发者的学习和成长,他在SQL开发方向的积累丰富,对于性能和效率具有深刻理解。 适用人群:需要解决SQL引起的数据库问题,从而完成从低阶到高阶的跃迁的开发人员。 还有重要的一点,就是使用优惠券观看学习可立减99元!此课程原价99,使用优惠券就是免费!数量有限(仅100张),先到先得!(优惠券使用方式:扫描下方二维码——进入优惠券页面——输入手机号,获取优惠券——注册登录——点击购买——购买成功——学习观看)以上,介绍得差不多了,抢完优惠券的话,赶快戳下方链接观看学习吧! 学习地址:https://cs.enmotech.com/course/6

July 9, 2019 · 1 min · jiezi

问一个关于数据库的问题

一个windows本地服务器。一个阿里云的linux服务器。操作过程:我用了expdp的到出手法,从windows服务器导出了一个dmp文件。 把这个文件复制到linux服务器上面。导入进去。如命名为oms_ms_cs(含有各类触发器)。为什么会跑到原有的NIU_OMS上的触发器上去? 此处出错是oracle数据库

July 5, 2019 · 1 min · jiezi

用户故事地图-User-Story-Map

User Story Mapping 是Jeff Patton倡导的一项技术。它为我们提供了一种将整个产品或服务设想为用户完成的一系列任务的方法。 从纯粹的实际角度来说,它涉及构建一个用户故事网格,这些故事在标题下排列,代表用户在产品中的体验。这可以通过团队成员之间的一系列对话迭代完成。因此,第一次尝试可能看起来像这样,用户故事按其各自的功能分组(有些可能称这些顶级功能'Epics')。 在这里,我们将产品的高级功能(骨干,如果您愿意)分解为组件用户故事。很容易看出每个用户故事属于哪个功能,因此每个用户故事都在整个产品的上下文中呈现,而不仅仅是列表中的项目。 虽然这种方法有助于组织我们的想法 - 它已经比简单的故事列表更具信息性 - 它实际上还没有构成故事地图,因为它没有考虑用户旅程的流程。 开发故事地图让我们通过想象一个简单的电子商务网站让我们的例子更加具体,产品愿景板提到了三个特征: 产品页面产品搜索查看最初的故事地图可能如下所示: 我们有“产品页面”功能,其中包含与下面列出的功能相关的用户故事,同样适用于“产品搜索”和“结帐”功能。但是这些故事还没有特别好地发展,并且没有迹象表明每个故事的重要性。 例如,用户需要在订购之前阅读产品说明,但这是在他们阅读评论之前或之后发生的吗?哪个为用户提供更多价值? 在进行了更多的研究并收集了来自利益相关者的更多意见之后,另一次迭代可能看起来像这样。 请注意,我们通过将其中的一些细分为更小的部分来改进我们的用户故事,我们引入了一个新的维度,故事按照用户旅程中的位置排列,我们已经开始安排最高的我们地图顶部附近的优先故事 在这个方向上进一步发展,很容易看出我们最终是如何得出一张地图,指出在前几个版本中需要包含哪些故事。 建立故事地图 (Visual Paradigm)故事地图是一个用于需求收集的4级层次结构。故事地图从不同来源(即积压)收集的用户特征集合开始,这些用户特征将通过执行某些任务作为活动来实现。这些任务可以转换为史诗,然后转换为软件开发的用户故事。 故事地图结构:用于实现目标的用户功能(待办事项记录)>活动>任务>史诗>故事 规划故事地图的步骤为了促进敏捷开发,Story Map可以接收从不同来源识别的用户功能。如上所述,它可能是来自EA合同的要求,来自项目管理计划的工作包或特殊分析(例如 - 是和将来的分析),使用图中的用例与敏捷软件开发集成等等。 假设我们已经从多个不同的来源累积了故事地图积压中的用户特征列表。通过执行某些任务,将实现用户功能作为活动。每个任务都可以进一步分解为几个史诗(更大的用户故事)。每个史诗都包含一个用户故事列表,这些用户故事被分解为适合适合sprint迭代的大小。以下是规划故事地图所涉及的步骤: 将用户要素从左向右拖动到地图的顶行。地图顶行中的每个功能都是呼叫用户活动。 创建完成活动所需的许多步骤,称为用户任务。 这些用户任务中的每一个都可以分解为多个史诗。 在史诗下,可以定义用户故事列表,其大小适合放入sprint。 请注意:我们可以考虑从左到右安排实施的优先级,从顶部到底部安排用户故事。 相关链接敏捷用户故事映射工具有效的用户故事工具

July 3, 2019 · 1 min · jiezi

DBASK问答集萃第三期

引言近期我们在DBASK小程序增加了众多专栏,其中包括盖国强、杨廷琨、罗海雄、张乐奕、黄廷忠、崔华、熊军、李真旭、何剑敏等专家栏目,还有2019年6月SCN兼容性问题、XTTS、备份恢复等技术专栏,另外蚂蚁金服OceanBase入驻小程序。欢迎大家阅读分享小程序中的专题栏目。 问答集萃接下来,我们分享本期整理出的问题和诊断总结,供大家参考学习,详细的诊断分析过程可以通过标题链接跳转到小程序中查看。 问题一、RMAN-20039: format requires %c when duplexing 备份时报错: RMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03009: failure of backup commandRMAN-20039: format requires %c when duplexing备份数据文件不加%C就会报错,加%C有两份一样的? ----备份脚本run{ allocate channel c1 device type disk;allocate channel c2 device type disk;allocate channel c3 device type disk;allocate channel c4 device type disk;crosscheck backup;sql 'alter system archive log current';backup spfile format '/bak/backup/spfile_%T_%s_%p_%c';#backup database format '/bak/backup/dbbk_0_%d_%t_%u_%s_%p';backup as compressed backupset incremental level 0 database format '/bak/backup/dbbk_0_%d_%t_%u_%s_%p';sql 'alter system archive log current';backup archivelog all format '/bak/backup/arc_%T_%s_%p_%c' delete all input;backup current controlfile format '/bak/backup/cntrl_%T_%s_%p_%c';crosscheck archivelog all;delete noprompt expired backup;delete noprompt obsolete;release channel c1;release channel c2;release channel c3;release channel c4;}诊断结论:如果设置不冗余就不需要加c%,否则就会出现你的报错。如果设置了冗余必须加%c,那么也就会产生相应的备份片。 ...

July 3, 2019 · 3 min · jiezi

DBA职业发展之路去IOE等挑战之下DBA将何去何从

开篇随着近些年来,开源、自动化、云化的兴起,DBA职业也正悄然发生一些变化。经常有朋友咨询我,职业发展规划;特别是近期Oracle的大幅裁员之后,针对DBA这一职业未来该如何发展?本文是个人对此问题的一些看法,仅供各位参考! 数据是核心 将DBA单词分解一下。其对应的 操作对象:数据操作介质:库操作角色:管理员这里的核心是数据,也是DBA这一角色最大的价值所在。他们最了解数据、最懂得数据的价值;因此DBA后续可发展的一些方向,也基本是与数据有关。 此外,对于数据要有更加宏观的认识,无论是企业的自有数据,还是外部获得;无论是关系数据,还是其他模式数据;无论是保存在数据库中,还是其他诸如日志等介质中,数据对企业都非常有价值,要将数据作为一种"资产"来管理。只有上升到这样的高度,数据相关岗位的价值也就凸显出来。 阶段不同,侧重不同 企业对数据应用水平不同,因而造成工作重心及岗位需求也有所不同。下面简单描述下各个层次: 层次一,是以数据库维护为主,常见表现是"救火队员"型。很多初创企业,都经历过这一过程。数据库维护基本靠人,随着运维体量的增加,需要线性增加人员。整体数据应用水平,基本处于简单、粗放型。层次二,仍是以数据库维护为主,但已形成较为完善的运维体系。除了基础运维之外,甚至可以考虑一些预防性的措施,提高整体的运维效益。这一阶段的体系化建设,往往是通过文档、运维平台等沉淀下来。数据库作为基础设施层,已可提供较好的数据存储、计算能力输出。但此阶段尚未从更高角度去考虑数据问题,仍仅限于运维层面。层次三,数据设计应用阶段,企业已不满足数据简单的"存取类"需求,而是从更高的应用角度,考虑如何提高整体数据应用水平。这个阶段会增加数据库架构、设计,加强业务端数据优化工作。表现为增加产品DBA的角色,加大数据库架构权重等。层次四,数据架构治理阶段,企业不单从某个应用、某条业务线去考虑数据问题,而是公司整体层面做数据的顶层设计。考虑建立专门的机构(如数据委员会)或岗位-首席数据官(CDO)。近些年来,颇为火热的"数据中台",正是为迎合这一需求而产生的。基础运维工作,繁琐枯燥 作为基础类的运维工作,数据库的要求是比较高的。上图简单罗列了部分工作,对DBA日常繁琐工作可见一斑。正是基于这点,平台化、自动化、云化的诉求,不断被提出。进而间接对DBA的能力提出了更高的要求。 DBA职能,向上进化 基于前面数据应用水平所谈到的,企业内部DBA也对应承担了几类职能。自下而上的是数据物理架构、逻辑架构和业务架构。公司内应用水平高低,也决定了DBA各类工作的比例侧重不同。随着公司数据应用水平的不断提高,DBA工作重心也应从下层逐步转向中上层。 数据物理架构,对应为"运维DBA",工作重心为基础架构的建设。数据逻辑架构,对应为"产品DBA",工作重心为数据库架构、架构设计及SQL质量问题。数据业务架构,对应为"数据架构师-DA",工作重心在于数据治理、管理类工作。DBA面临冲击不断 近些年来,DBA职位受到很大一些冲击,我摘其重要的几项说明下。 去IOE,阿里最早提出"去IOE"的叫法。它的提出,让人们第一次领悟到,企业的核心应用是可以不依赖于传统的国外大型商业数据库,进而提出了一种新的解决思路。开源与商业,企业发展阶段不同,对于开源还是商业软件的使用存在类似上图的收益/成本曲线。当发展到一定阶段时,是必须要考虑引入开源。企业要从技术战略角度出发,考虑这一问题。"四化",数据库基础运维工作,经历了从手工、脚本、工具、平台的发展阶段。其发展特点表现为"四化"(平台化、可视化、自动化、智能化)。这一发展方向也对DBA的技能要求产生了一些变化,特别是对研发的技能要求已成为必要条件。云,是未来的发展方向。从全球范围来看,云生态的数据库占比在8%,未来预计在3~5年内,会提升到20%~30%。这无疑是巨大的飞跃。对于DBA而言,云环境下的数据库工作有别于传统环境,需要从多方面去适应,工作重心也要有所调整。技术 OR 管理 DBA职业发展,向上面临的第一个选择就是发展方向,是走管理路线还是技术路线。上图给大家描述了两种不同方向的区别,个人可根据自己特质,对号入座。这里要避免一个误区,就是"以管理为上",这其实就是官本位思想的体现。不是每个人都适合管理路线,放在不恰当的位置上,对人的发展是一种摧残。 客观判断,承认上限 在明确了发展路线之后,就需要对自身的发展阶段有所判断。无论是技术还是管理,都存在这样一个进化理论,即越走向高级阶段,其淘汰率越高。要客观、理性地认识到自己所处的阶段。从上述比例也可以看出,能走到高阶职位的毕竟是少数。虽然可以通过一些方式(后面会谈到)做突破,但是仍然有较大概率无法取得既定目标。此时,要勇于承认这一点,调整自己的职业定位,谋求新的发展方向。 高度与广度 + 全局思维 取得职业发展突破,有两个小的建议。 高度与广度。在职业发展初期,需要有个快速成长的"原始积累期"。这里谈到的原始积累,不是财富,而是技术技能。要在某专一领域,尽量达到自己的技术高点。会存在某个点,你已经无法突破达到更高的高度时,要谨慎分析原因。如确实非主观原因,那么要坦然接受它。剩下来的技术发展,可考虑横向发展,即将自己打造成"T字型"人才。上面谈到的高点很重要,它会决定你的技术"视野"。全局思维。即不要仅仅从技术角度考虑问题,特别是达到一定高度之后,可更多地尝试从业务角度、人的角度考虑之前面临的问题,也许你就会有新的发现。全局思维,会有助于你发现原有发展阶段的瓶颈点,实现突破。DBA职业选择路线 前面讲了很多,那么DBA职业发展可考虑哪些方向呢?下面试图给出一些可能的选择。以下仅仅是本人根据自己所熟悉的领域给出的选择,不代表全部。 选择:数据库技术、数据库业务 -数据库技术。这是一个比较容易的选择,即在某数据库领域里不断精进自己,以达到一个更高的目标。职业定位是首席DBA、DBA专家等。如果考虑这个发展方向,建议考虑乙方或云厂商,因为他们对技术本身要求更高。甲方角色,受限于自身环境,一般很难有需要不断突破的技术氛围。 数据库业务。将数据库技术与公司业务相结合,突出在某业务领域的数据能力。这是需要在某行业打磨多年,充分了解其业务特点,不断抽象出其数据要求。这一方向可考虑行业的头部公司或者是专为某行业服务的ISV。选择:内核研发、数据库架构 -数据库内核研发,是相对"小众"的一类人才需求,一般只有大型企业/云厂商或数据库厂商会考虑设置。其专业性较强,人员素质要求也较高。建议选择高起点的一些企业,对个人长期职业发展有利。 数据库架构师,这是一个相对综合类的职位。"架构"的含义比较模糊,各企业对架构师角色的定位也各不相同。一般能考虑设置数据库架构师角色的企业,都是有一定规模,企业内数据应用比较复杂的情况。下面根据我所在公司的实际场景,尝试给出一个数据库架构师的技能图谱,供各位参考。一家之言:数据库架构师技能图谱 上图罗列对数据库架构师本身要求的十二项基本能力要求,各项能力的要求不同,我通过左侧的饼图比例大小予以说明。当然能符合全部要求的人,少之又少。公司可根据侧重,有所取舍。上述技能要求,可大致分为四类: -数据自身技能,如数据库、大数据、数据治理、数仓等 关联领域技能,如基础设施、云、容器等研发方向技能,如DevOps等综合技能类,如业务思维、软技能(如沟通技巧)选择:数据架构、数据产品 -数据架构,不同于"数据库架构"。数据架构,更强调于顶层设计,需要对数据有全局的思维,帮助企业做好整体数据规划设计工作。它不在拘泥于某种技术,而是着眼于数据整合、安全、共享、价值、资产等问题。 数据产品,也是一种综合类职位。需要对技术本身有一定深入的了解,但更强调其技术广度。此外需要有产品化思维,能将业务需求,转换为产品功能设计。选择:解决方案架构、数据库布道者 -解决方案架构,往往是从"售前架构"、"技术顾问"等角色体现出来。其核心要点是具备一定技术能力的同时,还要有甲方思维,能够了解用户痛点,能从技术角度帮助客户解决现有问题。这里不光是销售自己的产品,更重要的是给客户带来价值。 数据库布道者,少数的选择,只针对有一定技术影响力的人员才可以考虑。是一种偏向于自由职业者的选择。选择:数据治理、数据仓库 -数据治理,是一项比较"浩大"的工程。随着企业对数据的重视程度越来越高,这一岗位也愈发重要起来。其强调几个关键过程域的活动,提升企业整体数据应用水平。右图中给出的DAMA的过程域图例,供大家参考。 数据仓库,是一个处于转型中的职位,传统的数仓做法,目前已不适应现代企业要求。但其核心的数据建模理论,还是具有指导意义的。因此各大互联网公司,均有自己颇有特色的数仓实践。可以考虑大厂或行业头部客户作为选择。选择:大数据、运维开发 -大数据,作为大"DBA"的范畴,大数据领域某种意义上将也是一种数据库。当然它有其自身的特殊性,表现为技术分散、变化快、没有统一标准、对研发能力有一定要求等。 DevOps,运维开发。适合有一定研发基础的DBA选择。选择:项目管理、技术管理 -项目管理,DBA是一个比较综合类的职位,在沟通、协调、组织方面,与项目管理有相似在之处。因此,可以考虑转型做项目管理类职位。 技术管理,DBA职位的涉及的技术领域较广,如稍加留意是可以涉猎很多关联领域。这与技术管理类对技能诉求,有一定相似。再加上其对软技能的要求,是可以考虑将技术管理作为发展方向。在圈子中也发现不过高级管理人员,都是DBA出身,不无一定道理。写在最后 面对一个充满不确定性的未来,唯一能确定的就是变化。让我们拥抱变化,努力改变今天的自己! 内容来源:韩锋老师于ACMUG沙龙(北京站)的分享,首发公众号-韩锋频道,欢迎关注。宜信技术学院

July 3, 2019 · 1 min · jiezi

Oracle-GoldenGateogg安装经验大汇总采坑总结绝对干货

一下是安装ogg过程中遇到的问题和解决办法,绝对良心干货,抽空会写更详细的安装教程。更多精彩内容请点击 OGG-00685 begin time prior to oldest log in log historyhttps://blog.csdn.net/kiwi_ki... goldengate 故障及解决方法汇总https://blog.csdn.net/amethys... oracle 手册https://docs.oracle.com/golde...https://docs.oracle.com/golde... (EXT.prm) line 13: Parsing error, [convertucs2clobs] is obsolete.expdp/impdp中parfile参数使用http://blog.itpub.net/2683912... window 注意 导入导出导入expdp parfile=D:appqingmiaokejiadminorcladumpexpdp_zzbs.par PARALLEL=8 flashback_scn=1438905 登录用户必须是dba F:appqingmiaokejiadminorcldpdump 导出 impdp qingmiaokeji/qingmiaokeji REMAP_SCHEMA=qingmiaokeji:qingmiaokeji REMAP_TABLESPACE=qingmiaokeji:qingmiaokeji_data dumpfile= expdp_zzbs_%U.dmp virtual box centos7 配置 上网https://blog.csdn.net/rcjjian...https://blog.csdn.net/teisite... centos7 安装oraclehttps://www.cnblogs.com/liugu... 修改字符集https://www.cnblogs.com/gaoyu... 错误整理: ORA-12705: Cannot access NLS data files or invalid environment specifiedhttps://blog.csdn.net/wolfcho... 在Windows系统设置goldengate服务随系统启动https://blog.csdn.net/qq_4292...GoldenGate 配置extract,replicat进程自启动https://www.cnblogs.com/xqzt/... 删除10天前的trail文件Windows平台使用RMAN命令自动删除Oracle过期归档日志的方法https://blog.csdn.net/xiaolon... Windows计划任务设置,定时执行指定脚本https://jingyan.baidu.com/art... ogg trail文件版本问题,重置https://community.oracle.com/...https://www.2cto.com/database...https://blog.csdn.net/orion61...ALTER EXTRACT EPMP ETROLLOVER ...

July 1, 2019 · 1 min · jiezi

Linux下如何确定进程是否使用了大内存

如为oracle配置了大内存,重启oracle实例可在alter告警日志中观察是否实例使用了大内存,但是否有其他方式确定某个进程使用了大内存呢,下面以oracle为例来说明如何从系统侧获知进程是否使用了大内存。 如oracle sga配置为200G: SQL> show parameter sgasga_target big integer 200G系统配置大内存情况: % cat /etc/sysctl.conf vm.nr_hugepages = 110080 vm.hugetlb_shm_group = 5001当前大内存使用情况:(110080-7166)*2/1024=201G。 % grep HugePages_ /proc/meminfo HugePages_Total: 110080HugePages_Free: 7166HugePages_Rsvd: 0HugePages_Surp: 0系统有如下数据库,进程如下所示: % ps -ef|grep pmon_grid 111896 1 0 Jan14 ? 00:00:34 asm_pmon_+ASM1oracle 114732 1 0 Jan14 ? 00:00:54 ora_pmon_db1grid 248262 1 0 Jan14 ? 00:00:18 mdb_pmon_-MGMTDB那么,我们可使用如下命令或者进程使用的大内存情况: # db1实例使用了200G大内存:% grep -B 11 'KernelPageSize: 2048 kB' /proc/114732/smaps \ | grep "^Size:" | awk 'BEGIN{sum=0}{sum+=$2}END{print "gb: "sum/1024/1024}'gb: 200.002# MGMTDB实例使用了1G大内存:% grep -B 11 'KernelPageSize: 2048 kB' /proc/248262/smaps \ | grep "^Size:" | awk 'BEGIN{sum=0}{sum+=$2}END{print "gb: "sum/1024/1024}'gb: 1.00195

June 28, 2019 · 1 min · jiezi

更新墨天轮v196发布

发布DBDOC方案文档在线免费浏览,拷贝导航栏、控制台新增方案文档入口技术专家可上传方案文档注册用户可通过墨值下载文档 活动:首页活动发布活动日历,可方便查看当月活动和往期活动活动样式调整,更改了些页面适配问题将线上活动和线下活动图标进行了区分个人信息增加职位,方便活动报名预填活动议程显示嘉宾名称直播页面增加回放入口直播聊天室支持多通道直播支持导播台,可加入主持人环节或者多人同时直播 DBASK:开放技术专家申请,以及自主订阅功能开放ORA错误快速查询在问题详情增加知识库检索功能小程序精选中将公众号文章栏目并移到首屏调整小程序公众号显示图标小程序可后台新增管理公众号修复小程序生成图片分享公众号名称被截断问题 墨值:控制台增加墨值标识,用户可查看个人墨值开放墨值详情页面,查看墨值变化情况用户可通过分享微博、微信、带来新用户获得墨值 其他调整:课程增加级别和常用筛选项,砍价页面加入讲师职位解决部分火狐浏览器不能下载的问题elementUI版本升级工具、文档和书籍新增tag标签,可进行通过tag筛选用户头像模块优化解决微信分享可能为空的情况智能巡检名称上增加跳转链接发布MyData 1.5输入不存在ID访问时,给出相关报错提示修改订单显示交付状态问题,并增加过期状态 如果您对墨天轮有任何建议和疑问,欢迎大家反馈给我们,平台管理员微信:emcs007。

June 24, 2019 · 1 min · jiezi

DBASK问答集萃

引言 近期我们对DBASK小程序进行了升级,UI交互做了重大优化调整,对注册用户开放知识库全文检索功能,引入数据和云公众号文章,提问时自动关联知识库已知问题,专栏可生成图片分享给好友,欢迎大家通过微信搜索DBASK体验。 问答集萃 接下来,我们分享本期整理出的问题和诊断总结,供大家参考学习,详细的诊断分析过程可以通过标题链接跳转到小程序中查看。 问题一、数据库夯ORA-00494: enqueue [CF] held for too longlistener不能访问,重启lsrnctl restart 无效,最后操作系统重启后正常,请帮忙分析下原因。2019.01.30 02:41接到电话,反映不能使用,erp有画面报警;我发现db不能连接,lsnr 不能服务了。查询日志发现: Wed Jan 30 01:02:02 China Standard Time 2019 ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 4688'waited for 'direct path read', seq_num: 10340for 'rdbms ipc message' count=1 wait_time=3.009785 secDB: direct path read 这个值超时。2019-01-30 00:50:24时,有锁出现 :sql::DELETE FROM XXX WHERE XXX<=TO_CHAR(SYSDATE-30,'YYYYMMDD')||' 0000000' AND ROWNUM<1001有大量锁表:XXX,接着有XXXX表,用户FTRPT/sqlplus.exe_程序,XXXXX,XXXXX,一些job等进程锁,越来越多!造成连锁反映!详细日志如下: Wed Jan 30 01:02:02 China Standard Time 2019Errors in file d:\oracle\product\10.2.0\admin\\bdump\_mmon_4704.trc:ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 4688'Wed Jan 30 01:02:02 China Standard Time 2019System State dumped to trace file d:\oracle\product\10.2.0\admin\\bdump\_mmon_4704.trcKilling enqueue blocker (pid=4688) on resource CF-00000000-00000000by killing session 162.1Killing enqueue blocker (pid=4688) on resource CF-00000000-00000000by terminating the processMMON: terminating instance due to error 2103Wed Jan 30 01:12:05 China Standard Time 2019USER: terminating instance due to error 1092Wed Jan 30 01:12:05 China Standard Time 2019...省略诊断结论:表象是控制文件的enq,最终锁定到根源是闪回区清理进程RVWR,清空闪回区问题解决。 ...

June 24, 2019 · 2 min · jiezi

墨天轮DBASK技术专家邀请函

各位数据库管理员、工程师们: 大家好,感谢大家一直以来对墨天轮DBASK的支持。DBASK 是一个开放、互助、便捷的数据库问答社区。在遇到任何数据库疑难杂症都可在DBASK上提问,平台认证的技术专家免费在线解答,最后归档沉淀为一个开放的知识库。 最近注意到Oracle官方文档中部分视图已经没有了说明,MOS上很多文档也隐藏了起来,开源公司不断被资本收购,但是我们始终向往构建一个开放开源、互帮互助的社区环境。 现在诚挚邀请您成为DBASK的技术专家,与我们一起讨论交流回复数据库相关问题,创建一个开放互助的数据库技术社区。 另外,近几年来,TiDB、达梦、巨杉等国产数据库也在不断成长,砥砺前行,还有阿里、华为等云上数据库作为新兴力量的加入,相信未来国产数据库一定会大有作为。另外,我们也会陆续在DBASK中开放国产数据库的专区,特别欢迎国产数据库相关的专家入驻DBASK,为国产数据库添砖加瓦! 专家权利:a.可以看到平台上所有的问题,参与讨论或者学习b.身份象征:平台标注技术专家的标识c.定期邀请您参加我们的线下专家交流会d.赠送技术嘉年华等大会门票、文化衫、书籍e.在 DBASK上回答问题、上传技术文档等可以获得墨值,墨值可用于兑换话费、京东卡等等 (PS:成为专家后自动赠送50墨值)。 DBASK小程序: 随着用户的不断增多,为了用户使用更方便,DBASK发布了微信小程序。小程序的发布可以让大家随时随地提问,专家也可在小程序内即时回复,减少了提问的门槛,加快问题交互的流程。另外可以在微信小程序中浏览知识库,方便查找学习相关问题。 DBASK常驻专家团下面是墨天轮DBASK常驻专家团队(其中囊括了国内IT服务商中绝大部分的Oracle ACE和Oracle ACE总监级别的技术专家)。我们特别欢迎数据库管理员、工程师们入驻DBASK,为墨天轮DBASK专家团队注入新鲜的血液。 如何成为DBASK技术专家?网页登录DBASK:https://cs.enmotech.com/issue,点击右上角【申请成为专家】。即可加入墨天轮DBASK专家团队!(PS:审核通过后须重新登录)

June 18, 2019 · 1 min · jiezi

Oracle应用迁移到AnalyticDB-for-PostgreSQL指导

AnalyticDB for PostgreSQL(简称:ADB for PG)对Oracle语法有着较好的兼容,本文介绍如何将Oracle应用迁移到AnalyticDB for PostgreSQL。 1 PL/SQLPL/SQL(Procedural Language/SQL)是一种过程化的SQL语言,是Oracle对SQL语句的拓展,使得SQL的使用可以具有一般编程语言的特点,因此,可以用来实现复杂的业务逻辑。PL/SQL对应了ADB for PG中的PL/PGSQL 1.1PackageADB for PG的plpgsql不支持package,需要把package 转换成 schema,并package里面的所有procedure和 function转换成ADB for PG的function。例如: create or replace package pkg is …end;可以转换成: create schema pkg;Package定义的变量 procedure/function的局部变量保持不变,全局变量在ADB for PG中可以使用临时表进行保存。详见1.4.5节。Package初始化块 如果可以删掉,就删掉,删不掉的话,可以使用function封装,在需要的时候主动调用该function。Package 内定义的procedure/function Package 内定义的procedure和function 转成adb for pg的function,并把function 定义到package对应的schema内。例如,有一个Package名为pkg中有如下函数:FUNCTION test_func (args int) RETURN int is var number := 10;BEGIN… … END;转换成如下ADB for PG的function:CREATE OR REPLACE FUNCTION pkg. test_func(args int) RETURNS int AS $$ … … $$ LANGUAGE plpgsql;1.2 Procedure/function对于oracle的procedure和function,不论是package的还是全局的,都转换成adb for pg 的function。例如: ...

June 17, 2019 · 6 min · jiezi

那些年我们追过的定时调度

定时调度作为后端开发人员,我们总会遇到这样的业务场景:每周同步一批数据;每半个小时检查一遍服务器运行状况;每天早上八点给用户发送一份包含今日待办事项的邮件,等等。 这些场景中都离不开“定时器”,就像一个定好时间规则的闹钟,它会在指定时间触发,执行我们想要定义的调度任务。那么我们今天就来数一下,那些年我们用过的“定时调度”。 1.job (oracle)从刚工作就一直使用oracle数据库,最早接触的定时任务就是oracle数据库的job。job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 而且oracle重新启动后,job会继续运行,不用重新启动。而且job的机制非常完备,可以查询相关的表或视图,查询job的定时规则和执行情况。缺点是作为oracle数据库层面的工具,自定义功能扩展,二次开发的难度比较大。 1.1 创建job 1.2 删除job 1.3 查询job2.crontab (linux)crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。大部分linux系统默认都安装了cron,可以检查一下。 crontab基本操作命令 crontab表达式格式 3.Timer和ScheduledExecutorService (java)Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。 TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。TimerTask类是一个抽象类,由Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()方法,该方法用于执行相应计时器任务要执行的操作。因此每一个具体的任务类都必须继承TimerTask,然后重写run()方法。 另外它还有两个非抽象的方法 当然,一般使用Timer的比较少,因为它的缺点比较明显: 1.单线程,当多个timer同时运行时,会等上一个执行完成,再执行下一个。2.Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止。 所以一般使用ScheduledExecutorService替代Timer。 ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 4.SpringTask (spring)Timer和ScheduledExecutorService都是属于jdk层面上实现定时调度的类,功能还不足以让我们满意,那么现在介绍一个比较完善的定时调度工具 - SpringTask,是Spring提供的,支持注解和配置文件形式,支持crontab表达式,使用简单但功能强大。我个人非常喜欢SpringTask,仅仅是因为支持crontab表达式。 在springboot里面使用方式非常简单: 1.启动类添加开启定时调度的注解 @EnableScheduling2.在需要定时执行的方法上,增加注解 @Scheduled(cron ="crontab表达式") 默认的简单的使用步骤只有以上两步,但是SpringTask的默认使用方式也有一些不足: 1.默认线程池的poolsize为1,可以理解为Timer类似的单线程模式。无法动态修改crontab表达式,修改完只能重新部署后,才能生效。 问题1的解决方式,可以通过自定义 TaskExecutor来修改当前的线程池。问题2,则可以直接使用 threadPoolTaskScheduler类实现自定义的定时调度规则。 附解决两个问题的源码 TaskTimer.class 5.Quartz (其他产品)Quartz是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。它是一个功能强大、十分成熟的重量级产品,还支持负载均衡,实现分布式调度。 不过,对于Quartz的安装你要多花点功夫了,从数据库要建哪些表,到应用程序该如何部署。对于这样一个庞大的产品,本篇文章就不附上它的使用说明书了。 本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发,网址:www.madpecker.com,有需要的朋友欢迎试用、体验!本文为MadPecker团队技术人员编写,转载请标明出处

June 17, 2019 · 1 min · jiezi

ODI数据增量同步一

背景最近在项目上开始使用ODI,需求是要将一个库中的表同步到另一个库中,本是一个正常的需求,但后面又续了一条:要使用增量同步,不能先将数据全部删除再插入数据这里可以使用ODI Studio的CDC方式进行同步数据,但CDC方式需要在表上建trigger,会对表的性能造成影响,所以该方案被否掉了,基于lastupdatedate的CDC同步虽然可以部分避免性能损失问题,但这种方式需要表中的lastupdatedate对任何数据更新都有相应变化,对于一些老系统难以实现,使用IKM SQL Incremental Update又没有删除操作,不能满足需求,所以方案确定为修改现有的知识模块,使其满足需求。1.如下是一个增量同步的Mapping 目标表集成类型为增量同步 加载知识模块为LKM SQL to Oracle 集成知识模块IKM Oracle Incremental Update 源表 目标表 将源表的数据修改 运行接口 可以看到,接口运行完成后,修改的数据正常同步,但删除的数据没有起作用,有些接口为了处理这种情况,就在运行时先将目标表数据全部删除掉,再插入数据 将DELETE ALL设置为true可以在接口插入数据前将数据全部删除,理论上选择TRUNCATE也行,但没有效果 增量同步接口运行过程如下 步骤详解 1.Drop work table接口同步数据时会在目标端数据库创建工作表,以C$_0开头,这条命令在知识模块中配置了忽略错误,所以出错也不会造成接口错误 drop table TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE purge 2.Create work table创建工作表,工作表字段基于源表 create table TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE( ID NUMBER NULL, HOST VARCHAR2(200) NULL, POST VARCHAR2(200) NULL, JMS_SERVICE_NAME VARCHAR2(200) NULL, JMS_NAME VARCHAR2(200) NULL, JMS_SERVICE_TARGET VARCHAR2(200) NULL, JMS_SERVICE_HEALTH VARCHAR2(200) NULL, MESSAGES_CURRENT_COUNT NUMBER NULL, MESSAGES_PENDING_COUNT NUMBER NULL, CONSUMERS_CURRENT_COUNT NUMBER NULL, CONSUMERS_HIGH_COUNT NUMBER NULL, CONSUMERS_TOTAL_COUNT NUMBER NULL, MESSAGES_HIGH_COUNT NUMBER NULL, MESSAGES_RECEIVED_COUNT NUMBER NULL, OBJECT_VERSION_NUMBER NUMBER NULL, CREATION_DATE DATE NULL, CREATED_BY VARCHAR2(200) NULL, LAST_UPDATE_DATE DATE NULL, LAST_UPDATED_BY VARCHAR2(200) NULL, DATA_STATUS VARCHAR2(200) NULL)NOLOGGING 3.Load data读取源表的数据,并插入到工作表中 ...

June 11, 2019 · 7 min · jiezi

即插即用基于阿里云Ganos快速构建云上开源GIS方案

对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定、廉价、实用的GIS解决方案。Ganos是阿里云自研时空基础设施(PaaS层)的核心引擎,该引擎整合了云上异构计算并行加速、OSS大规模存储等基础设施能力,上层与RDS PostgresSQL数据库、POLARDB for PG/Oracle云原生数据库、HBase大数据等融合,为云计算基础产品提供了免费但专业级的时空数据存储、查询与分析计算能力。本文主要介绍如何将Ganos作为数据源与GeoServer、uDig、QGIS等最常用的开源GIS软件对接,为基于开源GIS应用方案选型提供支撑。 支持常用各大开源GIS软件因Ganos设计上充分兼容了PostGIS接口,因此理论上可以无缝对接支持PostGIS的各类软件生态。 选取部分常用开源GIS软件说明如下表所示: 开源GIS软件软件定位用途Ganos作用QGIS基于C++的桌面GIS数据的可视化、管理、编辑、分析以及印刷地图的制作,功能全面兼容postgis形式的数据源GeoserverGIS服务器软件发布地图数据,允许用户对特征数据进行更新、删除、插入操作,方便共享空间地理信息兼容postgis形式数据源uDig基于Java的桌面GIS桌面GIS及开发框架,对互联网GIS、网络地图服务器和网络功能服务器有特别的加强兼容postgis形式的数据源OpenJump基于Java的桌面 GIS内置了地图编辑、可视化,GIS空间分析等操作,并可以通过插件方式进行功能的定制或拓展兼容postgis形式的数据源MapNik基于Python/C++ 地图渲染引擎数据形式的地图通过一个样式表的定义渲染成位图格式提供 WMS等服务兼容postgis形式的数据源以上主要集中在GIS最为常用的几何对象(矢量)部分,需要注意的是,Ganos在除了兼容PostGIS能力外,其他栅格、DEM、点云、网络、轨迹等高级时空特性也能与这些软件打通。如有这方面的需求,可以直接通过文末联系方式获得支持。 简单连接配置,即插即用以下以QGIS、GeoServer、OpenJump、uDig为例,展示以阿里云PostgresSQL Ganos或POLARDB Ganos为数据源的对接与应用,其他基于PostGIS数据源驱动的开源3S软件等均类似,不再一一展开。首先,需要通过阿里云主页购买RDS PostgresSQL、POLARDB for PG或POLARDB for Oracle实例(见文末链接,其中POLARDB for PG/Oracle目前可免费申请公测),并通过SQL插入或shp2pgsql工具导入矢量数据。数据导入后,可以通过控制台自带的DMS工具查看所导入的数据: 接下来,可以基于Ganos数据源,采用开源GIS软件来执行各类操作。 (1)QGIS连接Ganos,可浏览、查看、编辑、分析Ganos中的空间数据。 (2)GeoServer连接Ganos,可以将矢量数据发布为WMS,WFS等服务,实现地理空间数据的快速共享应用。 (3)OpenJump连接Ganos ,可浏览、查看、编辑、分析Ganos中的空间数据。 (4)uDig连接Ganos ,可浏览、查看、编辑、分析Ganos中的空间数据。 不一样的底座,更强大能力通过兼容PostGIS接口,Ganos具备了几乎即插即用、快速生态兼容的能力,且所有兼容PostGIS的代码都无需改动。同时,Ganos通过与阿里云基础设施融合,提供比自建PG+PostGIS更高系统稳定性和可靠性、更强数据处理能力和更大数据处理规模,尤其在时空轨迹数据处理能力上,要比原生PostGIS提高50-100性能。后续Ganos将遵循OGC规范,适配更多数据种类,广泛支持包括开源和商业不同3S平台,逐步沉淀基础时空云计算能力到云计算基础平台,赋能ISV厂商,推动时空云计算作为数字化转型的基础引擎普惠到更多客户。 如何获取Ganos时空引擎Ganos已无缝嵌入于阿里云以下数据库产品中,您无需为时空数据管理支付额外费用,了解更多相关信息请戳链接: RDS PostgreSQL with Ganos产品入口:https://www.aliyun.com/product/rds/postgresqlPOLARDB for PG/Oracle with Ganos产品入口(可申请免费公测):https://www.aliyun.com/product/POLARDBHBase with Ganos产品入口:https://www.aliyun.com/product/hbase 本文作者:ganos阅读原文 本文为云栖社区原创内容,未经允许不得转载。

June 11, 2019 · 1 min · jiezi

DOS-Network五月项目月报

各位亲爱的DOS社区的支持者们,欢迎阅读5月1日至5月30日的月度项目进度报告!???? 请关注我们的微信公众号或加入DOS官方社群,了解DOS网络的最新动态!现在就为大家带来最新的项目进展月报! ⚙️ 产品和开发DOS网络已经正式发布了公共测试网络 Beta 1.1版本 ????????????  任何能够使用Linux命令行环境的DOS网络支持者都可以加入DOS公共测试网络并且运行节点。请查看下方README文件并按照说明进行操作。 https://github.com/DOSNetwork... 如果您是开发者,请在下方链接中查看有关如何使用预言机服务的文档和示例。 https://dosnetwork.github.io/... Beta版本1.1目前包括以下功能: 1、可验证的密钥共享 2、分布式密钥生成(Pedersen的DKG方法) 3、Paring Library和阈值BLS签名 4、分布式随机数生成 5、Gossip和DHT协议的实现 6、P2P NAT支持 7、Json / Xml / Html请求解析器 8、容器化和客户端部署脚本 9、以太坊链上系统合约的整合 以下是未来发布版本的更多功能: 1、测试geth命令的lightnode模式并且在Parity客户端上进行试验 2、实现质押&授权合约及用户友好的面板 3、网络状态浏览器 ???? 最新战略合作DOS网络已与DUO Network达成战略合作。 双方将致力于通过抵押智能合约和分布式的数据预言机来降低传统衍生品交易中的风险和障碍,从而加速通证化加密衍生品的开发并促进Dapps的大规模应用。 ????活动DOS Network 联合创始人兼首席运营官王琦受邀参加哔哔News社区关于「以太坊生态」的线上论坛。 哔哔News社区致力于为用户提供有关区块链和数字货币的最新及有趣的信息和社区服务。王琦在此次论坛中表达了他对以太坊生态系统的见解。文章整理请戳:深聊以太坊 DOS网络运营和业务发展经理孙孝虎受邀参加了“解密Staking经济线下聚会”。 DOS网络公布了第一轮全球大使计划的结果。感谢所有参与者积极和支持。我们为 8 个不同的地方挑选了 10 位大使,并分别建立了各地的官方电报社区。我们的全球大使计划仍在进行,欢迎所有其他地区符合条件的DOS网络支持者申请!https://medium.com/dos-networ... DOS Network 正式入驻 Binance Info,并获得 Binance Info 官方“V”标识认证。 DOS网络联合创始人兼首席运营官王琦应邀参加了由巴比特主办的2019全球区块链(杭州)高峰论坛。并参与了主题为:"区块链项目融资新姿势”的大辩论。 DOS网络运营和业务发展经理孙孝虎应邀参与5月20日在北京举办的比特币之夜 - “A Gathering of Believers”。 DOS Network与Rebase社区和链茶馆于5月26日在北京联合举办了主题为”区块链跨链技术”的线下活动。本次活动特邀嘉宾Random Capital合伙人刘毅和Wanchain全球副总裁李尼做了主题分享,并与现场观众针对跨链展开深入讨论。DOS网络建立并开通电报官方公告频道。我们欢迎并鼓励每个DOS网络支持者加入这个频道,只需点击一下即刻了解我们的所有项目进展与更新。????每月统计数据推特粉丝:6344~6614(+ 4.3%)电报社区成员:15362~15798(+ 2.8%)Reddit成员:5034~5059(+ 0.5%)微信社区成员:2104~2779(+ 32.1%) - END - ...

June 10, 2019 · 1 min · jiezi

区块链Oracle预言机实现教程含代码

区块链本身是封闭的。区块链的确定性模型基于这样一个事实:在交易执行时区块链不能执行任何来自外部的逻辑,所有的外部数据只能通过交易进入到系统中。预言机/Oracle就是通过交易为智能合约提供可信数据的服务。Oracle虽然听起来神秘,但实现并不复杂,在这篇文章里,我们将介绍预言机的作用以及运作原理,并通过天气数据预言机WeatherOracle的完整实现过程,来帮助你快速掌握区块链预言机/Oracle的精髓。 1、为什么智能合约需要预言机/Oracle?在智能合约中执行的逻辑不可以执行区块链之外的任何操作,例如它不可以访问互联网上的web服务。外部数据进入智能合约的唯一方法是将其置入一个交易中,通过向系统发送一个新的交易来触发区块链状态的更新。 试着考虑一下,如果智能合约在执行时可以访问外部的一个API来获取数据,会出现什么情况? 如果今天部署这个合约,那么API可能会返回如下的数据: { "foo": "bar" }但是明天再部署时,API可能就会返回新的数据,例如: { "foo": "baz" }那么可以想像,一个月以后如果有人进行以太坊区块链的同步,这个智能合约就会被执行,但是API的响应数据是和一个月之前不同的,这就会导致新同步的区块链状态不同于之前已经存在的节点状态。 这就不再是完全自确定的区块链了。经历相同的同步过程,我的区块链和你的区块链却不一样! 让我们再换个说法:给定一组区块,一个节点必须能够从零开始重现区块链的最终状态,而无需互联网连接。 那么这一点对于智能合约的开发者意味着什么?Oralce(预言机),开发者必须构造一个预言机来和实现智能合约与外部世界的交互。 2、如何实现一个简单的预言机/Oracle?现在让我们创建一个简单的预言机/Oracle,来将外部的天气数据传入智能合约: 在最底层的区块链平台,我们需要部署一个智能合约,这个合约有一个方法updateWeather()用来更新天气状态,只有在合约白名单里的地址才可以调用这个方法。updateWeather方法接受天气数据作为参数,同时触发一个以太坊合约事件并将天气数据作为事件的参数,这样JavaScript应用就可以订阅这个事件并获得异步通知了。 同时我们将创建两个nodejs进程,其中之一就是预言机/Oracle,它的实现逻辑就是周期性地轮询第三方天气API来获取天气数据,然后将天气数据提交给智能合约以便进行历史审计。 另一个nodejs进程则负责订阅智能合约的天气事件,然后在控制台输出事件参数。正如之前所述,每当预言机/Oracle调用合约的updateWeather()方法时,都会触发天气事件。 需要指出的是,为了便于理解预言机的核心实现思路,下面的代码进行了简化,剔除了必要的错误处理,因此并不适用于生产环境。 源代码在这里: 预言机合约 - https://github.com/decentorga...预言机服务 - https://github.com/decentorga...接下来我们详细讲解这个简单的预言机的实现。 3、预言机智能合约实现智能合约有一个公开的oracleAddress状态变量,用来表示允许调用智能合约的updateWeather方法的账户地址,我们在构造函数中对其进行赋值: contract WeatherOracle { address public oracleAddress; constructor (address _oracleAddress) public { oracleAddress = _oracleAddress; } // ...}接下来我们要定义天气事件,这个事件将在weatherUpdate()调用成功时触发。同样为了简化,我们让这个事件简单的附带一个表示温度的字符串参数。 event WeatherUpdate (string temperature);最后我们要实现updateWeather()方法。它的可见性为public,意思是可以从外部调用这个方法: function updateWeather (string temperature) public { require(msg.sender == oracleAddress); emit WeatherUpdate (temperature); }请注意require语句。只有当调用地址(msg.sender)和白名单地址(oracleAddress)一致时才允许继续执行该方法,否则将回滚交易。 好了,就这么简单。 4、预言机服务我们的预言机就是一个简单的nodejs服务。它使用request库来调用外部天气API,解析API的响应,然后构造并提交交易给智能合约,然后等一会儿,重复上面的工作,如此周而复始。 让我们从访问API开始,我们将API的地址放在一个环境变量里,以便在开发/生产环境切换时避免修改源代码: ...

June 10, 2019 · 1 min · jiezi

Oracle数据库Python连接方法

Connecting Python to Oracle Cloud DatabaseThere are three flavors of Oracle Databases hosted on Oracle Cloud Infrastructure: Bare Mental, VM, and ExadataAutonomous Data Warehouse (ADWC)Autonomous Transaction ProcessingHere we are refering "Oracle database" to Autonomous Data Warehouse, while all three should be similar in connectivity interface as they are Oracle-like. For those of you who don't have an Oracle cloud account, be reminded that you can apply for a free-trial account with 30-day trial period and $3000 HKD usable balance.Before you beginBefore we discuss how to access Oracle database from Python, you should have already provisioned an Autonomous Data Warehouse instance. Refer to official doc for how to provision. Basically, you need to first construct a VCN (Virtual Cloud Network) under Networking tag, as later you'll be prompted to bind your ADWC to one of the VCNs. In the startup dialog of provisioning the ADWC, choose storage and other parameters, set up your ADMIN account, etc. ...

June 4, 2019 · 4 min · jiezi

Oracle-exp导出数据转

Oracle exp导出数据

June 3, 2019 · 1 min · jiezi

Oracle数据库之FORALL与BULK-COLLECT语句

本文原发布于简书,地址为: Oracle数据库之FORALL与BULK COLLECT语句。更多数据库资讯请参看github: 数据库知识汇总1 PL/SQL块的执行过程当PL/SQL运行时引擎处理一块代码时,它使用PL/SQL引擎来执行过程化的代码,而将SQL语句发送给SQL引擎来执行;SQL引擎执行完毕后,将结果再返回给PL/SQL引擎。这种在PL/SQL引擎和SQL引擎之间的交互,称为上下文交换(context switch)。每发生一次交换,就会带来一定的额外开销。 2 FORALL和BULK COLLECT特点这两个语句在PL/SQL内部进行一种数组处理,BULK COLLECT提供对数据的高速检索,FORALL可大大改进INSERT、UPDATE和DELETE操作的性能。Oracle数据库使用这些语句大大减少了PL/SQL与SQL语句执行引擎的环境切换次数,从而使其性能有了显著提高。 FORALL,用于增强PL/SQL引擎到SQL引擎的交换。BULK COLLECT,用于增强SQL引擎到PL/SQL引擎的交换。如果你要插入5000条数据,一般情况下,在pl/sql中用for循环,循环插入5000次,而用forall一次就可以插入5000条,提高了性能和速度。3 FORALL介绍使用FORALL,可以将多个DML批量发送给SQL引擎来执行,最大限度地减少上下文交互所带来的开销。 3.1 FORALL语法FORALL index_name IN { lower_bound .. upper_bound | INDICES OF collection_name [ BETWEEN lower_bound AND upper_bound ] | VALUES OF index_collection } [ SAVE EXCEPTIONS ] dml_statement;说明: index_name:一个无需声明的标识符,作为集合下标使用。lower_bound .. upper_bound:数字表达式,来指定一组连续有效的索引数字下限和上限。该表达式只需解析一次。INDICES OF collection_name:用于指向稀疏数组的实际下标。跳过没有赋值的元素,例如被 DELETE 的元素,NULL 也算值。VALUES OF index_collection_name:把该集合中的值当作下标,且该集合值的类型只能是 PLS_INTEGER/BINARY_INTEGER。SAVE EXCEPTIONS:可选关键字,表示即使一些DML语句失败,直到FORALL LOOP执行完毕才抛出异常。可以使用SQL%BULK_EXCEPTIONS 查看异常信息。dml_statement:静态语句,例如:UPDATE或者DELETE;或者动态(EXECUTE IMMEDIATE)DML语句。3.2 FORALL案例见sqlscripts/forall-bulkcollect包下的sql脚本事例 3.3 FORALL注意事项使用FORALL时,应该遵循如下规则: FORALL语句的执行体,必须是一个单独的DML语句,比如INSERT,UPDATE或DELETE。不要显式定义index_row,它被PL/SQL引擎隐式定义为PLS_INTEGER类型,并且它的作用域也仅仅是FORALL。这个DML语句必须与一个集合的元素相关,并且使用FORALL中的index_row来索引。注意不要因为index_row导致集合下标越界。lower_bound和upper_bound之间是按照步进 1 来递增的。在sql_statement中,不能单独地引用集合中的元素,只能批量地使用集合。在sql_statement中使用的集合,下标不能使用表达式。--error statement--1.insert into test2 values dr_table(i);dbms_output.put_line(i);不正确,找不到i,因为forall中只能使用单条语句可以引用索引变量--2.insert into test2 values(dr_table(i).id,dr_table(i).name);集合的field不可以在forall中使用,必须是整体使用--3.insert into test2 values dr_table(i+1);错误,不可以对索引变量进行运算--4.insert into test2 values(dr_table(i));报没有足够的值错误,此处外面不可以加括号,当有多个字段的时候,单个字段可以加括号4 BULK COLLECT的使用4.1 在SELECT INTO中使用BULK COLLECTDECLARE -- 定义记录类型 TYPE EMP_REC_TYPE IS RECORD( EMPNO EMP.EMPNO%TYPE, ENAME EMP.ENAME%TYPE, HIREDATE EMP.HIREDATE%TYPE); -- 定义基于记录的嵌套表 TYPE NESTED_EMP_TYPE IS TABLE OF EMP_REC_TYPE; -- 声明变量 EMP_TAB NESTED_EMP_TYPE;BEGIN -- 使用BULK COLLECT将所得的结果集一次性绑定到记录变量emp_tab中 SELECT EMPNO, ENAME, HIREDATE BULK COLLECT INTO EMP_TAB FROM EMP; FOR I IN EMP_TAB.FIRST .. EMP_TAB.LAST LOOP DBMS_OUTPUT.PUT_LINE('当前记录: ' || EMP_TAB(I) .EMPNO || CHR(9) || EMP_TAB(I) .ENAME || CHR(9) || EMP_TAB(I).HIREDATE); END LOOP;END;说明:使用BULK COLLECT一次即可提取所有行并绑定到记录变量,这就是所谓的批量绑定。 ...

May 30, 2019 · 3 min · jiezi

工作过程遇到数据库相关的知识点汇总

工作过程遇到的,或者平时学习的数据库相关的知识点汇总。 Home Oracle1 大数据量加载方法汇总2 大数据量更新方法3 去掉回车换行空格的方法4 系统参数详解5 dbms_application_info包6 FORALL与BULK COLLECT语句8 With As 的用法9 like运算符和转义操作符10 抛出自定义错误SQLServer1 SqlServer列与逗号分隔字符串互相转换2 查看sqlserver被锁的表以及如何解锁Mysql1 centos 7.2 mysql5.7 不区分表名大小写2 mysql5.7.x:this is incompatible with DISTINCT

May 30, 2019 · 1 min · jiezi

CentOS-7-中安装-Oracle11g-R2

准备修改用户的 SHELL 限制: vim /etc/security/limits.conf添加如下内容: oracle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536修改 /etc/pam.d/login 文件 vim /etc/pam.d/login添加如下内容: session required /lib/security/pam_limits.sosession required pam_limits.so修改 Linux 内核配置 vim /etc/sysctl.conf添加如下内容: fs.file-max = 6815744fs.aio-max-nr = 1048576kernel.shmall = 2097152kernel.shmmax = 2147483648kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 4194304net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048576source /etc/sysctl.conf# 使修改立即生效,我当时键入如下命令时报没有找到命令,所以重启了centos修改 /etc/profile 文件 vim /etc/profile添加如下内容: if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fifi创建用户和组 ...

May 27, 2019 · 3 min · jiezi

报名中云开发者大会武汉站漫谈数据平台与智能应用

| 导语 6月2日,武汉世茂希尔顿酒店,腾讯云邀您参加云+开发者大会(武汉站),与技术大咖们漫谈数据平台与智能应用,洞察数据,启迪智能。 大数据与人工智能时代,新的数据智能平台技术及其发展能为我们带来什么惊喜呢? 本次大会将邀请腾讯以及业界技术专家现场分享关于新的数据智能平台技术以及应用新趋势。 大会主要围绕新的数据洞察技术、新的数据价值驱动、新的数据与智能联通方式、数据智能落地的新场景与新问题等热点话题,带来丰富的技术干货与实战内容。 活动信息 活动指南 时间 2019-06-02 周日 13:30-18:00 地点 武汉世贸希尔顿酒店 汉阳厅 公共交通: 1,乘坐地铁4/6号线,拦江路地铁站或马鹦路地铁站下车,步行约1公里 2,乘坐524路/554/24/532路等,在鹦鹉大道腰路堤站下车,步行约1公里 报名渠道 点此报名 现场奖品 活动现场设置了抽奖环节大奖将在活动结束后抽出腾讯定制礼品等你来拿! 一等奖:1名 听听音箱 二等奖:2名 腾讯云定制移动电源 三等奖: 5名 腾讯云定制旅行套装 鼓励奖:5名 腾讯定制笔记本套装 此外,凡到场的嘉宾都有精美礼品相送哦~ 技术交流**关注武汉开发者大会,参与精彩大会互动可扫面上方二维码添加云小助微信号:yunjiadahui**

May 23, 2019 · 1 min · jiezi

阿里云PolarDB发布重大更新-支持Oracle等数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统数据库的1/6。目前,已有约40万个数据库迁移到阿里云上。 阿里云方面表示,该产品实现了两大技术突破:通过自研超低延迟文件系统PolarFS大幅降低数据跨网络的延迟,并且开发了一种全新的共识协议ParallelRaft,提升系统吞吐量。在此之前,PolarFS的研究成果已发表在数据库顶级会议 VLDB 2018 《PolarFS: An Ultra-low Latency and Failure Resilient Distributed File System for Shared Storage Cloud Database》。 企业在使用传统商业数据库时,经常会面临授权费用贵、硬件成本高、架构与运维复杂、迁移难度大等问题,此次云原生数据库PolarDB的重大更新针对此类痛点,实现一键快速迁移,并提供云上的完整生态服务。 此外,产品还具备三大亮点,满足企业在数字时代海量的数据存储需求:1、单实例规格最大达88核710GB;2、业内最快单节点读写速度100万QPS;3、实现三份数据存储实时同步0延迟。除性能领先外,云上数据库成本也低于传统数据库,不到后者的1/6。 PolarDB是阿里云在2018年正式商业化的云原生数据库,采用存储计算分离、软硬一体化设计,具备快速弹性能力、超大规格、超高可靠性以及两倍于AWS Aurora的性能。目前已是阿里云上增长最快的数据库产品。 随着移动互联网、物联网的发展,数据量剧增。企业上云也成大势所趋,企业上云意愿达84%,云也对数据库提出了更高的扩展性和可用性要求。 因昂贵、扩展性差、技术复杂、迭代慢,传统商业数据库饱受诟病。与传统数据库相反,云原生数据库天然拥有云计算的弹性能力,兼具开源数据库的易用、开放特点,及传统数据库的管理和处理性能优势,是云时代下企业数据库的最佳选择。 在全球范围内,一场替换传统数据库的行动正在进行。早在2013年,阿里巴巴就将最后一台Oracle数据库从其淘宝核心系统中下线。亚马逊也公开表示,将在2020年彻底放弃Oracle数据库。 阿里云智能数据库事业部负责人李飞飞表示,云原生数据库在成本、灵活度、安全、技术进化层面都优于传统数据库,传统数据库会像马车一样被淘汰。 阿里云拥有国内最丰富的云数据库产品,目前已有约40万个数据库迁移到阿里云上,涵盖金融、电信、制造、物流等领域的龙头企业。在Gartner发布的2018年数据库魔力象限中,阿里云是国内首个进入挑战者象限的中国公司。 阿里云数据库的技术研究也在国际上崭露头角。PolarDB相关论文入选今年的国际顶级数据库会议SIGMOD,这是阿里云数据库连续第二年入选该学术会议。 本文作者:阿里云头条阅读原文 本文为云栖社区原创内容,未经允许不得转载。

May 21, 2019 · 1 min · jiezi

SQL-行转列列转行

SQL 行转列,列转行行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换 行转列假如我们有下表: SELECT *FROM studentPIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语))通过上面 SQL 语句即可得到下面的结果 PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。IN 后面跟的就是具体的科目值。 当然我们也可以用 CASE WHEN 得到同样的结果,就是写起来麻烦一点。 SELECT name, MAX( CASE WHEN subject='语文' THEN score ELSE 0 END) AS "语文", MAX( CASE WHEN subject='数学' THEN score ELSE 0 END) AS "数学", MAX( CASE WHEN subject='英语' THEN score ELSE 0 END) AS "英语"FROM studentGROUP BY name使用 CASE WHEN 可以得到和 PIVOT 同样的结果,没有 PIVOT 简单直观。 ...

May 18, 2019 · 1 min · jiezi

宜信运维数据库SQL优化一篇文章说清楚Oracle-Hint的正确使用姿势

一、提示(Hint)概述1、为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2、不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导致SQL再次出现性能问题。 3、Hint的弊端Hint是比较"暴力"的一种解决方式,不是很优雅。需要开发人员手工修改代码。Hint不会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用Hint的语句是感知变化并产生更优的执行计划。Hint随着数据库版本的变化,可能会有一些差异、甚至废弃的情况。此时,语句本身是无感知的,必须人工测试并修正。4、Hint与注释关系提示是Oracle为了不破坏和其他数据库引擎之间对SQL语句的兼容性而提供的一种扩展功能。Oracle决定把提示作为一种特殊的注释来添加。它的特殊性表现在提示必须紧跟着DELETE、INSERT、UPDATE或MERGE关键字。 换句话说,提示不能像普通注释那样在SQL语句中随处添加。且在注释分隔符之后的第一个字符必须是加号。在后面的用法部分,会详细说明。 5、Hint功能Hint提供的功能非常丰富,可以很灵活地调整语句的执行过程。通过Hint,我们可以调整: 优化器类型优化器优化目标数据读取方式(访问路径)查询转换类型表间关联的顺序表间关联的类型并行特性其他特性二、Hint用法1、语法 1)关键字说明DELETE、INSERT、SELECT和UPDATE是标识一个语句块开始的关键字,包含提示的注释只能出现在这些关键字的后面,否则提示无效。"+"号表示该注释是一个提示,该加号必须立即跟在"/*"的后面,中间不能有空格。hint是下面介绍的具体提示之一,如果包含多个提示,则每个提示之间需要用一个或多个空格隔开。text是其它说明hint的注释性文本2)提示中的错误提示中的语法错误不会报错,如果解析器不能解析它,就会把它看做一个普通注释处理。这也是容易造成困惑的一点,使用的Hint到底是否起效?可以采用一些手段,检查提示的有效性。需要注意的是,那些语法正确但引用对象错误的提示是不会被报告的。 explain plan + dbms_xplan使用dbms_xplan输出中的note选项。 10132事件在10g中,这个事件产生的输出文档的末尾有一部分内容专门讲提示。通过它可以检查两个方面:一是每个用到的提示都会被列出来。如果漏掉了哪个,就说明这个提示没有被识别;二是检查是否有一些信息指明了出现提示错误(如果出错,err值将大于0)。 3)提示中的对象SELECT /+ INDEX(table_name index_name) / ... table_name是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名。index_name可以不必写,Oracle会根据统计值选一个索引。如果索引名或表名写错了,那这个hint就会被忽略。如果指定对象是视图,需要按此方法指定。/*+hint view.table ...*/,其中table是view中的表。 一个很常见的错误时,在使用提示的时候最易犯的错误是与表的别名有关。正确的规则是,当在提示中使用表时,只要表有别名就应该使用别名而不是表名。 2、提示的作用域查询块初始化参数提示对整个SQL语句起作用,其他的提示仅仅对查询块起作用。仅仅对单个查询块起作用的提示,必须在它控制的查询块内指定。 例外 - 全局提示可以使用点号引用包含在其他查询块(假设这些块已命名)中的对象。全局提示的语法可以支持两层以上的引用,对象间必须用点号分隔。 命名查询块既然where子句中的子查询是没有命名的,它们的对象就不能被全局提示引用。为了解决这个问题,10g中使用了另一种方法来解决-命名查询块。查询优化器可以给每个查询生成一个查询块名,而且还可以使用提示qb_name手工为每个查询块命名。大多数提示都可以通过参数来指定在那个查询块中有效。 *在提示中通过@来引用一个查询块。 3、提示数据字典Oracle在11g的版本中提供了一个数据字典—V$SQL_HINT。通过这个数据字典可以看到提示的出现版本、概要数据版本、SQL特性以及相反提示等。 INVERSE这个hint相反操作的hint。 VERSION代表着这个hint正式公布引入的版本。 三、Hint分类1、和优化器相关的当对优化器为某个语句所制定的基本执行计划不满意时,最好的办法就是通过提示来转换优化器的模式,并观察其转换后的结果,看是否已经达到期望程度。如果只通过转换优化器的模式就可以获得非常好的执行计划,则就没有必要额外使用更为复杂的提示了。 OPT_PARAM这个提示的作用就是使我们在某条语句中指定某个系统参数值。 ALL_ROWS为实现查询语句整体最优化而引导优化器制定最少成本的执行计划。这个提示会使优化器选择一条可最快检索所有查询行的路径,而代价就是在检索一行数据时,速度很慢。 FIRST_ROWS为获得最佳响应时间而引导优化器制定最少成本的执行计划。这个提示会使优化器选择可最快检索出查询的第一行(或指定行)数据的路径,而代价就是检索很多行时速度就会很慢。利用FIRST_ROWS来优化的行数,默认值为1,这个值介于10到1000之间,这个使用FIRST_ROWS(n)的新方法是完全基于代价的方法。它对n很敏感,如果n值很小,CBO就会生成包含嵌套循环以及索引查找的计划;如果n很大,CBO会生成由哈希连接和全表扫描组成的计划(类似ALL_ROWS)。 CHOOSE依据SQL中所使用到的表的统计信息存在与否,来决定使用RBO还是CBO。在CHOOSE模式下,如果能够参考表的统计信息,则将按照ALL_ROWS方式执行。除非在查询中的所有表都没有经过分析,否则choose提示会对整个查询使用基于代价的优化。如果在多表连接中有一个表经过分析过,那么就会对整个查询进行基于代价的优化。 RULE使用基于规则的优化器来实现最优化执行,即引导优化器根据优先顺序规则来决定查询条件中所使用到的索引或运算符的执行顺序来制定执行计划。这个提示强制oracle优先使用预定义的一组规则,而不是对数据进行统计;同时该提示还会使这个语句避免使用其他提示,除了DRIVING_SITE和ORDERED(不管是否进行基于规则的优化,这两个提示都可使用)。 2、和访问路径相关的FULL告诉优化器通过全表扫描方式访问数据。这个提示只对所指定的表进行全表扫描,而不是查询中的所有表。FULL提示可以改善性能。这主要是因为它改变了查询中的驱动表,而不是因为全表扫描。在使用其他某些提示时,也必须使用FULL提示。只有访问整个表时,才可利用CACHE提示将表进行缓存。并行组中的某些提示也必须使用全表扫描。 CLUSTER引导优化器通过扫描聚簇索引来从索引表中读取数据。 HASH引导优化器按照哈希扫描的方式从表中读取数据。 INDEX告诉优化器对指定表通过索引的方式访问数据。当访问数据会导致结果集不完整时,优化器将忽略这个Hint。 NO_INDEX告诉优化器对指定表不允许使用索引。这个提示会禁止优化器使用指定索引。可以在删除不必要的索引之前在许多查询中禁止索引。如果使用了NO_INDEX,但是没有指定任何索引,则会执行全表扫描。如果对某个索引同时使用了NO_INDEX和会之产生冲突的提示(如INDEX),这时两个提示都会被忽略掉。 INDEX_ASC利用索引从表中读取数据时,引导优化器对提示中所指定索引的索引列值按照升序使用范围扫描。 INDEX_COMBINE告诉优化器强制选择位图索引。这个提示会使优化器合并表上的多个位图索引,而不是选择其中最好的索引(这是INDEX提示的用途)。还可以使用index_combine指定单个索引(对于指定位图索引,该提示优先于INDEX提示)。对于B树索引,可以使用AND_EQUAL提示而不是这个提示。 INDEX_JOIN索引关联,当谓词中引用的列上都有索引的时候,可以通过索引关联的方式来访问数据。这个提示可以将同一个表的各个不同索引进行合并,这样就只需要访问这些索引就可以了,节省了回表查询的时间。但只能在基于代价的优化器中使用该提示。这个提示不仅允许只访问表上的索引,这样可以扫描更少的代码块,并且它比使用索引并通过rowid扫描整个表快5倍。 INDEX_DESC利用索引从表中读取数据时,引导优化器对提示中所指定索引的索引列值按照降序使用范围扫描。 INDEX_FFS告诉优化器以INDEX FFS(index fast full scan)的方式访问数据。INDEX_FFS提示会执行一次索引的快速全局扫描。这个提示只访问索引,而不是对应的表。只有查询需要检索的信息都在索引上时,才使用这个提示。特别在表有很多列时,使用该提示可以极大地改善性能。 INDEX_SS强制使用index skip scan的方式访问索引。当在一个联合索引中,某些谓词条件并不在联合索引的第一列时(或者谓词并不在联合索引的第一列时),可以通过index skip scan来访问索引获得数据。当联合索引第一列的唯一值很少时,使用这种方式比全表扫描的方式效率要高。 3、和查询转换相关的USE_CONCAT将含有多个OR或者IN运算符所连接起来的查询语句分解为多个单一查询语句,并为每个单一查询语句选择最优化查询路径,然后再将这些最优化查询路径结合在一起,以实现整体查询语句的最优化目的。只有在驱动查询条件中包含OR的时候,才可以使用该提示。 NO_EXPAND引导优化器不要为使用OR运算符号(或IN运算符)的条件制定相互结合的执行计划。正好和USE_CONCAT相反。 REWRITE当表连接的对象是数据量比较大的表或者需要获得使用统计函数处理过的结果时,为了提高执行速度可预先创建物化视图。当用户要求查询某个查询语句时,优化器会在从表中和从物化视图中读取数据的两种方法中选择一个更有效的方法来读取数据。该执行方法称之为查询重写。使用REWRITE提示引导优化器按照该方式执行。 MERGE为了能以最优方式从视图或者嵌套视图中读取数据,通过变换查询语句来直接读取视图使用的基表数据,该过程被称之为视图合并。不同的情况其具体使用类型也有所不同。该提示主要在视图未发生合并时被使用。尤其是对比较复杂的视图或者嵌套视图(比如使用了GROUP BY或DISTINC的视图)使用该提示,有时会取得非常好的效果。 ...

May 5, 2019 · 1 min · jiezi

那些年我们用过的定时调度

定时调度作为后端开发人员,我们总会遇到这样的业务场景:每周同步一批数据;每半个小时检查一遍服务器运行状况;每天早上八点给用户发送一份包含今日待办事项的邮件,等等。 这些场景中都离不开“定时器”,就像一个定好时间规则的闹钟,它会在指定时间触发,执行我们想要定义的调度任务。那么我们今天就来数一下,那些年我们用过的“定时调度”。 1. job (oracle)从刚工作就一直使用oracle数据库,最早接触的定时任务就是oracle数据库的job。job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 而且oracle重新启动后,job会继续运行,不用重新启动。 而且job的机制非常完备,可以查询相关的表或视图,查询job的定时规则和执行情况。缺点是作为oracle数据库层面的工具,自定义功能扩展,二次开发的难度比较大。 1.1 创建job DECLARE job NUMBER;BEGIN sys.dbms_job.submit(job => job, what => 'prc_name;', --执行的存储过程的名字 next_date => to_date('22-11-2013 09:09:41', 'dd-mm-yyyy hh24:mi:ss'), --下一次执行时间 interval =>'sysdate+1/24'); --每天24小时,即每小时运行prc_name过程一次END;-- job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。-- what参数是将被执行的PL/SQL代码块,存储过程名称等。-- next_date参数指识何时将运行这个工作。-- interval参数何时这个工作将被重执行1.2 删除job DECLAREBEGIN dbms_job.remove(1093); -- 1093为当前需要删除的 job 值 COMMIT;END;1.3 查询job -- 查询当前用户的jobselect * from user_jobs;-- 查询所有jobselect * from dba_jobs;-- 查询所有运行中的jobselect * from dba_jobs_running;2. crontab (linux)crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。大部分linux系统默认都安装了cron,可以检查一下。 -- 检查Crontab工具是否安装crontab -l-- 检查crond服务是否启动service crond status-- centos安装yum install vixie-cronyum install crontabscrontab基本操作命令 ...

May 3, 2019 · 2 min · jiezi

Oracle-学习笔记Windows-环境下安装-PLSQL

Oracle 安装、PL/SQL 配置使用 前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔记。 一、原始文件 win32_11gR2.zip PLSQL Developer 11.0.0.1762 中文绿色注册版.zip (网上可以下载这两个文件) Oracle 官网: https://www.oracle.com/techne... 百度搜 PLSQL 我这边是之前下载好的,解压这两个文件: win32_11gR2.zip解压到当前文件夹 PLSQL 我解压到D:Program Files\ 二、安装 先安装 oracle。 第一步:双击 setup.exe 文件。 第二步:配置安全更新:可将自己的电子邮件地址填写进去(也可以不填写)。取消勾选“我希望通过My Oracle Support接受安全更新(W)”。 第三步:安全选项:默认创建和配置一个数据库(系统自动创建一个数据库实例)。 第四步:系统类:默认桌面类,下一步。 第五步:典型安装:选择基目录,我看默认 F 盘,改到 D 盘,也可以自建目录,目录路径不要含有中文或其它的特殊字符;全局数据库名可以默认,口令密码必须牢记,我用记事本先记录下。 第六步:先决条件检查:检查计算机的软硬件系统是否满足安装此 Oracle 版本的最低要求,直接下一步。(我这边有失败提示,勾选忽略) 第七步:点完成。 第八步:开始安装。 ...

May 2, 2019 · 1 min · jiezi

程序员笔记循序渐进解读Oracle-AWR性能分析报告

Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库。它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时)为其所有重要的统计信息和负载信息执行一次快照,并将快照存放入AWR中。这些信息在AWR中保留指定的时间(默认为1周),然后执行删除。执行快照的频率和保持时间都是可以自定义的。 AWR的引入,为我们分析数据库提供了非常好的便利条件(这方面MySQL就相差了太多)。曾经有这样的一个比喻——“一个系统,就像是一个黑暗的大房间,系统收集的统计信息,就如同放置在房间不同位置的蜡烛,用于照亮这个黑暗大房间。Oracle,恰到好处地放置了足够的蜡烛(AWR),房间中只有极少的烛光未覆盖之处,性能瓶颈就容易定位。而对于蜡烛较少或是没有蜡烛的系统,性能优化就如同黑暗中的舞者。” 那如何解读AWR的数据呢?Oracle本身提供了一些报告,方便进行查看、分析。下面就针对最为常见的一种报告——《AWR数据库报告》进行说明。希望通过这篇文章,能方便大家更好地利用AWR,方便进行分析工作。 一、MAIN1、Database Information 2、Snapshot Information (1)Sessions 表示采集实例连接的会话数。这个数可以帮助我们了解数据库的并发用户数大概的情况。这个数值对于我们判断数据库的类型有帮助。 (2)Cursors/session 每个会话平均打开的游标数。 (3)Elapsed 通过Elapsed/DB Time比较,反映出数据库的繁忙程度。如果DB Time>>Elapsed,则说明数据库很忙。 (4)DB Time 表示用户操作花费的时间,包括CPU时间和等待事件。通常同时这个数值判读数据库的负载情况。 具体含义db time = cpu time + wait time(不包含空闲等待)(非后台进程) *db time就是记录的服务器花在数据库运算(非后台进程)和等待(非空闲等待)上的时间。对应于V$SESSION的elapsed_time字段累积。 "合集数据"需要注意的是AWR是一个数据合集。比如在1分钟之内,1个用户等待了30秒钟,那么10个用户等待事件就是300秒。CPU时间也是一样,在1分钟之内,1个CPU处理30秒钟,那么4个CPU就是120秒。这些时间都是以累积的方式记录在AWR当中的。 示例DB CPU——这是一个用于衡量CPU的使用率的重要指标。假设系统有N个CPU,那么如果CPU全忙的话,一秒钟内的DB CPU就是N秒。除了利用CPU进行计算外,数据库还会利用其它计算资源,如网络、硬盘、内存等等,这些对资源的利用同样可以利用时间进行度量。假设系统有M个session在运行,同一时刻有的session可能在利用CPU,有的session可能在访问硬盘,那么在一秒钟内,所有session的时间加起来就可以表征系统在这一秒内的繁忙程度。一般的,这个和的最大值应该为M。这其实就是Oracle提供的另一个重要指标:DB time,它用以衡量前端进程所消耗的总时间。 对除CPU以后的计算资源的访问,Oracle用等待事件进行描述。同样地,和CPU可分为前台消耗CPU和后台消耗CPU一样,等待事件也可以分为前台等待事件和后台等待事件。DB Time一般的应该等于"DB CPU + 前台等待事件所消耗时间"的总和。等待时间通过v$system\_event视图进行统计,DB Time和DB CPU则是通过同一个视图,即v$sys_time_model进行统计。 --"Load Profile"中关于DB Time的描述 *这个系统的CPU个数是8,因此我们可以知道前台进程用了系统CPU的7.1/8=88.75%。DB Time/s为11.7,可以看出这个系统是CPU非常繁忙的。里面CPU占了7.1,则其它前台等待事件占了11.7 – 7.1 = 4.6 Wait Time/s。DB Time 占 DB CPU的比重: 7.1/11.7= 60.68% --"Top 5 Timed Events"中关于DB CPU的描述按照CPU/等待事件占DB Time的比例大小,这里列出了Top 5。如果一个工作负载是CPU繁忙型的话,那么在这里应该可以看到 DB CPU的影子。 ...

April 29, 2019 · 5 min · jiezi

程序员笔记全面解析Oracle等待事件的分类发现及优化

一、等待事件由来大家可能有些奇怪,为什么说等待事件,先谈到了指标体系。其实,正是因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle的指标体系,大致经历了下面三个阶段: 以命中率为主要参考指标以各种命中率为主要的优化入口依据,常见的有”library cache hit radio“等。但这种方式弊端很大,一个命中率为99%的系统,不一定就比95%的系统优化的更好。在老的Oracle版本中,往往采用这种方式,如8i、9i等。 以等待事件为主要参考指标以各种等待事件为优化入口依据,常见的有"db file sequential read"等。可以较直观的了解,在一段时间内,数据库主要经历了那些等待。这些"瓶颈",往往就是我们优化的着手点。在10g、11g版本中,广泛使用。 以时间模型为主要参考指标以各种资源整体消耗为优化入口依据。可以从整体角度了解数据库在一段时间内的消耗情况。较等待事件的方式,更有概括性。常见的如"DB Time"。Oracle在不断加强这个方面的工作。 从上面三个阶段可见,等待事件的引入,正是为了解决以命中率为指标的诸多弊端。与后面的时间模型相比,等待事件以更加直观、细粒度的方式观察Oracle的行为,往往作为优化的重要入口。而时间模型,更侧重于整体、系统性的了解数据库运行状态。两者的侧重点不同。 二、等待事件分类让我们首先从等待事件的分类入手,认识等待事件。从大的分类上来看,等待事件可分为空闲的、非空闲的两大部分。在非空闲的等待事件,又可进一步划分细的类别。 可以通过下面的方法,观察系统包含的等待事件数量及大致分类(以下语句在11g环境运行)。 其中WAIT_CLASS为“Idle”的等待事件就是空闲的,其他的都是非空闲的等待事件。 1. 区分 — 空闲与非空闲等待事件空闲等待事件,是指Oracle正等待某种工作,比如用sqlplus登录之后,但没有进一步发出任何命令,此时该session就处于SQL*Net message from/to client等待事件状态,等待用户发出命令,任何的在诊断和优化数据库的时候,一般不用过多注意这部分事件。 非空闲等待事件,专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是调整数据库的时候应该关注与研究的。 2. 等待事件分类说明管理类-Administrative此类等待事件是由于DBA的管理命令引起的,这些命令要求用户处于等待状态(比如,重建索引) 。 应用程序类-Application此类等待事件是由于用户应用程序的代码引起的(比如,锁等待) 。 群集类-Cluster此类等待事件和真正应用群集RAC的资源有关(比如,gc cr block busy等待事件) 。 提交确认类-Commit此类等待事件只包含一种等待事件——在执行了一个commit命令后,等待一个重做日志写确认(也就是log file sync) 。 并发类-Concurrency此类等待事件是由内部数据库资源引起的(比如闩锁) 。 配置类-Configuration此类等待事件是由数据库或实例的不当配置造成的(比如,重做日志文件尺寸太小,共享池的大小等) 。 空闲类-Idle此类等待事件意味着会话不活跃,等待工作(比如,sql * net messages from client) 。 网络类-Network和网络环境相关的一些等待事件(比如sql* net more data to dblink) 。 其它类-Other此类等待事件通常比较少见(比如wait for EMON to spawn) 。 调度类-Scheduler此类等待事件和资源管理相关(比如resmgr: become active') 。 系统I/O类-System I/O此类等待事件通过是由后台进程的I/O操作引起的(比如DBWR等待-db file paralle write) 。 用户I/O类-User I/O此类等待事件通常是由用户I/O操作引起的(比如db file sequential read) 。 ...

April 29, 2019 · 2 min · jiezi

从濒临解散到浴火重生OceanBase-这十年经历了什么

阿里妹导读:谈及国产自研数据库,就不得不提 OceanBase。与很多人想象不同的是,OceanBase 并非衔着金钥匙出生的宠儿。相反,它曾无人看好、困难重重,整个团队甚至数度濒临解散。从危在旦夕到浴火重生,OceanBase 这十年经历了什么?今天,我们一起了解它背后不为人知的故事。 OceanBase 是完全由阿里巴巴和蚂蚁金服自主研发、全球首个应用于金融核心业务的分布式关系数据库。OceanBase 的研发始于 2010 年 6 月,因为选择从零开始,研发之路从一开始就磨难重重,中途因为找不到愿意使用的业务,团队曾经濒临解散。 最终 OceanBase 还是跨越了死亡之谷,在蚂蚁金服实现了全面替代 Oracle,成功支撑了过去 5 年“双 11”蚂蚁金服全部核心业务的重压,创造了 25.6 万笔 / 秒支付峰值和 4200 万笔 / 秒请求数处理峰值这一业内全新的纪录。自 2017 年开始,OceanBase 开始走向外部商用,目前已经在数十家商业银行落地,其中包括南京银行、浙商银行、苏州银行、人保健康险等。OceanBase 帮助南京银行共同打造“鑫云 +”互金开放平台,实现贷款交易处理能力 10 倍提升,轻资产模式显著降低成本,从原有的 30~50 元 / 账户降低到上线后的 4 元 / 账户。日处理百万笔放款,平均处理时间小于 1 秒,让老百姓借钱更方便,真正实现了普惠金融。 站在现在这个时间点上顾盼今昔,蚂蚁金服高级研究员、OceanBase 创始人阳振坤认为,OceanBase 的成功其实有行业和时代的必然性。 时 机2009 年开始,大量新的非关系型数据库如雨后春笋般涌出,在整个数据库行业掀起了一场空前盛大的 NoSQL 革命,如今赫赫有名的 Redis、MongoDB 皆诞生于那一年。NoSQL 的拥护者们积极提倡使用非关系型的数据存储,从而获得丰富而随需应变的可伸缩性。这时候的关系数据库早已过了而立之年,在此期间虽然曾短暂爆发过一些所谓终结关系数据库的革命,但最终都失败了,丝毫没有动摇到关系数据库的主导地位。 但这一次似乎与以往不同,火热发展的云计算带来了对更大规模数据库的需求,而关系数据库的缺点则相应地被越来越多人诟病:不能够扩展、容量小、处理能力不够、成本又非常高。在当时的很多人看来,关系数据库的末日是真的要来了。2010 年,NoSQL 革命愈演愈烈,有行业专家发文直指“云计算时代属于 NoSQL,关系数据库已经日薄西山”。 那时阳振坤已经做了两年多的自研分布式系统,十分看好云计算系统的发展机会。同一年,阳振坤加入阿里巴巴,开始了分布式关系数据库 OceanBase 的研发。 数据库从诞生起已经有几十年的时间了,但基本上它的市场格局就没有多少变化,最早起来的几家厂商今天还是占据着统治地位。因为数据库非常难被替换,它处在整个产品或者产业链最底层的位置,替换风险很大,但收益相比起来却小得多。这也是为什么像 IBM、微软这样的后来者也无法取代 Oracle。这就导致了数据库变成了一个门槛极高、强者恒强的领域,后来者很难居上。前有 Oracle 挡道、后有 NoSQL 数据库追赶,在大部分人看来,那时候怎么也不会是自研关系数据库的好时机,但阳振坤却不这么想。 ...

April 26, 2019 · 2 min · jiezi

记一次升级Oracle驱动引发的死锁

问题描述近期项目需要从虚拟机环境迁移到容器环境,其中有一个项目在迁移到容器环境之后的两天之内出现了2次“死锁(deadlock)”的问题,部分关键日志如下: Found one Java-level deadlock:============================="DefaultMessageListenerContainer-9": waiting to lock monitor 0x00007fde3400bf38 (object 0x00000000dda358d0, a oracle.jdbc.driver.T4CConnection), which is held by "DefaultMessageListenerContainer-7""DefaultMessageListenerContainer-7": waiting to lock monitor 0x00007fdea000b478 (object 0x00000000dda35578, a oracle.jdbc.driver.T4CConnection), which is held by "DefaultMessageListenerContainer-9"Java stack information for the threads listed above:==================================================="DefaultMessageListenerContainer-9": at oracle.jdbc.oracore.OracleTypeADT.linearize(OracleTypeADT.java:1280) - waiting to lock <0x00000000dda358d0> (a oracle.jdbc.driver.T4CConnection) at oracle.sql.ArrayDescriptor.toBytes(ArrayDescriptor.java:653) at oracle.sql.ARRAY.toBytes(ARRAY.java:711) - locked <0x00000000dda35578> (a oracle.jdbc.driver.T4CConnection) at oracle.jdbc.driver.OraclePreparedStatement.setArrayCritical(OraclePreparedStatement.java:6049) at oracle.jdbc.driver.OraclePreparedStatement.setARRAYInternal(OraclePreparedStatement.java:6008) - locked <0x00000000dda35578> (a oracle.jdbc.driver.T4CConnection) at oracle.jdbc.driver.OraclePreparedStatement.setArrayInternal(OraclePreparedStatement.java:5963) at oracle.jdbc.driver.OracleCallableStatement.setArray(OracleCallableStatement.java:4833) at oracle.jdbc.driver.OraclePreparedStatementWrapper.setArray(OraclePreparedStatementWrapper.java:114)"DefaultMessageListenerContainer-7": at oracle.jdbc.oracore.OracleTypeADT.linearize(OracleTypeADT.java:1280) - waiting to lock <0x00000000dda35578> (a oracle.jdbc.driver.T4CConnection) at oracle.sql.ArrayDescriptor.toBytes(ArrayDescriptor.java:653) at oracle.sql.ARRAY.toBytes(ARRAY.java:711) - locked <0x00000000dda358d0> (a oracle.jdbc.driver.T4CConnection) at oracle.jdbc.driver.OraclePreparedStatement.setArrayCritical(OraclePreparedStatement.java:6049) at oracle.jdbc.driver.OraclePreparedStatement.setARRAYInternal(OraclePreparedStatement.java:6008) - locked <0x00000000dda358d0> (a oracle.jdbc.driver.T4CConnection) at oracle.jdbc.driver.OraclePreparedStatement.setArrayInternal(OraclePreparedStatement.java:5963) at oracle.jdbc.driver.OracleCallableStatement.setArray(OracleCallableStatement.java:4833) at oracle.jdbc.driver.OraclePreparedStatementWrapper.setArray(OraclePreparedStatementWrapper.java:114) at日志还是挺明显的,线程DefaultMessageListenerContainer-9获得了锁0x00000000dda35578,等待获取0x00000000dda358d0;而DefaultMessageListenerContainer-7正好相反,从而导致死锁; ...

April 24, 2019 · 2 min · jiezi

Windows平台安装Oracle Database 18.3

Windows平台安装Oracle Database 18.3对于Win10同样适用,大同小异。软件环境Windows Server 2019评估版虚拟机(不破解的话180天试用)Oracle Database 18.3 64bitJava 81. 检查Jdk是否完成配置JDK安装和配置在搜索引擎上很多很详细,这里就不赘述了。2. 下载Oracle Database 18.3安装包18c下载地址,选到18.3 Windows x64版本,下载到的会是一个ZIP的压缩包。3. 解压并运行setup.exe4. 安装Oracle Database 18.3来了来了,要跳坑了!a. Configuration Option:Create and configure a single instance databaseb. System Class:Destop Classc. Oracle Home User: Use Virtual Accountd. Typical Installation:默认的配置是这里设置Oracle base、Database file location指向相对的位置和设置Oracle Database的password。注意:这里不修改base文件所在位置,会出现以下的错误[INS-30011]–The specified Oracle base location is invalid。错误[INS-32014]是说我设置的密码不符合Oracle的标准。这里,我又新建了一个文件夹叫做“Oracle Base”,然后再Oracle Base那一栏选择刚建好的文件夹,下方Database file location也会自动变成E:Oracle Baseoradata,然后改了下密码下一步。e. Prerequisite Checks:这里需要一点时间。然后会弹出来这个界面,勾上Ignore All选项就可以继续往下了f.Summary:点install开始安装g. Install Project:这里等待安装时间比较久h. Finsih:看到这个界面,那么数据库安装已经完成。i. 测试是否已安装,使用安装时候附带sqlplus或者进入cmd后键入sqlplus命令都可以,登陆用户名为system,密码为你刚才上面设置的密码。出现 SQL> 说明登陆成功。工具连接Oracle Database命令行窗口操作并不方便,所以我们需要让工具连接到我们的数据库来操作。数据库管理工具有很多,比如DataGrip、Navicat、PL/SQL Developer、DBEaver、SQLyog等,我这里用Navicat。该软件收费,文末附上补丁,有条件还是支持正版好。下载后安装打开,新建connection,选择Oracle。这里要选择连接类型要选择TNS,否则会出错。Navicat补丁 提取码:9wss 链接失效可以留言或关注微信公众号“大大大西西瓜皮”后台回复。

April 20, 2019 · 1 min · jiezi

oracle用imp命令简单导入dmp文件

成功后,会有下面情况

April 18, 2019 · 1 min · jiezi

十年磨一剑,王坚自研的MaxCompute如何解决世界级算力难题

摘要: 2009年这项关于大数据的技术长征开始。王坚带队,目标是自研大数据计算平台MaxCompute统一阿里巴巴内部的数据和大数据计算体系。大数据时代,随着企业数据规模的急剧增长,传统软件已无法承载,这也推动了大数据技术的发展,Google、AWS、微软等硅谷巨头纷纷投入大数据技术的研发;而在国内,王坚也在十年前带领阿里云团队研发MaxCompute,率先在国内开启大数据计算平台的自研之路。十年后,MaxCompute已经可以承载EB级别的数据存储能力、百PB级的单日计算能力,在公共云上已经覆盖了国内外的十几个国家和地区,电商、工业、医疗、农业、气象、教育等诸多行业企业开始采用这项技术,轻松处理海量数据,为社会和消费者提供服务。MaxCompute的自研之路事实上,阿里大数据的发展历程映射出整个大数据行业的发展史。十年前,阿里巴巴比其它公司更早地遇到互联网规模化带来的挑战。当时全球企业的数据库基本都是Oracle,而阿里巴巴拥有亚洲最大的Oracle集群,计算规模达百TB级别。按照当时淘宝用户量的增长速度,Oracle集群很快将无法支撑业务发展,而最核心的问题就是算力不足。尽管当时阿里已开始把数据迁移到更大规模的Greenplum,但后者在百台机器规模时就遇到瓶颈,给业务增长造成极大阻碍。此外,Hadoop之类的开源技术在可靠性、安全性上也遭遇了天花板。2008年,王坚带着解决大规模算力瓶颈的任务加入阿里。他发现,无论是Oracle还是Greenplum、Hadoop,都不是大规模数据计算的最优解,必须自研一套自己的大数据处理平台。2009年这项关于大数据的技术长征开始。王坚带队,目标是自研大数据计算平台MaxCompute统一阿里巴巴内部的数据和大数据计算体系。事实证明,阿里做了正确的选择。四年攻坚,MaxCompute终于取得重大突破:2013年8月15日,阿里云历史性地突破了同一个集群内5000台服务器同时计算的局限,为未来的大规模服务奠定基础。十年后,单集群规模已超过1万台,能做到这一能力的科技公司在全球都寥寥可数。在阿里云云栖小镇,还竖着一尊飞天5K的纪念碑,碑上刻着参与解决这一技术难题的技术人员名字。解决世界级算力难题通过大数据计算平台,可以让订单实时准确汇聚,也可以精准预测变幻莫测的天气变化,各行各业都在大规模使用大数据来提供更好的服务,而实现这一能力就是海量数据分析的结果。 但要处理好这些数据并不容易。除了数据量的剧增,不同行业数据类型丰富多样,如结构化数据、非结构化数据等,都给大数据计算平台带来新的挑战。MaxCompute的创新之处就是采用Datalake技术,把不同的数据源用类似的方式存储,用统一的方法计算,提供一套标准化语言,快速实现不同类型数据的计算。基于这套创新技术,2015、2016年,阿里云刷新世界计算奥运会SortBenchmark的六项世界纪录;2017年,完成全球首次基于公共云的100TB BigBench大数据基准测试。如何快速“查询”也是大数据计算的核心之一。MaxCompute采用“交互式查询”来解决海量数据查询慢的瓶颈,通俗地说就是系统可以预判用户将会做哪些查询,提前准备,大大降低大规模数据查询的时间。此外,MaxCompute提出多租户云安全隔离技术,突破传统大数据平台的安全局限,将安全边界细化到用户、进程、内核级别,完全满足金融级的安全需求。顶级算力走向世界过去十年,MaxCompute能力不断提升:单日数据处理量从2015年100PB,2016年180PB,到2017年320PB,再到2018年的单日处理超过600PB。记录被不断刷新,并且得到了权威机构的认可:在Forrester发布的《The Forrester WaveTM: CloudData Warehouse, Q4 2018》中,阿里云MaxCompute、DataWorks、ADB等三款产品成功入选,并在产品功能(Current Offering)方面力压微软。这一世界级的大数据计算能力也逐渐展示其价值,帮助数万企业用更低成本、更高效率计算海量数据,为社会和消费者提供服务。在生活领域,墨迹天气开始通过MaxCompute为4亿用户提供气象预报服务,每天的用户查询超过5亿次。不仅如此,它们的存储和计算成本还令人意外地降低70%。在交通领域,城市大脑在杭州实时指挥1300个红绿灯路口、200多名交警。从2016年到2018年,杭州从全国最拥堵城市排行榜上下跌52名。在工业领域,阿里云的大数据处理技术帮助制造企业寻找上千个参数的最优搭配,提升制造的良品率。协鑫光伏、天合光能等行业龙头企业,都在尝试这一全新的生产模式。在政务领域,浙江最多跑一次通过大数据处理平台打通政务数据,将与老百姓办事最密切相关的100个事项70多亿条数据,按照统一标准汇入统一的数据仓,实现共通共享共用。老百姓办事不仅能最多跑一次,甚至有可能一次都不跑。而在海外,MaxCompute也已进入新加坡、欧洲等市场,将这一技术对外赋能给更多用户。从线上到线下,从生产制造到互联网电商,从国内到海外,MaxCompute的计算能力正在延伸到各行各业,极大地降低了社会的计算成本。MaxCompute产品官网 https://www.aliyun.com/product/odps本文作者:晋恒阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 12, 2019 · 1 min · jiezi

Oracle分组查询

分组查询,且只取每一组内的一条最新的记录需求:查询 code 为a,b,c且在有效时间段内的每个code最新的一条记录(code不是主键)select * from (select code col1, col2, row_number() over (partition by code order by time desc) rank from t_order where type= ‘107’ and to_char(sysdate, ‘yyyymmdd-hh24:mi:ss’) &lt;= validuntilTime and code in (‘a’,‘b’,‘c’) ) where rank = 1<!– more –>其中下面代码含义是将时间在有效时间段内(to_char(sysdate, ‘yyyymmdd-hh24:mi:ss’) &lt;= validuntilTime)且code为a,或b,或c(code in(‘a’,‘b’,‘c’))的所有记录根据code分组(partition by code),且组内的顺序是根据时间的逆序排列(order by time desc)(select code col1, col2, row_number() over (partition by code order by time desc) rank from t_order where type= ‘107’ and to_char(sysdate, ‘yyyymmdd-hh24:mi:ss’) &lt;= validuntilTime and code in (‘a’,‘b’,‘c’) ) 上面执行结果是类似下面表格效果CODECOL1COL2RANKaxxxxxx1axxxxxx2axxxxxx3bxxxxxx1bxxxxxx2cxxxxxx1cxxxxxx2cxxxxxx3cxxxxxx4然后将其作为子查询,在外层套一个select * from (上面的代码) where rank = 1就能将每一组内的一条最新的记录查询出来了 ...

April 6, 2019 · 1 min · jiezi

Oracle高级对象

1、存储过程 相当于java中的方法,如果没有返回值,则称之为存储过程,有返回值,则称为函数, 存储过程其实就是一个带名字的 执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次调用存储过程可以大大减少同数据库的交互次数。降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。有利于复用。语法: create or replace procedure 过程名(参数列表) is –定义声明 begin –功能区 end;参数可以通过 DEFAULT给默认值异常来意不明,Oracle可以使用自定义的异常。函数:一是有返回值,存储过程和函数的区别:1、返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有2、调用分区别,函数可以在查询语句中直接调用而存储过程必须单独调用。函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作如果返回多个参数最好使用存储过程,如果只有一个返回值的话可以使用函数。查看Oracle ID:set serveroutput onexec dbms_output.put_line(utl_inaddr.get_host_address);

March 28, 2019 · 1 min · jiezi

普元数据库开发工程师面试总结 2019.03

小题1:ETL过程中的元数据有哪些?我的解答: 通常来说,我们可以把元数据分为三类,分别为业务元数据(Business Metadata),技术元数据(Technical Metadata)和过程处理元数据(Process Execution Metadata)。 业务元数据,是从业务的角度对数据的描述。通常是用来给报表工具和前端用户对数据进行分析和使用提供帮助。 技术元数据,是从技术的角度对数据的描述。通常包括数据的一些属性,如数据类型、长度、或者数据概况分析后一些结果。 过程处理元数据,是ETL处理过程中的一些统计数据,通常包括有多少条记录被加载,多少条记录被拒绝接受等数据。小题2:ETL的质量检查包括哪些方面?我的解答: ETL的数据质量问题具体表现为正确性、完整性、一致性、完备性、有效性、时效性和可获取性等几个特性。 SQL题1:怎么把这样一个表,查成这样一个结果? ==》 我的解答:SQL题2: Student(Sno,Sname,Sage,Ssex)学生表,Sno学号,Sname学生姓名,Sage学生年龄,Ssex学生性别 Teacher(Tno,Tname)教师表,Tno教师编号,Tname教师名称 Course(Cno,Cname,Tno)课程表,Cno课程编号,Cname课程名称,Tno教师编号 SC(Sno,Cno,score)成绩表,Sno学号,Cno课程编号,score成绩 1.统计学过“张三”老师所教的所有课的同学的学号,姓名2.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号,姓名3.统计下列各科成绩,各分数线人数:课程ID,课程名称,【100-85】,【85-70】,【70-60】,【小于60】我的解答:1.2.3.

March 26, 2019 · 1 min · jiezi

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

Group ByGroup By 谁不会啊?这不是最简单的吗?越是简单的东西,我们越会忽略掉他,因为我们不愿意再去深入了解它。1 小时 SQL 极速入门(一)1 小时 SQL 极速入门(二)1 小时 SQL 极速入门(三)——Oracle 分析函数SQL 高级查询——(层次化查询,递归)今天就带大家了解一下Group By 的新用法吧。ROLL UPROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。当向 ROLLUP 传入一列时,会得到一个总计行。SELECT factory, SUM(quantity)FROM productionGROUP BY ROLLUP(factory)ORDER BY factory结果:当向 ROLLUP 传递两列时,将会按照这两列进行分组,同时按照第一列的分组结果返回小计行。我们同时传入工厂和部门看一下。SELECT factory,department, SUM(quantity)FROM productionGROUP BY ROLLUP(factory, department)ORDER BY factory结果:可以看到对每一个工厂都有一个小计行,最后对所有的有一个总计行。也可以这样理解 如果 ROLLUP(A,B)则先对 A,B进行 GROUP BY,之后对 A 进行 GROUP BY,最后对全表 GROUP BY。如果 ROLLUP(A,B,C)则先对 A,B,C进行 GROUP BY ,然后对 A,B进行GROUP BY,再对 A 进行GROUP BY,最后对全表进行 GROUP BY.CUBECUBE 和 ROLLUP 对参数的处理是不同的,我们可以这样理解。如果 CUBE(A,B)则先对 A,B 进行 GROUP BY,之后对 A 进行 GROUP BY,然后对 B 进行 GROUP BY,最后对全表进行 GROUP BY.如果 CUBE(A,B,C)则先对 A,B,C 进行 GROUP BY,之后对 A,B ,之后对A,C ,之后对 B,C 之后对 A,之后对 B,之后对 C,最后对全表GROUP BY看一个简单的例子:SELECT factory,department, SUM(quantity)FROM productionGROUP BY CUBE(factory, department)ORDER BY factory,department;结果:可以看出来首先对 FACTORY,DEPARTMENT进行分组汇总,然后对FACTORY 分组汇总,之后对 DEPARTMENT 分组汇总,最后有一行全表汇总。GROUPINGGROUPING()函数只能配合 ROLLUP 和 CUBE 使用,GROUPING()接收一列,如果此列不为空则返回0,如果为空则返回1.我们用第一个ROLLUP例子举例SELECT GROUPING(factory), factory, department, SUM(quantity)FROM productionGROUP BY ROLLUP(factory, department)ORDER BY factory, department;结果:看到,最后一行的 FACTORY 为空,所以 GROUPING()返回 1.也可以与CUBE结合使用,方法是一样的。GROUPING SETSGROUPING SETS 与 CUBE 有点类似,CUBE是对参数进行自由组合进行分组。GROUPING SETS则对每个参数分别进行分组,GROUPING SETS(A,B)就代表先按照 A 分组,再按照 B分组。SELECT factory, department, SUM(quantity)FROM productionGROUP BY GROUPING SETS(factory, department)ORDER BY factory, department结果:可以看出来结果是按照工厂和部门分别分组汇总的。GROUPING_ID()GROUPING_ID()配合GROUPING()函数使用,GROUPING_ID(A,B)的值由GROUPING(A)与GROUPING(B)的值决定,如果GROUPING(A)为1,GROUPING(B)为0,则GROUPING_ID(A,B)的值为 10,十进制的 3.SELECT factory, department, GROUPING(factory), GROUPING(department), GROUPING_ID(factory,department), SUM(quantity)FROM productionGROUP BY CUBE(factory, department)ORDER BY factory, department;结果:有了GROUPING_ID列,我们就可以使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。 ...

March 8, 2019 · 1 min · jiezi

sql排序之rank,row_number,dense_rank的区别

–创建测试表create table te.sc(id int, name varchar(20),class varchar(20), score int);–给测试表插入数据insert into te.sc values (1,‘张飞’,‘一年一班’,100);insert into te.sc values (2,‘刘备’,‘一年一班’,99);insert into te.sc values (3,‘李逵’,‘一年一班’,95);insert into te.sc values (4,‘小动’,‘一年一班’,97);insert into te.sc values (5,‘小智’,‘一年一班’,80);insert into te.sc values (6,‘吕布’,‘一年二班’,67);insert into te.sc values (7,‘赵云’,‘一年二班’,90);insert into te.sc values (8,‘典韦’,‘一年二班’,89);insert into te.sc values (9,‘关羽’,‘一年二班’,70);insert into te.sc values (10,‘马超’,‘一年二班’,98);insert into te.sc values (11,‘张媛’,‘一年一班’,100);不管在oracle,还是在8.0版的mysql中,在排序的时候都可以用到三个函数:rank,row_number,dense_rank–列出每个班分数排名前三的学生 select * from (select id, name, class, score , row_number() over (partition by class order by score desc) as r1, rank() over (partition by class order by score desc) as r2 , dense_rank() over (partition by class order by score desc) as r3 from te.sc) B where r1<=3 ;id name class score r1 r2 r31 张飞 一年一班 100 1 1 111 张媛 一年一班 100 2 1 12 刘备 一年一班 99 3 3 210 马超 一年二班 98 1 1 17 赵云 一年二班 90 2 2 28 典韦 一年二班 89 3 3 3这三个函数的区别主要在分数一致的情况下,row_number()不重复排序,rank()重复且跳数字排序,dense_rank()重复且不跳数字排序。 ...

March 2, 2019 · 1 min · jiezi

oracle先排序再分页

Oracle排序分页查询和MySQL数据库的语句还不一样,这里做简单的记录。按操作时间排序1SELECT A., ROWNUM RN FROM (SELECT * FROM v_log) A ORDER BY operatetime DESC 结果可以发现,按时间排序了,但是rownum并不是从小到大,因为oracle是先生成rownum,再进行排序,需要在套一层查询按操作时间排序2SELECT T., rownum RN FROM( SELECT * FROM (SELECT * FROM v_log) ORDER BY operatetime DESC ) T结果:顺序正确,rownum正确,在此基础上再套一层查询进行分页按操作时间排序并分页SELECT T2.* from( SELECT T., rownum RN FROM(SELECT * FROM (SELECT * FROM v_log) ORDER BY operatetime DESC )T) T2 WHERE RN BETWEEN 1 and 10测试SELECT * FROM ( SELECT A.“sku”, ROWNUM rn, A.“goods_sn” FROM AMZ_HUOPIN_SKU A WHERE ROWNUM <= 10 ORDER BY A.“goods_sn” DESC) tempWHERE temp.rn > 0;SELECT A.“sku”, A.“goods_sn”, ROWNUM RN FROM AMZ_HUOPIN_SKU A ORDER BY A.“sku” DESC## 子查询先找出所有,然后再rownum,rownum 为伪列,后再排序SELECT A.“sku”, A.“goods_sn”, ROWNUM RN FROM (SELECT * FROM AMZ_HUOPIN_SKU) A ORDER BY A.“sku” DESC## 因为oracle是先生成rownum,再进行排序,需要在套一层查询,即先拍好序,然后再生成rownumSELECT T.“sku”, T.“goods_sn”, ROWNUM RN FROM (SELECT * FROM (SELECT * FROM AMZ_HUOPIN_SKU) ORDER BY “sku” DESC) T## 上边的这两个语句是等价的SELECT T.“sku”, T.“goods_sn”, ROWNUM RN FROM (SELECT * FROM AMZ_HUOPIN_SKU ORDER BY “sku” DESC) TSELECT T2. FROM(SELECT T.“sku”, T.“goods_sn”, ROWNUM RN FROM (SELECT * FROM AMZ_HUOPIN_SKU ORDER BY “sku” DESC) T) T2 WHERE RN BETWEEN 0 AND 10注:本文为转载,原文地址:oracle先排序再分页 ...

February 25, 2019 · 1 min · jiezi

对话 CTO〡和 PingCAP CTO 黄东旭聊开源数据库新蓝海

专栏介绍「对话 CTO」是极客公园的一档最新专栏,以技术人的视角聊聊研发管理者的发展和成长。本专栏由ONES 的创始人&CEO 王颖奇作为特邀访谈者。王颖奇曾参与金山软件 WPS、金山毒霸等大型软件的核心开发工作;2011 年创立了正点科技,旗下产品正点闹钟、正点日历在全球用户过亿;2014 年,王颖奇在知名美元基金晨兴资本任 EIR,并以个人身份参与十余家公司的管理咨询工作;2015 年,王颖奇创立 ONES,致力于提供企业级研发管理解决方案。摘要有像甲骨文这样的统治级巨头在,数据库市场还是个好的创业领域吗?在 PingCAP 联合创始人&CTO 黄东旭眼中,答案是肯定的,数据库行业的转折点已经到了。黄东旭曾在豌豆荚从事 infrastructure 相关工作,在分布式存储领域有着多年的积累和实战经验。在他看来,伴随着分布式数据库理念和技术的成熟,对传统数据库理念和技术的依赖正在走向瓦解。开源理念的普及也在加速数据库行业走向下一个阶段,「像数据库、操作系统、云技术,或者云内部的基础软件,未来只有开源一条路,如果不开源,或者说内核不开源的话,产品的生命力是很差的。」一切正在 PingCAP 中顺利落地。作为开源新型分布式数据库公司,PingCAP 研发了分布式关系型数据库 TiDB 项目,具备「分布式强一致性事务、在线弹性水平扩展、故障自恢复的高可用、跨数据中心多活」等核心特性。目前公司准生产测试用户 1400 余家,涉及互联网、游戏、银行、保险、证券、航空、制造业、电信、新零售、政府等多个行业。本期对话 CTO,我们请到了 PingCAP CTO 黄东旭来谈一谈他对于数据库行业的技术和行业演进的理解,以及商业公司究竟需要什么样的数据库。分布式数据库、开源数据库的蓝海机遇在哪?颖奇:PingCAP做的事情,我认为在中国工业领域上具有很大意义。因为几乎没有其他公司做过,你们是怎么想到做这件事的?黄东旭:中国过去也不是没有做数据库的公司,我们和他们不太一样在于,一是我们是类似于互联网公司,或者说创业公司的路径,是走融资发展的;二是技术上,我们公司是基于分布式数据库的理论成立的。过去三四十年,数据库市场都是依赖像 Oracle、IBM 所建立的理论基础运行。但在 21 世纪,Google 提出分布式系统技术后,随着硬件条件的成熟,像 SSD、万兆的网卡,带来的改变就是处理的数据量在持续地变大。数据库市场到了需要去做修订或者说要有个转折的地方了。数据库行业最根基的东西在发生变化,而这一块还没人做,所以说一定要找到正确的切入点。颖奇:你们找到的切入点是什么?黄东旭:就是分布式理论怎么跟传统关系数据库理论融合的点。最近这些硬件的革新,使得原来很多的假设都不成立了。比如过去大家可能觉得数据库的瓶颈是磁盘,想怎么设计一个更好的 B-Tree 能够让磁盘磁头转得少一点。但现在全是 SSD,甚至未来可能持久化内存的东西都出现了。过去分布式系统的网络这么慢,带宽这么小,所以尽可能都是在单机或者本地上去做。但现在基本上单机访问远程数据库和访问本地数据库在吞吐量上表现差不多了。还有就是选择「开源」。中国传统软件数据库的技术软件商业模式,跟传统的软件很像,就是做一个产品,招一堆销售挨家敲门。我们觉得这样效率太低。就现在而言,基础软件好不好关键是在于怎么在最短的时间找到最多人来去用这个产品,能够让它变得更好,变成一个正向循环。但传统软件招销售并不是一个特别好的选择,因为扩张速度取决于销售敲门的速度。颖奇:靠销售肯定来不及。黄东旭:所以我们喜欢「开源」。「开源」相当于用一些 to C 的方法论,在工程师的社区里通过病毒式传播让产品 adoption,别人用得不爽一定会 feedback 提 issue。用的人越多,它的质量就越好,质量越好,会变成一传十,十传百的这种效应,让产品正向循环下去。对于基础软件,我的观点是像数据库、操作系统、云技术,或者云内部的基础软件,未来只有开源一条路,如果不开源,或者说内核不开源的话,产品的生命力是很差的。不像其他的商业软件,基础软件就像在水管、水电煤这样的基础设施的层面上,你不开源的话别人也不敢用。颖奇:我们看到在中国实际上有两件事情之前没怎么做好。第一是特别基础的软件,第二是做一个特别好的开源公司,你们算是把两种结合起来的「鼻祖」。请问你们具体是怎么做的呢?黄东旭:我觉得有一点是因为 PingCAP 或者 TiDB 选的这个坑特别好。过去大家都知道 MySQL 数量大了以后只能 sharding,现在 TiDB 就是解决这个坑。大家都非常清楚这是个痛点,你不用去跟别人解释这就是一个非常厉害的内核代码。有需求有痛点,然后问题足够清晰,也足够大。颖奇:那你觉得开源这个事情会把PingCAP带到一个什么样的位置上?黄东旭:从数据库的角度上来看,大家会发现,最早的关系数据库 SQL、TSQL,在互联网或者移动互联网开始爆发的时候,数量开始膨胀,单机系统怎么样都搞不定的时候,互联网公司没有办法,只能去做了一套 NoSQL,但 NoSQL 又有点过了,就把原来的传统管理模型全都扔掉,但至少能把数据存下来。所以我觉得历史是螺旋式发展。其实这两年已经开始有这个趋势,就是新一代的数据库又开始回归 SQL 模型,可能未来持续十年会有一个关系型数据库的复兴吧。过去是因为分布式理论,以及硬件环境没有办法去跟这个模型很好地结合在一起。但至少以我们的经验来说,现在分布式基本上能满足很多需求。颖奇:所以传统数据库公司是在单机上解决这种数据的问题?黄东旭:对,我觉得未来数据一定是更大的状态,单机肯定是有问题的。硬件成本持续在下降,一定会到达一个临界点,就是数据本身的价值都比硬件成本要高,这样一来,我肯定是保护数据,怎么样把我的数据能无限存下来,并且能快速通过好用的接口来访问它。我觉得这个市场会很大,所以我从来都不跟别人说这个事情的天花板在哪里,因为我自己也不知道。颖奇:早期还是在数据价值比较大的行业里来应用会更好一些?黄东旭:我们早期策略上分两块,一块就是互联网公司,workload 数量很大,然后有很强的研发团队,开源社区的主力就是这帮人,随便用,而且我会很鼓励你们投人投精力去用它。还有一部分是一些高净值客户,比如银行,业务已经倒逼他们要去用一些互联网的技术去解决问题。比如说即使 Oracle 用得不好,迁到 TiDB 上其实也是很平滑的过程,同时可以保证多数据中心高可用、强一致等这些特性,用起来很省心。我觉得我们就是拿互联网最先进的技术给到传统公司,给他们赋能,而且让对方的迁移成本降得很低。「商业公司」如何管理「开源社区」颖奇:可以跟大家讲一下PingCAP对人才的要求和你们的管理方法吗?黄东旭:我一直信奉一句话,「Hire for attitude, train for skill」。首先你要打心底里认可这个事情,是一切往后谈的基础。这对我们来说不难,很多工程师他们还是有共同理想的。第二点就是研发人才的 skill set,我可能会更倾向于是在互联网,或者说在做这种大规模分布式系统。互联网人有个优势在于他们对新技术的接受度特别高,思想特别开放,没有一些条条框框的东西。第三点就是特别喜欢年轻人,我们会刻意地让团队里面有一些非常新鲜的血液。第四点的话我们并不强求,就是人的责任心和主人公意识,这其实跟我们的晋升体系有关。我们的晋升体系跟 Facebook 很像,团队在实际工作的时候,让员工的特点会慢慢浮现出来。比如说小明,每件事情交给他都特别靠谱。大家都公认觉得他是个靠谱的人,慢慢形成这样的效果。对于小公司来说,没办法把每个人每天的工作,每个任务都亲自去帮你规划好。所以我们的管理风格还算是比较粗放吧。颖奇:你们公司现在是有一些外籍工程师?黄东旭:对,我们也有一些外籍人士,大概七八个人吧。我们比较国际化。因为我们这个项目是开源的,用户用出问题了一般会去上面提一个 issue,很多国内用户直接用中文写 issue 上去,我们还有一个团队专门把中文 issue 翻译成英文,因为这个东西要同步嘛,在别人遇到同样问题去搜索的时候也能看到。颖奇:你们的TiDB或者TiKV里,我看到有几百个contributors,那里面有多少是外籍的?黄东旭:一半。包括我们的文档都是中英文一对一的比例。我觉得在哪做这个事情,这个问题已经不重要了。包括现在我们很多人才,在加入之前就已经是项目的粉丝,有些人甚至都不用面试,都不用看 GitHub,因为这个人天天就在 commit code。我们在国内的招聘方式也是挺特殊的,我们不太关心你到底在哪个城市工作。我们重度依赖像 Google Docs、Slack、GitHub、Jira、Confluence 这种生产力工具,基本上能够摆脱面对面的会议,这个是很重要的。我们不鼓励开长会,如果要开会,就开半个小时、15 分钟的短会。远程有个好处就是它会迫使工程师把所有想做的东西进行文档化,任何东西都可以被检索。我觉得这样更符合现代化的管理模式,有充足的时间,更加灵活地安排自己的生活,是一个更好的工作方式。颖奇:开源社区可能有一套管理模式,商业公司也有自己的管理模式,现在你们在这两边的管理模式是一样的还是说会有一些区别?黄东旭:我们是一样的。你可以认为我们自己的员工跟社区小伙伴的区别,就 TiDB 内核部分的开源来说,唯一区别就是我们给他们工资。颖奇:你觉得未来中国会有很多这样的工作出现吗?黄东旭:我觉得在技术软件行业会越来越多。颖奇:早期美国的很多开源软件没有太多资本介入,所以发展周期会很长。你觉得资本介入会使得开源软件发展周期变短吗?黄东旭:没有资本介入,或者说没有商业公司在后面支持的话,开源软件都不会有太强的生命力。开源我认为是分成两个阶段,一个是 1.0,一个是 2.0。1.0 是当年像 Glue、 GCC、Linux 内核这些项目;2.0 是就最近的这几年像 Eclipse、MongoDB、Databricks 这些开源软件公司,这些模式其实是更先进的,或者更加符合现在时代的做法。中国其实过去没有这样的东西,我们算是第一波。颖奇:早期的开源公司商业化诉求没那么快,所以贡献者相对平等,也没有经济回报。现在您这边的项目里有两种方式,可能一百个工程师是拿回报的,另外一百个可能是不拿回报的。那现在一个项目里混杂了两种组合方式,你们的解决方案是什么?黄东旭:我觉得其实这个问题的本质是:为什么要来(社区)。两种情况,一种就是我实际就在用这个东西,发现这个东西不好,某些地方有 bug 或者说某些地方的功能不是我想要的,我想要去改进它。大多数机构都是出于这种思路来贡献的。第二种人就是纯粹为了做出成就感。觉得这事情很不错,我能参与到这个项目来了,「I want to help」,我想去帮助别人,同时我能够得到证明,我是这个项目的 heavy contributor、committer,得到尊敬或者认同感。对每一个 contributor,哪怕提交一行代码或者修改一个文档,我们都会给他一个大礼包,包括贴纸、杯子等等周边产品。如果贡献比较多的话,我会亲手给你写一封明信片表达感谢,包括我们每年办的这些大会,只要是 contributor 都是免费的。颖奇:我觉得这个挺棒的。再问最后一个问题,你可以推荐几本书,给已经是CTO或准备想当CTO的人学习和借鉴。黄东旭:我有几本书是很喜欢的,《Unix 编程艺术》是到目前来说对我影响最大的跟编程和计算机相关的书。更技术一点的是《Unix 环境高级编程 (APUE) 》。很多人想学编程可能看这本书够了,其他什么书都不用买,就这个。还有《大教堂与集市》,这个介绍 open source 的原始出发点。然后我最近在读《毛选》,还有王小波的小说。颖奇:《Unix编程艺术》这本我也会推荐给年轻人看。这本书对我的影响非常大,读完使得我对整个计算机的软件体系结构有了非常深刻的认识。第一次读是在13年前了,至今对我的工作和创业都有很大的帮助。非常感谢东旭今天的分享。本文作者:王颖奇,联系方式:wangyingqi@gmail.com ...

February 21, 2019 · 1 min · jiezi

执行计划小总结

why工作中偶尔会遇到性能不好的复杂sql语句,在定位不了问题的情况下就需要执行计划出马了。2. what执行计划顾名思义,就是oracle内部执行Sql语句的详细计划步骤。当然,其他数据库比如mysql、sqlsever等也有这个概念。本文以我常用的oracle为例。3. how如可查看执行计划?其实有很多种方法。最简单的,用IDE自带组件,比如sql developer上的查看执行计划按键(快捷键F10)稍微复杂点的,用代码查看:EXPLAIN PLAN FOR (SELECT * FROM TEMP);–方法1SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY(‘PLAN_TABLE’));–方法2SQL> select * from table(dbms_xplan.display);–方法34. then解读执行计划join的时候,有三种方式:hash join、 merge join、nested loopA、B两表谁在前谁在后并不影响执行计划,计划会自动算出最优的执行方法当nested loop,最优执行计划一般是小表作为驱动表只遍历一遍。Nested loop一般用在连接的表中有索引,并且索引选择性较好的时候;Hash join在两个表的数据量差别很大的时候.Sort Merge join 用在没有索引,并且数据已经排序的情况.通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。

February 20, 2019 · 1 min · jiezi

蚂蚁金服分布式链路跟踪组件 SOFATracer 总览 | 剖析

2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动。SOFA Scalable Open Financial Architecture是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 SOFATracer是一个用于分布式系统调用跟踪的组件,通过统一的 TraceId将调用链路中的各种网络调用情况以日志的方式记录下来,以达到透视化网络调用的目的,这些链路数据可用于故障的快速发现,服务治理等。 本文为《剖析| SOFATracer 框架》第一篇。《剖析 | SOFATracer 框架》系列由 SOFA团队和源码爱好者们出品,项目代号:<SOFA:TracerLab/>,文章尾部有参与方式,欢迎同样对源码热情的你加入。0. 前言在单体应用时代,我们不需要花费时间去关心调用链路这个东西。但是链路跟踪不仅仅是在分布式场景下才会有,即使是单体应用,同样也会存在调用链路。例如,我们把应用中的每个服务接口作为一个链路节点,那么从请求进来到返回响应,把这个过程中多历经的所有的方法接口串联起来,就能组成一条完整的链路,如下图所示:对于单体应用而言,如果访问一个资源没有成功,那么我们可以很快的锁定是哪一台机器,然后通过查询这台机器上的日志就能定位问题。但是在微服务体系架构下,这种方式会显得非常无力。对于一个稍具规模的应用来说,一次请求可能会跨越相当多的服务节点,在这种情况下,如果一个请求没有得到成功的响应,就不能确定到底是哪个节点出了问题。因此在面对这种复杂的大规模分布式集群来实现的服务体系来说,就需要一些可以帮助理解各个应用的线上调用行为、并可以分析远程调用的组件。基于上述背景,蚂蚁金服开源了基于 OpenTracing 规范 (http://opentracing.io/documen…)实现的 SOFATracer 分布式链路跟踪组件,为实施大规模服务化体系架构场景下提供了链路跟踪的解决方案。在介绍 SOFATracer 之前,先来了解一下 Opentracing 规范。1. Opentracing 简介首先来解释下 OpenTracing 是什么OpenTracing 致力于为分布式跟踪创建更标准化的API和工具,它由完整的API规范、实现该规范的框架、库以及项目文档组成。OpenTracing 提供了一套平台无关、厂商无关的 API,这样不同的组织或者开发人员就能够更加方便的添加或更换追踪系统的实现。 OpenTracing API 中的一些概念和术语,在不同的语言环境下都是共享的。1.1 数据模型Opentracing 规范中,一条 trace 链路是由多个与之关联的 span 组成,一条链路整体可以看做是一张有向无环图,各个span之间的边缘关系被称之为“References”。下面是官方提供的示例:如果以时间轴维度来看的话,也可以表现为下面的形式(官方示例):root span : 当前链路中的第一个 spanChildOf 和 FollowFrom 是目前被定义的两种 References类型 ChildOf : 父 Span 以某种身份依赖于子Span FollowFrom : 父 Span 不以任何方式依赖子 Span但是为了简化 span 之间的这种依赖关系,在具体实现时通常会将具有嵌套关系的作为 ChildOf,平行执行的作为FollowFrom,比如:a. ChildOf 示例在 methodA 中调用了 method B :methodA(){ // spanA start methodB(); } // spanA finishmethodB(){ // spanB start} // spanB finish产生的 span 在时间维度上展现的视角如下:这种关系一般会表示为 SpanB ChildOf SpanA 。b. FollowFrom 示例method 方法中,methodA 执行之后 methodB 执行 :method(){ methodA(); methodB();}产生的 span 在时间维度上展现的视角如下:这种关系一般会表示为 SpanB FollowFrom SpanA 。1.2 APIOpentracing API 是对分布式链路中涉及到的一些列操作的高度抽象集合。Opentracing 中将所有核心的组件都声明为接口,例如 Tracer、Span、SpanContext、Format(高版本中还包括 Scope 和 ScopeManager)等。SOFATracer 使用的版本是 0.22.0 ,主要是对 Tracer、Span、SpanContext 三个概念模型的实现。下面就针对这三个组件结合 SOFATracer 来分析。1.3 SOFATracer 标准实现下图为 SOFATracer 中对于这三个核心接口实现的类图结构:由于篇幅原因,下面的介绍过程中一些点不会展开说明,有兴趣的同学可以自行官网查看完整的 OpenTracing-api 规范 (https://opentracing.io/specif…)。a. Tracer & SOFATracerTracer 是一个简单、广义的接口,它的作用就是构建 span 和传输 span 。核心接口列表如下:SofaTracer 实现了 Tracer 接口,并扩展了采样、数据上报等能力。b. Span & SOFATracerSpanSpan 是一个跨度单元,在实际的应用过程中,Span 就是一个完整的数据包,其包含的就是当前节点所需要上报的数据。核心接口列表如下:关于tags和log的解释:如果把从进入公司到离开公司这段时间作为一个 span,那么 tags里面可以是你写的代码,你喝的水,甚至你讲过的话;log 则更关注某个时刻的事,比如在12:00 去吃了个饭,在15:00 开了个会。 如果说tags 里面都是和公司有关的,那么 Baggage 里面则不仅仅是局限于你在公司的事,比如你口袋里的手机。SofaTracerSpan 在实现 Span 接口,并扩展了对 Reference、tags、线程异步处理以及插件扩展中所必须的 logType 和产生当前 span 的 Tracer 类型等处理的能力。c. SpanContext & SOFATracerSpanContextSpanContext 对于 OpenTracing 实现是至关重要的,通过 SpanContext 可以实现跨进程的链路透传,并且可以通过 SpanContext 中携带的信息将整个链路串联起来。官方文档中有这样一句话:“在 OpenTracing 中,我们强迫 SpanContext 实例成为不可变的,以避免 Span在finish 和 reference 操作时会有复杂的生命周期问题。” 这里是可以理解的,如果 SpanContext在透传过程中发生了变化,比如改了 tracerId,那么就可能导致链路出现断缺。SpanContext 中只有一个接口:SofaTracerSpanContext 实现了 SpanContext 接口,扩展了构建 SpanContext、序列化 baggageItems 以及SpanContext等新的能力,除此之外,SpanContext 在跨进行透传时携带的信息进行了规范:2. SOFATracer 扩展为了满足在复杂场景下的链路跟踪需求,SOFATracer 在 Opentracing 规范基础上又提供了丰富的扩展能力。2.1 SOFATracer 架构及功能扩展SOFATracer 基于 OpenTracing 规范(https://opentracing.io/specif…)实现,并且通过 Disruptor (https://github.com/LMAX-Excha…。基于 SLF4J 的 MDC 扩展能力应用在通过面向日志编程接口 SLF4J 打印应用日志时,可以只在对应的日志实现配置文件的 PatternLayout 中添加相应的参数即可,如添加 [%X{SOFA-TraceId},%X{SOFA-SpanId}] ,那么应用日志就可以在发生链路调用时打印出相应的 TraceId 和 SpanId ,而无论应用具体的日志实现是 Logback、Log4j2 或者 Log4j。关于这部分的实现原理,期待大家一起编写,领取方式见文末。SOFATracer 的埋点机制SOFATracer 目前仅提供了基于自身 API 埋点的方式。SOFATracer 中所有的插件均需要实现自己的 Tracer 实例,如 Mvc 的 SpringMvcTracer 、HttpClient 的 HttpClientTracer 等,如下图所示:SOFATracer 将不同的扩展组件分为 AbstractClientTracer 和 AbstractServerTracer,再通过AbstractClientTracer 和 AbstractServerTracer 衍生出具体的组件 Tracer 实现。这种方式的好处在于,所有的插件实现均有 SOFATracer 本身来管控,对于不同的组件可以轻松的实现差异化和定制化。但是为了能够拥抱社区,我们在后续的版本中将会提供基于 Opentracing API 的埋点扩展实现,从而实现与 opentracing-contrib 的无缝对接。基于 Opentracing API 的插件埋点方案如下图所示:关于 SOFATracer 基于特有 API 埋点的实现以及如何实现对接 OT-api 埋点,期待大家一起编写,领取方式见文末。SOFATracer 的数据上报机制SOFATracer 中并没有将不同的 Reporter 设计成不同的策略,然后根据不同的策略来实现具体的上报操作,而是使用了一种类似组合的方式,并且在执行具体上报的流程中通过参数来调控是否执行具体的上报。从流程图中可以看到,此过程中涉及到了三个上报点,首先是上报到 zipkin,后面是落盘;在日志记录方面,SOFATracer 中为不同的组件均提供了独立的日志空间,除此之外,SOFATracer 在链路数据采集时提供了两种不同的日志记录模式:摘要日志和统计日志,这对于后续构建一些如故障的快速发现、服务治理等管控端提供了强大的数据支撑。关于数据上报,期待大家一起编写,领取方式见文末。SOFATracer 的采样机制对于链路中的数据,并非所有的数据都是值得关注的。一方面是可以节约磁盘空间,另一方面可以将某些无关数据直接过滤掉。基于此,SOFATracer 提供了链路数据采样能力。目前我们提供了两种策略,一种是基于固定比率的采样,另一种是基于用户扩展实现的自定义采样;在自定义采样设计中,我们将 SofaTracerSpan 实例作为采样计算的条件,用户可以基于此实现丰富的采样规则。关于采样机制,期待大家一起编写,领取方式见文末。SOFATracer 链路透传机制关于透传机制,我们不仅需要考虑线程内传递,还需要考虑跨线程以及异步线程场景,对于分布式链路来说,最核心还有如何实现跨进程的数据透传。关于 SOFATracer 链路透传 以及 OpenTracing 新规范中对线程传递的支持,期待大家一起编写,领取方式见文末。2.2 SOFATracer RoadMap首先介绍下目前 SOFATracer 的现状和一些正在做的事情。SOFATracer 版本说明:3.x 版本支持 webflux 等,基于分支发布。2.x 版本基于master 发布,目前版本是 2.3.0 。点击阅读更多,查看更多详情 ...

February 19, 2019 · 2 min · jiezi

ORACLE 简单列转行操作-Pivot

ORACLE 简单列转行操作本文主要简单介绍下pivot 这个函数这个函数是oracle 11g的时候新加的,相比之前要自己拼语句要来的简单多该函数的固定用法to be continue…参考文档:Pivot 和 Unpivot

February 19, 2019 · 1 min · jiezi

最佳实践 | OceanBase事务引擎的技术创新

颜然,蚂蚁金服 OceanBase 团队资深技术专家,OceanBase 初创成员之一,目前负责事务引擎以及性能优化相关的研发工作。以下为演讲实录:首先,我们先来聊一个大家都很感兴趣的话题:跟已有的经典数据库比如:Oracle、SQL Server等,OceanBase跟他们最大的区别在哪里?OceanBase是一个云原生的数据库。而我们所做的软件全部是基于硬件的基础之上。那么,我们首先就需要了解现在的硬件到底处在什么水平?如上图所示,IBM的解决方案是最为大家所熟识的,从五十多年前的System 360到去年新出的IBM z14,时至今日依然还有很多机构在沿用这套解决方案。我们每天都在说云计算,那么到底什么是云计算?云计算不是从石头缝里蹦出来的解决方案,它最早起源于DEC的小型机。DEC是和IBM大型机同时代的产物,以较低的价格解决存储和计算的需求。它与IBM大型机的区别在于:DEC价格低,获得方式更灵活。DEC之后被基于芯片的解决方案打破了,诸如SUN工作站的解决方案提供了更好的性能和更低价格,平台也更通用。再之后PC Server接过接力棒,此时的CPU、内存、存储可以来自于不同的厂商,但大家组合起来以后仍然可以提供一套标准化的计算和存储的平台。相比较IBM大型机,基于PC Server的数据中心以一种更产业链化的方式提供了计算和存储的解决方案,具有更好的性价比,也更易于扩展。但是IBM大型机是软硬一体化设计,这也是大型机满足需求可以采用很多硬件层面的解决思路。例如,金融业务对于高可靠性的需求,大型机是在硬件层面做了多种可靠性保障,从存储到内存甚至CPU都是有冗余策略来支持。但是PC Server的单台机器的故障率相对来说是高的,所以需要使用完全不同的思路来解决业务高可靠和高可用的需求。此处引用OceanBase团队创始人阳振坤的一句话——“计算机天然不适合数据库,但数据库天然选择了计算机”。为什么计算机天然不适合数据库?因为在处理数据的时候,一个非常关键的问题就是数据的可靠安全和一致。而计算机的硬件天然具有各种概率的损坏,不管是掉电,软件出Bug,操作系统有问题,还是整个机房都挂掉,计算机是天然会出错的。但我们要解决的问题又是不能出错,所以在计算机上去解决数据库的可靠安全一致性的问题,其实是一个非常大的挑战。要在一个更低可靠性的机器上实现更可靠的数据库的事务服务能力,这就是我们当前所面临的严峻挑战。OceanBase事务当然,有挑战的地方就有机遇。OceanBase在面对这样的挑战之下我们做了什么?在这样的一个基于PC Server的云化环境下,OceanBase实现了弹性扩展的能力,同时实现了不依赖高端硬件解决数据库事务的高可靠和高可用的能力。OceanBase所依赖的硬件条件是一套通用的云化环境。但在这个硬件基础上,我们依然可以做到数据库的事务,同样能够实现高性能,甚至能够支撑金融级的可靠性。何谓金融级可靠性?每个人都会有切身的感受。比如说你发了一条帖子,但是这条帖子丢了,你可能会不爽,但是不至于非常难受。再换一个场景,今天你给朋友转账100元,你朋友却只收到98元,此时你的内心一定是恐惧的。所以在这种金融级场景下,必须做到的就是为用户提供充足的保障,这就叫做金融级可靠性。但金融级可靠性的难度在于对细节的处理能力。细节是魔鬼,我们在做数据库软件的时候,需要对细节的把控能力极强。这里要重点提到的几点,其实就延续着数据库事务的几个重要的特性。OceanBase架构下事务 ACID 的实现方式:Durability:事务日志使用 Paxos做多副本同步Atomicity:使用两阶段提交保证跨机事务原子性Isolation:使用多版本机制进行并发控制Consistency:保证唯一性约束OceanBase存储引擎OceanBase的架构基于LSM Tree。为什么会基于LSM Tree?它有哪些特点?在经典的数据库里,所有的数据是分片保存在持久化存储里的,比如磁盘或者SSD。在读取数据的时候,一定要先把它放在内存里。当需要做修改的时候,也要把一块数据放在内存里。如果内存满了之后,就会把这个页面刷回去。OceanBase所基于的LSMTree,可以把更多的修改更集中地放在一个内存结构里。我们的做法是在后台定期地做这件事情,前台把数据尽可能存更久的时间,然后再让后台去做合并。OceanBase有一个机制叫每日合并,也就是说如果前台能存一天的时间,我们到了每天夜里才做后台合并这件事情。OceanBase会在系统内部做调度,第一台机器在后台刷脏页的时候,让业务的流量都跑在其他机器上,就可以不影响前台的业务。当第一台完成后,再把业务的流量切回来,然后让第二台机器做后台刷脏页的操作。我们通过这种“轮转合并”的方法解决在集群环境下利用不同机器不同服务的时间差去做刷脏页这件事情。OceanBase事务引擎设计也利用了LSM Tree的结构,让事务的所有执行状态都保存在内存中,只有事务提交之后才会把事务修改的数据持久化。所以在实现事务原子性时,不需要做undo。这样OceanBase可以以一个更简洁的方式来做数据库的事务。这个就是OceanBase存储引擎的整体逻辑。OceanBase内存事务引擎OceanBase的事务执行操作都在内存里发生。内存跟硬盘一个最大的差别,就是内存是可以以字节为单位进行随机寻址的,而这带来的一个非常大的好处就是使得数据结构更丰富了。举个例子,如上图表格中的数据,现在要对第一行数据进行更新:条件是给Han加50万薪水。现在需要给这张表格中这一列对应的Han写一个新的值。在内存里的表示方法就是这样一个链表。如果Han涨了薪水以后突然希望换部门接受全新的挑战,我们就需要再做一次更新操作。只需要在这个列表里串上一次新的更新把他的部门进行更改。他从研发部门转到投资部门了,那我们就把这一列对应的修改记录在这里。这个是数据库内部基于多版本的一种并发控制,记录了每一次更新发生的时间,保证了修改操作跟读取操作不会互相影响。因为即使一行数据被改了,我们还是可以直接拿到历史数据。基于链表的数据结构对程序员来说是非常友好的。相比较经典的基于硬盘的数据库,无论数据读取还是写入都是定长数据块为单位的操作,表达信息的方式也是基于块的。OceanBase的方式带来的一个最大的好处就是大大提升了表达的简洁性,也就是它本身的操作效率要高特别多。这也解释了了为什么OceanBase能在目前的硬件环境下提供更强的事务处理能力,这是其中一个很重要的原因。我们再回顾一下OceanBase的架构,OceanBase把数据分片了之后,可以在多个集群里的多台机器上把数据扩展出去做存储,它提供了线性扩展能力。像上图所示同样一份数据会有多个副本,比如P0在三台机器上,这三台机器可能在同一个机房,也可能来自不同机房。但是它们会服务于同一份数据,其中只有一个是当前的主,它负责做数据库的操作,并且把数据库事务的修改同步到其他的机器上。我们这里提到OceanBase的数据组织与分布的目的就是要解决后面数据库的可靠性问题。可靠性 vs 可用性高可靠和高可用是被所有数据库产品广泛提及的概念。那么,可靠性和可用性到底意味着什么?传统的数据库,ACID的理论里并没有availability这个概念,只保证了durable。但是数据不丢,却不一定能保证服务的连续性。但是failover的能力在实际的系统中却是非常重要的。所以所有的商业数据库都有对应的解决可用性的方案。其中经典的就是基于主备同步的方案,当主坏掉的时候,备可以继续提供服务,这就是在解决可用性的问题。OceanBase采用Paxos协议来解决可靠性和可用性的问题。任何一个数据库的事务要做持久化,事务的日志都需要持久到多个副本上。在三个副本之中,我们认为只要持久化到两个副本的硬盘上,就定义为这个事务是成功的。也就是说有任何一台机器坏了的时候,至少还有一个副本在。那么,反过来思考是不是同步到越多的机器上越好?如果三个副本都同步到,是不是就更加可靠了?这就是可用性所带来的问题,如果其中有一台机器网络出现故障,或者系统负载太高无法响应,你是否认为这个事务成功?如果要求三个都成功的话,就不能认为它成功,因为有一台机器没响应。Paxos协议只要求两个机器同步到,就是即便有一个没有应答,我们依然认为这个事务是成功的,因为多数派成功了。保证三个里面有一个坏掉是不受影响的,同时也不影响系统的持续服务。这是在可靠性和可用性中间的一个很好的平衡。如果你需要更高的保障,就可以选择五个副本的方案,这样可以保证有两台机器出故障的时候,同样既不影响可靠性,也不影响可用性,这是一个很重要的平衡点。所以我们在ACID里再加入一个A,也就是我们既要让事务有可靠性,也要让事务的处理能力有可用性。分布式事务二阶段提交协议数据库在单机上写日志一定是只写自己机器上的日志文件,如果写成功了就成功,不成功就失败。但是在多台机器上的时候就涉及到:A机器成功了,B机器失败了。这件事情该怎么办?两阶段提交协议的存在就是为了解决这个问题,也就是说提交再也不能是一次性就成功的,它要涉及到多个机器之间达成一致,每台机器都成功了最终才能定义为成功。事实上,两阶段提交协议在实际应用中非常少。为什么呢?主要因为它很复杂,虽然理论很漂亮,但是存在的细节问题特别多。但是在OceanBase的业务场景下又一定要用两阶段提交协议来解决。OceanBase的基础是每一个参与者都是高可用的,因为OceanBase使用了Paxos协议保证了Partition高可用,所以任何一台机器的故障不会导致服务停止,这是一个很重要的前提。另外,因为Paxos同步引入了跨网络、跨机房的同步延迟,原始的两阶段提交协议多次写日志会带来较多的开销,OceanBase做了一件事情就是让协调者不写日志,只保留内存状态。它带来的一个非常重要的好处就是commit延迟低。同时因为所有参与者都是高可用的,我们不会出现两阶段状态一般会出现的问题,比如协调者宕机卡住的问题。OceanBase事务隔离事务隔离涉及到事务的并发控制怎么做,OceanBase使用的是多版本并发控制。读取请求会拿到当前系统的publish version作为读取的快照版本。事务提交的时候会生成一个版本号,版本号是连续递增的,作为本事务所有修改数据的版本。单机场景下,一条日志就能决定这个事务最终是否能够提交。那么这条日志的位置就决定了这个事务的版本号,它的版本号一定是递增连续的。但是在分布式事务参与进来之后,举个例子,就会出现230可能是一条prepare日志,prepare日志不代表这个事务能够提交,但是232可能是另外一个事务的commit日志,这也就意味着这个事务要commit的话,232版本就需要可读,但是230又处在行锁未解事务进行中的状态。这个时候就需要另外一种控制方法,对于两阶段提交的prepare和commit之间的事务,这些事务所有操作的行要锁住,不允许读取。这个影响很小是因为在prepare和commit之间不涉及到用户的任何干预,是一个毫秒级的操作,也就是说,这个行在提交的过程中会在一个很短的瞬间被锁住。这个瞬间里读取操作会等待事务提交掉,再去判断该不该读这一行的数据。总结基于以上的技术创新,OceanBase真正实现了在云环境下事务的高可靠、高可用,同时还具有很好的性能。希望OceanBase可以帮助更多的业务解决数据存储和查询的需求,不再受困于传统商业数据库的价格高、扩展性差的问题。

January 28, 2019 · 1 min · jiezi

Mybatis增删改查之Oracle

Mybatis增删改查之Oracle一. 查询普通查询(返回普通的持久层对象,由于数据库字段风格和java不同,所以建立一个map映射)<resultMap type=“com.xxx.domain.RuleCondition” id=“RuleConditionResultMapWithoutBondList”> <id column=“RC_ID” jdbcType=“NUMERIC” property=“ruleConditionId”/> <result column=“RULE_CAT1” jdbcType=“VARCHAR” property=“ruleCatOne”/> <result column=“RULE_CAT2” jdbcType=“VARCHAR” property=“ruleCatTwo”/> <result column=“RC_OPER_TYPE” jdbcType=“VARCHAR” property=“ruleOperateSymbol”/> <result column=“RULE_REF” jdbcType=“VARCHAR” property=“ruleRef”/> <result column=“START_EFFECT_TIME” jdbcType=“VARCHAR” property=“effectTimeOfStart”/> <result column=“END_EFFECT_TIME” jdbcType=“VARCHAR” property=“effectTimeOfEnd”/> <result column=“BOND_CODE_1” jdbcType=“VARCHAR” property=“bondCodeOne”/> <result column=“BOND_CODE_2” jdbcType=“VARCHAR” property=“bondCodeTwo”/> <result column=“BP_THRESHOLD” jdbcType=“NUMERIC” property=“bpThreshold”/> <result column=“RC_STATUS” jdbcType=“VARCHAR” property=“ruleStatus”/> <result column=“OPERATOR_ID” jdbcType=“VARCHAR” property=“operatorId”/> <result column=“LAST_UPDATED_DATE” jdbcType=“DATE” property=“lastUpdateTime”/> </resultMap> <select id=“getRuleConditionWithoutBondListById” resultMap=“RuleConditionResultMapWithoutBondList”> select RC_ID, RULE_CAT1, RULE_CAT2, RC_OPER_TYPE, RULE_REF, START_EFFECT_TIME, END_EFFECT_TIME, BOND_CODE_1, BOND_CODE_2, BP_THRESHOLD, RC_STATUS, LAST_UPDATED_DATE FROM RULES_CONDITION WHERE RC_ID = #{ruleConditionId,jdbcType=NUMERIC} </select>带有自定义对象的查询(带了一个List)<!–collection中的就是查询附带的list的函数 property是java中list的属性名–><resultMap type=“com.xxx.domain.RuleCondition” id=“RuleConditionResultMap”> <id column=“RC_ID” jdbcType=“NUMERIC” property=“ruleConditionId”/> <result column=“RULE_CAT1” jdbcType=“VARCHAR” property=“ruleCatOne”/> <result column=“RULE_CAT2” jdbcType=“VARCHAR” property=“ruleCatTwo”/> <result column=“RC_OPER_TYPE” jdbcType=“VARCHAR” property=“ruleOperateSymbol”/> <result column=“RULE_REF” jdbcType=“VARCHAR” property=“ruleRef”/> <result column=“START_EFFECT_TIME” jdbcType=“VARCHAR” property=“effectTimeOfStart”/> <result column=“END_EFFECT_TIME” jdbcType=“VARCHAR” property=“effectTimeOfEnd”/> <result column=“BOND_CODE_1” jdbcType=“VARCHAR” property=“bondCodeOne”/> <result column=“BOND_CODE_2” jdbcType=“VARCHAR” property=“bondCodeTwo”/> <result column=“BP_THRESHOLD” jdbcType=“NUMERIC” property=“bpThreshold”/> <result column=“RC_STATUS” jdbcType=“VARCHAR” property=“ruleStatus”/> <result column=“OPERATOR_ID” jdbcType=“VARCHAR” property=“operatorId”/> <result column=“LAST_UPDATED_DATE” jdbcType=“DATE” property=“lastUpdateTime”/> <collection column=“RC_ID” property=“bondList” ofType=“com.xxx.domain.RuleBond” select=“getBondListByRuleConditionId”> </collection> </resultMap> <resultMap type=“com.xxx.domain.RuleBond” id=“RuleBondResultMap”> <id column=“RB_ID” jdbcType=“NUMERIC” property=“ruleBondId”/> <id column=“RC_ID” jdbcType=“NUMERIC” property=“ruleConditionId”/> <result column=“BOND_CODE” jdbcType=“VARCHAR” property=“bondCode”/> <result column=“SECURITY_TERM” jdbcType=“VARCHAR” property=“term”/> <result column=“BID_STRATEGY_ID” jdbcType=“VARCHAR” property=“bidStrategyId”/> <result column=“OFR_STRATEGY_ID” jdbcType=“VARCHAR” property=“ofrStrategyId”/> <result column=“STATUS” jdbcType=“VARCHAR” property=“status”/> <result column=“OPERATOR_ID” jdbcType=“VARCHAR” property=“operatorId”/> <result column=“LAST_UPDATED_DATE” jdbcType=“DATE” property=“lastUpdateTime”/> </resultMap><!–查询语句–> <select id=“getRuleConditionBOsByEnumValue” resultMap=“RuleConditionBOResultMap”> select RC_ID, RULE_CAT1, RULE_CAT2, RC_OPER_TYPE, RULE_REF, START_EFFECT_TIME, END_EFFECT_TIME, BOND_CODE_1, BOND_CODE_2, BP_THRESHOLD, RC_STATUS, LAST_UPDATED_DATE FROM RULES_CONDITION WHERE RULE_CAT1 = #{enumValue,jdbcType=VARCHAR} </select><!–附带List的查询语句–> <select id=“getBondListByRuleConditionId” resultMap=“RuleBondResultMap”> select RB_ID, RC_ID, t1.BOND_CODE, t2.SECURITY_TERM, BID_STRATEGY_ID, OFR_STRATEGY_ID, t1.STATUS, t1.LAST_UPDATED_DATE FROM RULES_BOND t1 left join BOND_BASIS_INFO t2 on t1.BOND_CODE = t2.BOND_CODE WHERE RC_ID = #{ruleConditionId,jdbcType=NUMERIC} </select>二. 新增普通新增 <insert id=“addRuleBond” parameterType=“com.xxx.domain.RuleBond”> insert into RULES_BOND (RB_ID, RC_ID, BOND_CODE, BID_STRATEGY_ID, OFR_STRATEGY_ID, STATUS, OPERATOR_ID, LAST_UPDATED_DATE) values (SEQ_RULES_BOND.nextVal, #{ruleConditionId,jdbcType=NUMERIC}, #{bondCode,jdbcType=VARCHAR}, #{bidStrategyId,jdbcType=VARCHAR}, #{ofrStrategyId,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{operatorId,jdbcType=VARCHAR}, systimestamp) </insert>返回主键(多了一个selectkey)<!–selectkey中 keyproperty是写java中属性名称 后面的values中将得到的ruleBondId赋值即可–><insert id=“addRuleBond” parameterType=“com.xxx.domain.RuleBond”> <selectKey resultType=“java.lang.Integer” order=“BEFORE” keyProperty=“ruleBondId”> SELECT SEQ_RULES_BOND.Nextval from DUAL </selectKey> insert into RULES_BOND (RB_ID, RC_ID, BOND_CODE, BID_STRATEGY_ID, OFR_STRATEGY_ID, STATUS, OPERATOR_ID, LAST_UPDATED_DATE) values (#{ruleBondId,jdbcType=NUMERIC}, #{ruleConditionId,jdbcType=NUMERIC}, #{bondCode,jdbcType=VARCHAR}, #{bidStrategyId,jdbcType=VARCHAR}, #{ofrStrategyId,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{operatorId,jdbcType=VARCHAR}, systimestamp) </insert>批量新增参照网上写了一下,一直报缺失表达式,原来是insert into后面 是不需要 values的;还有就是关于Oracle返回主键List ,我在网上暂时还没找到能正确执行的例子 ,求大佬告知<insert id=“addRuleBondList” parameterType=“java.util.List”> insert into RULES_BOND (RB_ID, RC_ID, BOND_CODE, BID_STRATEGY_ID, OFR_STRATEGY_ID, STATUS, OPERATOR_ID, LAST_UPDATED_DATE ) SELECT SEQ_RULES_BOND.NEXTVAL,t.* FROM ( <foreach close=")" collection=“ruleBonds” item=“item” index=“index” open="(" separator=“union ALL”> select #{item.ruleConditionId,jdbcType=NUMERIC}, #{item.bondCode,jdbcType=VARCHAR}, #{item.bidStrategyId,jdbcType=VARCHAR}, #{item.ofrStrategyId,jdbcType=VARCHAR}, #{item.status,jdbcType=VARCHAR}, #{item.operatorId,jdbcType=VARCHAR}, systimestamp from dual </foreach> ) t </insert>批量新增,存在则插入<insert id=“generateBaselines” parameterType=“java.util.List”> MERGE INTO RULES_CONDITION t USING ( <foreach collection=“ruleConditions” item=“item” index=“index” separator=“union”> select #{item.ruleConditionId,jdbcType=NUMERIC} id, #{item.ruleCatOne,jdbcType=VARCHAR} cat1, #{item.ruleCatTwo,jdbcType=VARCHAR} cat2, #{item.bondCodeOne,jdbcType=VARCHAR} code1, #{item.bondCodeTwo,jdbcType=VARCHAR} code2, #{item.ruleOperateSymbol,jdbcType=VARCHAR} symbol, #{item.operatorId,jdbcType=VARCHAR} u from DUAL </foreach>) t1 <!– 哪些条件相符–> ON (t.RULE_CAT1 = t1.cat1 AND t.RULE_CAT2 = t1.cat2 AND t.RC_OPER_TYPE = t1.symbol) <!–符合条件时–> WHEN MATCHED THEN UPDATE SET t.BOND_CODE_1 = t1.code1,t.BOND_CODE_2 = t1.code2,t.LAST_UPDATED_DATE = default <!–不符合条件时–> WHEN NOT MATCHED THEN INSERT(RC_ID, RULE_CAT1, RULE_CAT2, RC_OPER_TYPE, RULE_REF, BOND_CODE_1, BOND_CODE_2,RC_STATUS,OPERATOR_ID,LAST_UPDATED_DATE) VALUES (SEQ_RULES_CONDITION.nextval, t1.cat1, t1.cat2, t1.symbol, ‘1’, t1.code1, t1.code2, ‘0’, t1.u,default) </insert>三. 修改(begin,end最好还是加上,之前报错一直找不到错,加上begin,end就好了;end前后都加分号";",begin不用加)普通修改<update id=“modifyRuleBond” parameterType=“com.xxx.domain.RuleBond”> begin update RULES_BOND set <if test=“bidStrategyId!=null”> BID_STRATEGY_ID=#{bidStrategyId,jdbcType=VARCHAR}, </if> <if test=“ofrStrategyId!=null”> OFR_STRATEGY_ID=#{ofrStrategyId,jdbcType=VARCHAR}, </if> <if test=“operatorId!=null”> OPERATOR_ID=#{operatorId,jdbcType=VARCHAR}, </if> <if test=“status!=null”> STATUS=#{status,jdbcType=VARCHAR}, </if> LAST_UPDATED_DATE=SYSTIMESTAMP WHERE RB_ID = #{ruleBondId,jdbcType=NUMERIC}; end; </update>批量修改(begin,end加在 foreach的open和close处,记得加上分号)<update id=“modifyRuleCondition” parameterType=“java.util.List”> <foreach collection=“ruleConditions” item=“item” index=“index” open=“begin” close=";end;" separator=";"> UPDATE RULES_CONDITION <set> <if test=“item.ruleRef!=null”> RULE_REF=#{item.ruleRef,jdbcType=VARCHAR}, </if> <if test=“item.effectTimeOfStart!=null”> START_EFFECT_TIME=#{item.effectTimeOfStart,jdbcType=VARCHAR}, </if> <if test=“item.effectTimeOfEnd!=null”> END_EFFECT_TIME= #{item.effectTimeOfEnd,jdbcType=VARCHAR}, </if> <if test=“item.bpThreshold!=null”> BP_THRESHOLD= #{item.bpThreshold,jdbcType=NUMERIC}, </if> <if test=“item.ruleStatus!=null”> RC_STATUS= #{item.ruleStatus,jdbcType=VARCHAR}, </if> <if test=“item.operatorId!=null”> OPERATOR_ID= #{item.operatorId,jdbcType=VARCHAR}, </if> LAST_UPDATED_DATE=default, </set> WHERE RC_ID = #{item.ruleConditionId,jdbcType=INTEGER} </foreach> </update>四. 删除普通删除<delete id=“deleteRuleBond” parameterType=“com.xxx.domain.RuleBond”> delete from RULES_BOND where RB_ID = #{ruleBondId} AND TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, ‘yyyy-MM-dd hh24:mi:ss’), ‘yyyy-MM-dd hh24:mi:ss’) = #{lastUpdateTime,jdbcType=TIMESTAMP} </delete>批量删除 1)批量执行语句<delete id=“batchDeleteRuleBond” parameterType=“java.util.List”> <foreach collection=“ruleBonds” open=“begin” close=";end;" item=“item” separator=";"> DELETE FROM RULES_BOND WHERE RB_ID = #{item.ruleBondId} and TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, ‘yyyy-MM-dd hh24:mi:ss’), ‘yyyy-MM-dd hh24:mi:ss’) = #{item.lastUpdateTime,jdbcType=TIMESTAMP} </foreach> </delete> 2)综合成一条语句执行<delete id=“batchDeleteRuleBond” parameterType=“java.util.List”> DELETE FROM RULES_BOND WHERE RB_ID IN ( SELECT A.RB_ID FROM ( <foreach collection=“ruleBonds” item=“item” separator=“UNION All”> SELECT * FROM RULES_BOND WHERE RB_ID = #{item.ruleBondId} AND TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, ‘yyyy-MM-dd hh24:mi:ss’), ‘yyyy-MM-dd hh24:mi:ss’) = #{item.lastUpdateTime,jdbcType=TIMESTAMP} </foreach> )A ) </delete> ...

January 23, 2019 · 3 min · jiezi

支付宝支撑2135亿成交额的数据库架构原理

OceanBase的SQL优化器和分布式并行执行摘要:本文主要介绍蚂蚁金服自主研发的通用关系型数据库OceanBase,OceanBase采用了分布式架构,其通过技术创新在普通PC服务器集群上实现了更好的可靠性、可用性和可扩展行。本文中,蚂蚁金服OceanBase团队资深技术专家潘毅(花名:柏泽)为大家介绍了OceanBase,并分享了SQL优化器,分布式事务的执行逻辑等内容,为大家全面展现OceanBase底层事务引擎的技术创新。一、OceanBase简介OceanBase是蚂蚁金服自主研发的通用关系型数据库,其采用了分布式架构,目前支撑了蚂蚁金服全部核心链路系统。为什么要开发OceanBase数据库作为基础软件,研发耗时较长且投入较大,那么,蚂蚁金服为什么不能采用现成的方案,如商业数据库或者开源数据库呢?曾经,阿里巴巴拥有亚洲最大的Oracle集群,但是随着互联网业务的发展,尤其是近十年的发展非常迅速,阿里每年的流量呈指数型上升,而且在某些特定日期流量会出现激增,这也是互联网行业与传统银行、电信等行业在数据库应用方面的不同。传统行业可以制定未来几年的规划,如客户规模、业务量等,这些在一定程度上都是可预测的。但是互联网行业则不同,互联网行业的流量变化非常快,一方面使用商用数据库很难进行迅速扩展来应对阿里巴巴飞速增长的规模;另一方面,传统数据库的可靠性、高可用性等都需要依靠极其昂贵的硬件来实现,成本将会非常高昂。同时,阿里巴巴在高峰和平峰流量差别巨大,因此通过硬件实现特殊日期的高流量支持会造成严重的资源浪费。综上所述,现有的商业数据库并不能很好的支持阿里巴巴的整个互联网产业。而采用开源数据库同样也会导致一系列的问题,以MySQL为例,第一点,互联网产业的业务流量大,且并发高,需要每一个查询都要在极短的时间内执行,因此对于通用数据库而言,必须要掌握核心的代码才能保证稳定的业务需求。第二点,金融行业需要具备强大的分析、查询能力的数据库,而MySQL在分析查询方面的能力比较薄弱,无法满足业务需求。出于以上原因,蚂蚁金服需要开发一款数据库来满足自身的业务需求。二、OceanBase架构该部分将从集群拓扑、分区&分布式协议、存储引擎三个部分介绍OceanBase的架构设计。1. 集群拓扑多副本:一般部署为三个子集群,每个子集群由多台机器组成,数据存储在不同的集群中。全对等节点:每个节点的功能对等,各自管理不同的数据分区。不依赖共享存储:共享存储的价格较为昂贵,故采用本机存储的方式。2.分区&分布式协议数据分区:支持数据分区,每一个数据以分区为单位作为管理组,各分区独立选主,写日志。高可用&强一致:通过PAXOS协议保证数据(日志)同步到多数机器,发生故障时自动切主。3. 存储引擎OceanBase采用的存储引擎是经典的LSM-Tree架构,数据主要分为两个部分,分别是是存储于硬盘的基线数据(SSTable)以及存储于内存的增量数据(MenTable)。在该存储引擎中,所有数据的增删改操作都会在内存中进行,并形成增量数据,每隔一段时间将增量数据和基线数据进行合并,来避免对于SSD的随机写。因为对于数据库的操作为全内存操作,所以DML操作的效果非常好,但如果某一段时间的数据修改操作非常多,数据量过大,导致内存溢出,在这种情况下OceanBase提供了相应的解决方案,即转储操作,转储会将数据移动至硬盘上,但不会进行数据的合并操作,在后续合并时,会同时对增量数据,基线数据和转储数据一起进行合并。可以看出这个架构会面临一个很大的挑战,即在进行增删改的操作后,再进行查询操作,可能需要对基线数据和增量数据进行融合,因此在该架构下,读操作可能会受到一定的时间惩罚,这也是SQL优化器需要进行考虑的问题。事实上如果优化器不是基于自身架构和业务需求来进行开发的,可能不会获得良好的效果,这也是为什么要自研数据库的另一个理由。三、SQL优化器SQL优化的目标是最小化SQL的执行时间(计划生成+计划执行),该部分主要会从OLTP(Online Transaction Processing)和OLAP(Online Analytical Processing)两个方面进行SQL优化的介绍。对于数据量巨大的查询来说,计划执行往往占据大部分的时间,但是对于很多数据量较小的查询,更多的要考虑计划生成的优化方案。1.基于LSM-Tree结构的代价优化器OceanBase优化器是基于经典的System R模式,主要进行两个阶段的优化。第一阶段是生成基于所有关系都是本地的最优计划,主要考虑的是CPU和IO的代价;第二阶段是并行执行优化,考虑的是CPU,IO,Network和Overhead的代价。同时,代价模型也需要考虑LSM-Tree结构的特点,比如进行MemTable和SSTable的数据融合,不同表的代价可能不同,因此代价需要采用动态采样计算;系统为分布式share nothing系统;索引回表操作会有额外的代价开销,使用的是逻辑的rowkey而不是物理的rowid,因此回表的时间消耗会增加等,这些都是优化器需要考虑的因素。2.优化器的基本能力优化器主要包括两种类型,分别是逻辑优化器和物理优化器,逻辑优化器主要做查询改写等操作的优化,比如基于规则和基于代价的优化,物理优化器主要对连接顺序,连接算法,访问路径进行优化,同时会考虑到Meta Data,比如统计信息,表分区信息。当有了统计信息和代价模型后,就能估算出模型的执行代价,然后选择出代价最好的模型进行相应的操作。而计划管理模块,对于OLTP的意义更加重要,可以更好的对短查询进行优化。3.优化器的统计信息OceanBase优化器实现了非常完备的统计信息,包括表(avg rowlen, # of rows),列(column NDV, null value, histogram, min/max),分区/行级的统计信息。为了防止引入额外的开销,统计只会在数据进行大版本合并的时候进行。存储引擎对于某些谓词可以提供较精准的数据量Cardinality估计,比如通过谓词可以推算出扫描索引的开始和结束区间,在SStable中每个block都有metadata统计行数,在MemTable中可以统计关于insert,delete,update操作的metadata。在OceanBase中,如果数据在合并过程中进行了修改,会导致数据不够精准,此时将采用动态采样的方式来解决该问题。4.访问路径因为OLTP的SQL查询计划比较简单,一般来说往往是单表,单索引的查询,所以访问路径对于OLTP非常重要。因此进行SQL查询时要进行相应的选择,例如主键扫描还是索引扫描,采用单列索引还是多列索引。选择的标准主要基于规则模型和代价模型,规则模型包括决定性规则(如主键全覆盖则采用主键扫描进行查询)和剪枝规则(运用skyline剪枝规则,多个维度比较,选择更好的索引)。之后再通过代价模型的比较选出最优模型进行查询。模型主要考虑的因素包括:扫描范围,是否回表,过滤条件,Interesting order等。5.计划缓存计划缓存是指在一个计划生成之后,后续如果出现同一个查询或者相似的查询,可以使用现有的计划而无需重新生成计划,计划缓存通过高效的词法解析器匹配输入的查询语句,使用参数化查询优化进行匹配。下面为一个计划查询的例子。可以看到,在计划缓存中对于查询语句会进行参数的模糊匹配,但对于特定含义的参数会加入限定条件,比如order by 3中的参数3代表是第三列,该参数的修改可能会导致计划缓存的不适用,因此存储计划缓存时加入了限定条件@3 = 3。6.自适应共享计划对于一个查询语句只要参数相似就一定能进行计划缓存的匹配吗?答案是否定的,举一个例子,在一个查询语句中对于salesman因为数据量较大,会采用全表扫描的方式进行查询,而对于president,因为数据量非常少,可能通过索引的方式进行查询的代价要比全表扫描的代价更好,因此对于这种情况,同样需要加入相应的限定条件。但重新生成的计划可能和原有计划相同,发生这种情况后,便会对于原有的限定条件进行修改,方便之后的查询语句进行计划匹配,以此来达到自适应计划共享。7. Hint/Outline在OceanBase中如果对于自动化生成的计划不满意,也可以通过创建Outline的方式来绑定自定义的计划,也就是通过Hint来制定计划的生成,Hint的类型十分丰富,包括:access path, join order, join method, parallel distribution等,下面是Outline绑定的两个例子。8.SQL计划管理及演进很多用户特别是企业级用户对于稳定性的要求非常高,因此OceanBase在进行系统升级,统计信息更新,硬件更新后会自动进行一个流量的演进,即同时运行新计划和老计划,当确定新计划相较于老计划无性能回退时,才会逐渐将老计划替换成新计划。9.分区及分区裁剪OceanBase支持多种分区类型,包括Range,Hash,Key,List。对于二级分区支持Range/Range, Range/Hash, Range/List, Hash/Hash, Hash/Range等。对于静态或动态分区裁剪支持inlist, 函数表达式,join filter等多种方式。10.查询改写查询改写主要包括基于规则的改写以及基于代价的改写,基于规则的改写主要包括视图合并,子查询展开,过滤条件下推, 连接条件下推,等价条件推导,外连接消除等。基于代价的改写主要包括OR-expansion,Window function等,查询改写对于OLAP的优化效果非常好。下图为基于代价模型的改写框架。四、SQL执行引擎优化器和执行引擎是相辅相成的,优化器所能优化的计划取决于执行引擎的执行计划。1.并行执行并行执行的概念就是分治,分治包括垂直分治(比如拆分计划为子计划单元)和水平分治(比如GI(Granule Iterator)获取扫描任务),并行执行主要用于OLAP场景中,解决查询RT时间的问题,这在很多在线分析的场景下是十分必要的。RT时间对于RDBMS查询是一个重要指标,传统的Map-Reduce的执行性能并不能满足OLAP的性能需求,因此如何找到高效的执行计划及数据流水线非常关键。在OceanBase中采用两级调度,自适应的子计划调度框架,各节点独立的任务切分等方案来进行并行执行。对于数据重分布,OceanBase支持大多数常见的数据分布,包括Hash, Broadcast/Replicate,,Round Robin,Merge Sort等。2.两级调度在OceanBase中通过下面所述的方式形成两级调度。即将查询涉及到的各个机器上分别创建一个执行节点(SQC),来让主控节点(QC)控制SQC,其中QC为机器级的控制,SQC为线程级的控制。QC进行全局调度,依据总并行度分配各节点各子计划并行度, SQC进行本机调度,其中各节点独立决定水平并行粒度及执行。3.计划动态调度计划动态调度是指根据用户指定或系统资源自适应决定在允许的资源使用范围内,减少中间结果缓存,构建2组或以上计划子树的执行流水线(垂直并行),这种方式可以有效的避免物化,减少物化算子对并行执行所造成的不良影响。该功能正在开发测试中。4.并行执行计划OceanBase中拥有所有主要算子的并行执行方法,包括nested-loop join, merge join, hash join,aggregation, distinct, group by,window function, count, limit等,同时支持丰富的重分布方法和多种候选计划,例如partition-wise join, partial partitionwise join,broadcast, hash, sort(for distributedorder by)等。事实上,并行查询的优化技术在MPP架构下产生了新的问题,比如分区连接要求各表的分区从逻辑上和物理上都是一样的,这也是一个需要考虑和优化的方向。5.编译执行传统执行方式如类型检查,多态(虚函数)对于内存操作很低效。OceanBase考虑采用LLVM 动态生成执行码,SQL表达式可以支持动态生成执行码,存储过程采用直接编译执行的方式,来进行性能提升。整理:杨德宇

January 22, 2019 · 1 min · jiezi

OceanBase迁移服务:向分布式架构升级的直接路径

摘要: 数据库的架构升级就好像是在给一个高速运行的飞机更换引擎。2019年1月4日,OceanBase迁移服务解决方案在ATEC城市峰会中正式发布。蚂蚁金服资深技术专家师文汇和技术专家韩谷悦共同分享了OceanBase迁移服务的重要特性和业务实践。蚂蚁数据库架构的三代升级史在过去的十多年时间里,蚂蚁在整个基础数据库架构上一共经历了三代升级。第一代数据架构是构建在IOE的基础之上——IBM的小型机、Oracle的商业数据库,还有EMC的共享存储。基于第一代IOE架构的运维成本是非常高的,同时稳定性的挑战也是非常大的。随着业务的快速发展,这套架构已经完全没有办法适应业务发展的增速。随之诞生的是第二代架构,第二代架构的主体是OE——也就是Oracle和EMC,加上蚂蚁自身的分布式中间件,解决了业务的水平和垂直的弹性能力。这一代架构其实伴随着蚂蚁走了很多年。随着4G、5G时代的到来和金融的普及化,人们的生活越来越离不开移动支付,业务井喷式的发展给底层的数据库提出了更高的要求。这些要求包括更高的稳定性,快速恢复能力和极致的弹性能力等。于是最终演进到了我们如今的第三代架构。第三代架构是由OceanBase为代表的金融级云数据库和分布式中间件所构成。数据库架构升级的挑战伴随着整个蚂蚁的发展,整个数据库的架构也仅仅演进了三代。这其中一个很重要的原因就是对于任何企业而言,整个数据库的架构升级都是一件非常有挑战的事情。蚂蚁金服资深技术专家师文汇说道,“用一个我们内部经常说的比喻,就是数据库的架构升级就好像是在给一个高速运行的飞机更换引擎。”更换引擎的目的是为了拥有更好的动力,做更多技术上的创新。但是横亘在眼前的问题是,如何才能做到稳妥创新,保证驾驶中的飞机平稳顺利的运行,这其实是有非常大的挑战。在过去三代架构的演进中我们可以看到,本质上每一代架构的迭代基本上都是以两到三年为周期,这其中会有非常高的人力投入和成本开销。第二个挑战就是从传统的商业数据库迁移到OceanBase数据库之上,我们如何保证迁移过程中以及迁移以后的稳定性。另外一个非常大的挑战就是数据质量,在金融企业里,数据承载的不仅只是钱,更承载了数以亿计用户的信任。所以数据一条不能丢,一条不能错,这是我们做数据库的底线。当然,包括兼容性问题和性能风险也给数据库的架构升级带来重重挑战。OceanBase迁移服务:向分布式架构升级的直接路径基于上述问题和挑战,同时经过蚂蚁十年数据库架构升级的先进经验,蚂蚁金服为客户打造了这款一站式数据迁移解决方案——OceanBase迁移服务(OceanBaseMigration Service,简称OMS)。OMS的发展演进OMS的演进是以业务为驱动,并且与OceanBase的架构升级和不断发展密不可分。早在2014-2015年期间,蚂蚁主站上的一些核心业务,包括大家熟知的交易业务,支付业务和会员业务等,需要从Oracle迁移到OceanBase上。当时的OMS还是以一个工具类、模块化的形态支撑着这些项目。所以在2015年我们开始对OMS的方案进行全面的调研,力求沉淀出通用的系统化的解决方案。在2016年,OMS已经有了平台化的架构,引入了大规模编排的思想,将整个迁移特别是切换过程中繁琐易错的环节全部集成到平台。这一时期,OceanBase也完成了从0.5版本到1.0版本的架构升级,这一年OMS还支撑了网商银行、印度PayTM以及主站的核心业务升级到OceanBase 1.0版本。到了2018年的时候,无论在基础功能层面还是任务编排层面,OMS都已经被打磨得日趋完善。今年OMS已经支持了蚂蚁森林,蚂蚁商户平台以及众多大量核心及非核心的业务从MySQL迁移到OceanBase之上。与此同时,在外部业务包括很多已经上线OceanBase的商业银行,也已经验证了使用OMS一键迁移到OceanBase的能力。OMS的方案优势OceanBase迁移服务其实主要解决了五个重要的问题。1.负载回放验证:其中第一个核心的问题就是负载回放验证,通过采集源端数据库的SQL流量,在目标库OceanBase上回放,可以验证其在OceanBase上的功能是否兼容、性能是否出现问题等。同时基于蚂蚁DBA十多年的经验沉淀,OMS会为客户提供性能等方面的调优建议。2.秒级数据校验:第二点就是数据校验,OMS有三层数据校验,可以做到秒级的延迟。举一个例子,比如说我们想把传统商业数据库替换成OceanBase,如果在迁移过程中任何一条数据出现了错误,在一秒钟内就可以快速发现。校验的延迟可以完全保证在一秒以内,根据蚂蚁线上的经验,大概在100-200毫秒之间。3.分钟级即时回滚:第三点也是最重要的一点,就是OMS有随时回滚的能力,而且回滚是无损的。这也是我们前面所强调的稳妥创新的基石。4.多种数据库类型支持:目前OMS支持源端数据库类型有Oracle、MySQL、OceanBase等等,支持全量迁移和增量数据同步。5.一键完成迁移:整个数据迁移链路和回滚机制的搭建基本上都是通过一键操作完成,使用简便。OMS的技术架构OMS的核心方案其实非常简单,我们把OceanBase变成Oracle/MySQL的一个备库。传统的商业数据库一般都是有主库和备库的:主库承担写的流量,如果主库出现问题,我们会把数据切到备库,然后通过OMS提供的一整套虚拟主备库的解决方案完成切换。比如原来Oracle有一个主库一个备库,然后OceanBase其实变成了一个虚拟的备库。整个数据库架构的升级也会变得异常简单,简单到只是做了一个主备切换。回滚也会变得非常简单,其实也是做了一次主备切换。从OMS的整体架构来看,其实一个非常关键的点就是,我们在传统的商业数据库和OceanBase之间建立了一套虚拟的主备链路,整个OMS里用到的所有组件,其实都是在蚂蚁和阿里有很多年技术沉淀的,也都是基于真实场景所产生的。OMS的迁移流程OceanBase迁移服务的整体迁移流程其实只有七步。1.评估:首先第一步是通过负载回放工具做兼容性分析;2.PoC:接下来OceanBase云平台可以帮助客户部署一套PoC集群;3.预迁移:然后OMS把线上的Oracle的数据预迁移到一个测试库里;4.验证:在这个测试库里用负载回放工具去回放这些SQL,然后找到SQL里不兼容,性能或者数据质量不满足预期的部分,并提供优化建议;5.正式迁移:前四步做完了以后,业务需要调整或者需要优化的SQL已经完成优化,然后就可以正式迁移了。首先把原有的全量数据迁过来,然后再把增量变化的那部分数据实时同步过来;6.校验:等到所有的数据准备好以后,然后我们继续完成三级校验;7.切换和回滚:等到所有的校验都完成以后,可以一键完成切换和回滚功能。通过这七步就可以轻松完成从传统商业数据库到分布式数据库的完整迁移。蚂蚁商户平台基于OMS的业务实践蚂蚁商户平台承载着商户档案数据信息,订购关系、签约信息的数据和相应的服务能力。其中一部分业务使用的是MySQL数据库,还有一部分核心业务使用的是Oracle数据库。随着商户的快速增长以及业务场景的不断丰富,商户平台数据增长迅速,数据规模相当庞大。尤其是MySQL的单表瓶颈日益明显,DDL变更、DML更新的性能与风险已经无法承担。蚂蚁金服技术专家韩谷悦介绍道,“OceanBase能够支持数据的无限扩展,满足商户业务的容量与性能需求。那么如果我们换一种数据库底盘,其实所要面对的性能、稳定性和数据质量的风险同样不可避免。”从蚂蚁商户平台的业务实践来看,使用OMS迁移与传统迁移进行对比,我们可以看到:业务评估和改造过去通常一个业务少则花费1-2个月的时间去做改造和适配;那么基于OMS自动化的SQL兼容性评估和负载回放的能力,蚂蚁商务平台业务的改造大概只用了一个星期的时间。数据迁移和校验客观来讲,迁移的总时长主要取决于业务数据模型,数据量和网络环境。在提高迁移效率方面,OMS目前增量迁移的延迟仅为毫秒级,跨城情况下最长只需要3秒。并且针对校验出的数据差异提供补齐的SQL和订正方案,使得迁移和校验的整体效率有了大幅度的提升。业务切换其实在切换之前,往往需要制定严密的切流方案和Failover方案,整个切换过程中需要检查与校验的细节非常繁琐,任何一步疏忽都有可能造成数据不一致的问题。那么OMS通过引入大规模编排的思想,把所有繁琐复杂的环节通通落到平台当中。所以从原来业务切换需要用时1-2周时间, 使用OMS后蚂蚁商户平台业务无论是切读还是切写的过程中都只用了几分钟的时间。业务回滚在过去,迁移之后的业务回滚要担负重大的决策风险,OMS使得业务回滚就像一次主备切换,可以瞬间完成并且不丢数据,所以让业务回滚不再成为难题。商户业务整体迁移的过程中也发生过业务抖动,使用OMS回滚的时候从登陆系统到完成回滚也只用了几分钟的时间。所以全程下来蚂蚁商户平台这个业务的迁移时间大概在三个多星期的时间完成,那么无论从人力成本还是时间成本上,OMS都极大地提升了数据库的整体迁移效率。最后,韩谷悦为大家展示了OMS一键迁移的demo演示。当前, 越来越多的企业已经认识到分布式架构在实现业务灵活扩展以及敏捷开发等方面的巨大价值。OceanBase不断通过产品端的革新,为传统企业输送“互联网基因”,帮助更多客户向分布式架构转型。同时OceanBase也在不断提高服务客户的深度和广度。深度意味着在同样的业务场景下,随着业务的发展和体量的壮大,帮助更多企业承担起业务所带来的极致压力。广度则针对的是随着新型技术形态和业务场景的出现,帮助更多企业快速响应,通过技术创新而适应变化所带来的新的市场契机。OceanBase致力于将蚂蚁自身业务多年沉淀下来的最浓缩,最经典和最普世的方法论输出给广大的企业客户,同时做到深度和广度并存,真正帮助客户实现稳妥创新。本文作者:平生栗子阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 10, 2019 · 1 min · jiezi

1 小时 SQL 极速入门(一)

前几天,我在论坛溜达。看到一个人发帖说做了6年的企业级开发,总是被互联网行业的人认为没技术含量,不就是CRUD么先解释下 CRUD 是什么。CRUD 就是我们常说的增删改查(Create,Retrieve,Update,Delete)其实,对这个问题,我也思考过。我们所有的业务流程,最终都会抽象出数据模型,保存到数据库中。把业务之间的联系抽象成数据库中表与表,字段与字段之间的联系。实际上,企业的各种系统,在技术层面上确实是在 CRUD。不过话说回来了,互联网的系统不是 CRUD 吗?只不过 CRUD 的姿势不同罢了,互联网可能是面对高并发的 CRUD, 我们是面对的是复杂业务流程的 CRUD。这些业务逻辑还需要一定的行业积淀才能捋清楚。所以在企业级开发上业务和技术基本是五五开,业务比重甚至要大于技术。所以,今天我们就花很短的时间,来学学简单的 SQL.了解下 CRUD 的姿势。假如我们有下面一个订单表 ORDER_HEADER,不要在意表里的数据,为了方便说明,瞎填的。查询查询是我们平日使用最多的,下面着重说一下:查询使用 SELECT 关键字,基本结构如下SELECT <列名> FROM <表名> WHERE <条件>假如我们想查找所有已经完工的订单信息,那么 SQL 怎么写呢?SELECT * FROM order_header WHERE order_status = ‘完工’执行后会看到我们需要的结果SELECT * 代表查询所有列,一般我们会关注我们需要的字段,比如我们要找到订单类型为 1 的并且完工的订单号,我们可以这么写SELECT order_no FROM order_header WHERE order_status = ‘完工’ AND order_type = 1我们可以看到只有下面两个符合条件的订单号被选中。在写 SQL 中我们要尽量避免 SELECT * ,我们需要哪个字段就取哪个字段,可以节省 SQL 查询的时间。如果要查询订单类型为 1 的或者处于下达状态的订单,SQL 怎么写呢?SELECT order_no FROM order_header WHERE order_type = 1 OR order_status = ‘下达’如果要查找开工,下达和完工状态的订单,我们可以用 IN 关键字SELECT order_no, order_type, order_statusFROM order_headerWHERE order_status IN ( ‘开工’, ‘完工’, ‘下达’ )除了 IN 我们可以使用 LIKE 进行模糊查询,比如我们要查询订单状态中包含 “工” 的所有订单SELECT order_no FROM order_header WHERE order_status LIKE ‘%工%‘这里的 “%” 表示通配符,"%工"表示以工结尾的所有匹配,“工%“表示以工开头的所有匹配。此外,我们可以用 NOT IN , NOT LIKE 来取相反的逻辑。通过 GROUP BY 可以进行分组,比如我们按照订单状态来分组,就可以很方便的查看当前有几种状态的订单SELECT order_status FROM order_header GROUP BY order_status结果如下图如果我们想看到每个分组中有多少订单,那个我们可以使用 COUNT() 函数SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status结果如下图,可以看到每个分组中订单的数量。除了COUNT(),还有 MAX(),MIN(),SUM()等函数如果我们只想看到数量大于 2 的分组,该怎么写?SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status HAVING COUNT(1) > 2可以看到,只有数量大于2的分组被查到了。如果仅仅想去重,比如想知道总共有几种订单类型,那么我们只需要对此列用 DISTINCT 即可。SELECT DISTINCT order_type FROM order_header结果中的订单类型列已经被去重了。CASE WHEN ,有时我们会需要简单的判断逻辑,就可以用 CASE WHEN 了。比如我们想让 订单类型为1 的表示生产订单,订单类型为2 的表示更改订单,订单类型为3 的表示废弃订单。那么我们可以这么写SELECT order_no, order_type, order_status,CASE WHEN order_type = 1 THEN ‘生产订单’ WHEN order_type = 2 THEN ‘更改订单’ WHEN order_type = 3 THEN ‘废弃订单’ ELSE ‘未知类型’ END AS type_descFROMorder_header结果如下图子查询,有时候我们需要从一个结果集中再次查找,就会用到子查询。比如下面这样写SELECT order_no, type_descFROM (SELECT order_no, order_type, order_status,CASE WHEN order_type = 1 THEN ‘生产订单’ WHEN order_type = 2 THEN ‘更改订单’ WHEN order_type = 3 THEN ‘废弃订单’ ELSE ‘未知类型’ END AS type_descFROM order_header) t下节课我们说一下 连接查询和常用到的分析函数,在企业中,单表查询情况是很少的,要关联查询。插入数据插入数据我们使用 INSERT 语句INSERT INTO order_header ( order_no, order_type, order_status, order_date, createdon )VALUES ( ‘2018102109’, 2, ‘下达’, sysdate( ), sysdate( ) )看到,最下面就是我们新插入的一行更新数据更新数据使用 UPDATE 语句,我们更新一下刚才插入的数据的订单号UPDATE order_header SET order_no = ‘112109’ WHERE order_no = ‘2018102109’我们把 订单号为'2018102109’的一行数据更新为了'112109’,在update时一定要写好 WHERE 条件,如果没有 WHERE 条件,会更新表中所有数据。删除数据我们删除刚才加入的一条数据DELETE FROM order_header WHERE order_no = ‘112109’运行后,订单号为'112109’的订单就被删除了,DELETE 时同样要写好 WHERE 条件,如果没有 WHERE 条件,会删除表中所有数据。下节重点说说 多表连接,常用分析函数。不要走开哦。 ...

November 22, 2018 · 2 min · jiezi