记录关于Devops运维,虚拟化容器云计算,数据库,网络安全等各方面问题。
rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录 ,例如 AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30这里的AAAMgzAAEAAAAAgAAB物理位置对应了这条记录,这个记录是不会随着sql的改变而改变。因此,这就导致了他们的使用场景不同了,通常在sql分页时或是查找某一范围内的记录时,我们会使用rownum。1、rownum例如:查找2到10范围内的记录(这里包括2和10的记录)select * from (select rownum rn, a.* from emp a) twhere t.rn between 2 and 10;查找前三名的记录select * from emp a where rownum < 3;这里我们要注意,直接用rownum查找的范围必须要包含1;因为rownum是从1开始记录的,当然你可以把rownum查出来后放在一个虚表中作为这个虚表的字段再根据条件查询。例如:select * from (select rownum rn, a.* from emp a) twhere t.rn > 2;这就可以了2、rowid我们在处理一张表中重复记录时经常用到他,当然你也可以用一个很原始...
Oracle定时执行计划任务 在日常工作中,往往有些事情是需要经常重复地做的,例如每天更新业务报表、每天从数据库中提取符合条件的数据、每天将客户关系管理系统中的数据分配给员工做数据库营销……因此我们就想:能不能让系统来自动定时执行计划任务?下面介绍的是在Oracle数据库中如何实现定时执行计划任务。Oracle在10g版本以前,计划任务用的是DBMS_JOB包,10g版本引入DBMS_SCHEDULER来替代先前的DBMS_JOB,在功能方面,它比DBMS_JOB提供了更强大的功能和更灵活的机制/管理,但DBMS_JOB包的使用相对比较简单,也基本能够满足定时执行计划任务的需求,故接下来就先看看DBMS_JOB包的使用方法。我们可以在命令窗口输入showparameter job_queue_processes查看数据库中定时任务的最多并发数,一般设置为10(设置方法:altersystem set job_queue_processes=10),如果设为0,那么数据库定时作业是不会运行的。接下来我们尝试实现以下功能:每隔一分钟自动向job_test表中插入当前的系统时间。1、创测试表create tablejob_test(updatetime date);2、创建JOBvariablev_job_no number;begindbms_job.submit(:v_job_no, 'insert into job_testvalues(sysdate);', sysdate, 'sysd...
oracle表名HT_100到HT_200 ,要删除表中一部分数据。create or replace procedure p_delete ist_sql varchar2(2000);begin for c in (select tname from tab where tname like 'HT_%') loop t_sql:='delete from '||c.tname||' where to_char(location_time,''yyyymmdd'')<''20150301'''; execute immediate t_sql; commit;dbms_output.put_line(c.tname||'删除完成'); end loop;end;这个是一个存储过程,执行这个过程前:先运sql>set serverout on;不会显dbms_output.put_line输出信息。sql>exec p_delete;每次可以自定义 删除 多少数据表中的数据。create or replace procedure p_del_gps_ht(a in number,b in number) is t_sql varchar2(2000);begin for c in (select tname from (sel...
批量删除Oracle数据在使用delete语句删除数据时,数据库是要做日志记录的,以便将来可以恢复数据,可是我在删除上百万条数据时,十分缓慢甚至死机,请问有没有什么好方法?鉴于QQ群中不断的有人被这方面的问题困惑,故转贴如下:专家意见:几个办法: 1. 如果删除的数据是大部分,建议使用楼上的方法把要保留的数据放在一个临时表里,truncatetable后再放回来 2. 也可以分段提交,楼上也提到了 3. 专门使用一个大回滚段 4. 如果确认将来不需要做恢复,改为非归档模式,删除完改回来再做个备份.源:http://searchdatabase.techtarget.com.cn/感谢:tech target IT专家网网友观点一: create or replace procedure delete_tableisi number(10);beginfor x in (select * from emp where DEPTNO like 'a%')loopdelete emp where emp.id = x.idi:=i+1;if i>1000 thencommit;i:=0;end if;end loop;exceptionwhen others thendbms_out.put_line(sqlcode);rollback;end delete_table; 网友观点二: 这个是我平常用来批量删除数据,每500条数据提交一次。DECLARECNT NUMBER(10):=0;I NUMBER(10);BEGINSELECT COUNT(*) INTO CNT FROM ep_arrearage_bak WHERETO...
在使用delete语句删除数据时,数据库是要做日志记录的,以便将来可以恢复数据,可是我在删除上百万条数据时,十分缓慢甚至死机,请问有没有什么好方法?这个是我平常用来批量删除数据,每500条数据提交一次。DECLARECNT NUMBER(10):=0;I NUMBER(10);BEGINSELECT COUNT(*) INTO CNT FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,'MM')='01';FOR I IN 1..TRUNC(CNT/500)+1 LOOPDELETE FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,'MM')='01' AND ROWNUM<=500;COMMIT;END LOOP;END;
需要脚本,自动清空分区数据。表是按月分区,希望每月自动执行一次,清空下个月的分区数据。 分区后缀是两位数月份,不足前面补0。 SQL> select lpad(extract(month from(add_months(to_date('2012-12-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 1))), 2, '0') aa from dual; AA--01 SQL> select lpad(extract(month from(add_months(to_date('2012-11-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 1))), 2, '0') aa from dual; AA--12 SQL> 标准文档:ADD_MONTHS SyntaxDescription of the illustration add_months.gifPurposeADD_MONTHS returns the date date plusinteger months. The date argument can be a datetime value or any value that can be implicitly converted toDATE. The integer argument can be an integer or any value that can be implicitly converted to an integer. The return type is alwaysDATE, regardless of the datatype of date. Ifdate is the last day of the month or if the resulting month has fewer days than the day component ofdate, then the result is the last day of the resulting m...
Oracle dbLink跨数据库查询并插入数据 工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数据库服务器都是远程的<IP分别为: 221.131.228.256 211.161.192.46>!我的实现方法是在本地使用PL/SQL操作两个远程服务器,实现方式如下:1. 为你需要操作的远程数据库服务器建立本地服务名: 在本地数据库安装文件中,找到$ORACLE_HOME/network/admin/tnsnames.ora文件, 末尾添加 --第一个远程服务器的服务名:MYORACLE1MYORACLE1 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 221.131.228.256)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) ) --第一个远程服务器的服务名:MYORA...
输出到文件文件首先编辑一个脚本文件,比如命名为abc.sh spool abc.txt; #将结果输出为abc.txtselect * from wap_subscribe where Telcomcompanyid = '20200' and (Orderdate like '2005%' or Disorderdate like '2005%');spool off; 在sql>模式下使用@/opt/abc.sh即可,查询结果即输出到abc.txt了。输出到Excel文件SQL> set termout offSQL> set heading offSQL> set pagesize 0SQL> set verify offSQL> set echo offSQL> spool /tmp/aaa.csvSQL> select id || ',' || name || ',' from test; #多字个段分列存放在表格中1,,2,,3,6,,7,SQL> spool off补充一下:在将查结果保存到文件的时候,可能不希望将结果输出到屏幕,这样会影响速度。那么就可以能通过脚本的方式来解决。在命令行下面实现不了,所以写在脚本中,招行一下就可以了。创建文件more email.sql set term offspool user.txt@get_email.sqlspool offexitmore get_email.sql select email from album.wdxc_user;sqlplus uesr/pa...
关闭oom killer最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题。这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。如果检查相关的日志文件(/var/log/messages)就会看到下面类似的 Out of memory: Kill process 信息:...
Out of memory: Kill process 9682 (mysqld) score 9 or sacrifice child
Killed process 9682, UID 27, (mysqld) total-vm:47388kB, anon-rss:3744kB, file-rss:80kB
httpd invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
httpd cpuset=/ mems_allowed=0
Pid: 8911, comm: httpd Not tainted 2.6.32-279.1.1.el6.i686 #1
...
21556 total pagecache pages
21049 pages in swap cache
Swap cache stats: add 12819103, delete 12798054, find 3188096/4634617
Free swap = 0kB
Total swap = 524280kB
131071 pages RAM
0 pages HighMem
3673 pages reserved
67960 pages s...
想在虚拟机里面安装oracle10g,发现默认的swap交换空间不满足最低要求,因为我分配的物理内存是1G,那么就按照要求需要2G的swap交换空间,默认只有1G的交换空间。添加swap交换空间的步骤如下: 第一步:确保系统中有足够的空间来用做swap交换空间,我使用的是KVM,准备在一个独立的文件系统中添加一个swap交换文件,在/opt/image中添加2G的swap交换文件第二步:添加交换文件并设置其大小为2G,使用如下命令[root@sense image]# dd if=/dev/zero of=/opt/image/swap bs=1024count=2048000 过段时间就返回如下结果:2048000+0 records in2048000+0 records out2097152000 bytes (2.1 GB) copied, 272.867 seconds, 7.7 MB/s第三步:创建(设置)交换空间,使用命令mkswap[root@sense image]# mkswap /opt/image/swapSetting up swapspace version 1, size = 2097147 kB第四步:检查现有的交换空间大小,使用命令free[root@sense image]# free -mtotal used free shared buffers cached Mem: ...
最新评论