博文

目前显示的是标签为“数据库”的博文

批量删除Redis的Key

Redis本身提供了批量的检索数据库中Key,但是却没有办法批量的删除某些Key——除非你FlushDB 因为之前设计上的不完善,于是现在的结果就是一大堆用于缓冲的Key值和一大堆永久存储的Key混淆在一起了,但是伴随着系统升级,从中挑选出缓冲用的Key并且清理掉就显得很痛苦了 虽然也想到用Python直接来写代码循环做删除,不过感觉还是有点小题大做。搜索了一下发现,原来还有Linux的管道删除的方法,做法也相当的简单 redis-cli -p 16000 -n 10 keys "userInfoCache*" | xargs redis-cli -p 16000 -n 10 del 这样就搞定了 redis-cli的参数可以自己用--help检索出来

果然视图的效率永远是跟不上表的啊

工作上的原因开始接触Oracle了...虽然Oracle在几年前就玩过了,但是基本上都是最基本得操作了,简单的存储过程,简单的触发器..... 现在到了新的公司,碰到了诡异的问题是一个针对地区的统计问题. 一个省下面有许多的市,需要统计这些市出现的次数,以及外省的数字. 本来这个是一个非常容易搞定的问题,但是现在却碰到了麻烦,那就是这个地址字段里面存放的并不是地区的代码而是地区的文本....orz 于是现在如果想要统计这种要么通过不断的LIKE来做Count(ID),然后UNION ALL形成最终结果了...但是仅仅面对20万左右的数据量,这条语句的执行时间居然长达3分钟以上. 然后想了一个办法,首先将所有符合条件的数据全部用视图的方式UNION ALL起来,添加一个虚拟的地区代码字段,然后再对这个视图做Group BY操作. 可惜,就算是这样做了,也仅仅只是把时间提升到了2分钟10秒左右. 没办法,只有想办法改动表结构了...我是一直不怎么想改动这个表结构的,因为不是我设计的,而且本身设计的很糟糕... 程序也是刚刚接手,都没办法整理,所以如果变动了表结构,就一定要通过触发器来解决后续的问题了... 不过抱着尝试的心态,添加了一个字段,然后简单的用LIKE来更新这个字段. 然后再用Group By来生成报表.这时惊人的效率提升终于出现了..只用了5秒. 但是只有20万的数据量的话,用5秒似乎也显得太多了一点 ,估计是没有使用到索引... 于是添加索引,以Where语句的字段和Group By后面的字段添加联合索引.再做测试... 速度终于提升到0.15秒左右了...正常范围内了(虽然赶不上MySQL的效率了,当然,这也是必然的)... 接下来就是触发器了...以前只是写过一个自增ID字段的触发器而已,而且还是网上直接抄下来的... 不过现在这个触发器也很简单就是了...所需要实现的就是在Insert字段的时候根据既有的字段中的某一个值(所在地区)得取值来确定我添加的那个字段的取值.并且将更新了的数据插入进去就可以了. 但是不得不说,我根本就忘了触发器怎么写了....orz 不过最后还是搞定了就是了...之前忘掉了使用for each row,导致一直都报告ORA-04082错误,添加那个字段后终于搞定...

修复了Oracle的ORA-01033错误

今天数据库日志满了,然后同事删除了一部分日志,空出来一部分的磁盘空间,但是却发现数据库怎么都起不来,一直报告ORA-01033错误, ORACLE initialization or shutdown in progress. 强制Shutdown immediate之后再Startup结果报告: ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: 'xx\redo1.log' 上网搜索发现是数据库日志读取出问题了. 于是开始检索解决的办法: 先查询出错的这个Log 1是否是当前使用中的日志: SQL>select group#,sequence#,archived,status from v$log; 得到的结果是 GROUP# SEQUENCE# ARCHIVED STATUS ---------- ---------- -------- ---------------- 1 1 NO INACTIVE 2 2 NO INACTIVE 3 3 NO CURRENT 解决的办法是: alter database clear unarchived logfile group 1; 然后很正确的提示了 Database Altered. 之后再Shutdown一次再Startup一次就好了. 但是值得注意的是: 1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据 2、这种方法适合于归档数据库并且有可用的数据库全备份。 3、恢复成功之后,记得再做一次数据库的全备份。 4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。 但是我们局内的数据库是无所谓数据一致性的,因为并没有那么强的实时性的要求.于是很顺理成章的就完成了了事~ 相关材料引用自: http://www.cnblogs.com/jimeper/archive/2008/04/14/1153234.html

免安装Oracle客户端使用PL/SQL

因为Oracle的官方完整客户端实在是太巨大(1.5G),而且安装起来非常不方便,普通开发用的PC也没有必要安装如此臃肿的客户端,所以我选择了使用简化版客户端. 方法其实很简单,官方网站也有提供下载的地方: Instant Client Downloads 不愧是简化版客户端,根本就不需要安装,直接解压到一个文件夹就足够了,唯一需要做的事情就是解压了之后在其根目录下建立一个network文件夹,然后再在network文件夹下建立ADMIN文件夹.然后建立一个tnsnames.ora文件.文件格式类似以下的: databasename =     (DESCRIPTION =       (ADDRESS_LIST =         (ADDRESS = (PROTOCOL = TCP)(HOST = ip address)(PORT = 1521))       )       (CONNECT_DATA =         (SERVICE_NAME = database name)       )     ) 然后安装PL/SQL,然后设置Tools-Performance中的Connection,Oracle Home指定为你解压的目录,OCI Library指定为目录下的oci.dll文件,比如"D:\Dev\Oraclient\oci.dll" 唯一有点问题就是PL/SQL因为没有安装Oracle的原因可能会导致数据乱码 那么唯一的办法就是首先运行PL/SQL连接上数据库了之后执行以下语句: select   userenv('language')   from   dual; 然后写个BAT吧,内容如下: set nls_lang=SIMPLIFIED CHINESE_CH...

一觉醒来,世界变了

一大早就发现了Shock的消息... Oracle收购了Sun.... 之前一直在传闻IBM要收购Sun,一直以来,IBM都是最大的开源支持者,他收购了Sun,对MySQL无疑是大的鼓励,但是这下被Oracle收购了之后...MySQL何去何从? 网上预测的结果是甲骨文无疑会慢慢的会淡化MySQL,让更都的免费客户转向企业级的Oracle数据库...这无疑是重大的打击. 不过也因为MySQL的开源特征,也并不排除有第三方续写MySQL代码的可能性...不过那个时候估计就要改名换姓了... 前途未卜,能做的也只是观望了.