2013年(16)
分类: Oracle
2013-04-25 17:20:40
Timesten重建用户,datastore
一、实例背景:
在测试环境中需要在内存库上将bill用户下的所有对象全部删除,然后再从正式环境中将其bill用户下的对象导入测试环境的bill用户下。
二、操作总结(比较白话,没有直接写最终的操作方法,而是记录了所有错误经过)
1、沿袭操作ORACLE数据库的思想,在这种情况下,一般会首先DROP掉bill用户(drop用户的同时,删除该用户下所有对象),然后重建bill用户,再从正式环境中将其bill用户下的对象导入测试环境的bill用户下。
操作步骤:
Command> drop user bill;
15167: Cannot drop a user that is currently connected
第1种报错: oracle也有这样的情况,当前有链接,不能drop,停下应用应该就能避免这个错了,停掉进程后,还这么报错的话就不知道是谁连这个库了,直接杀session吧!
Timesten不能向oracle一样,从v$session系统视图里找出要杀的session,alter system kill session,因为根本就没有v$session这么个视图。
Timesten停掉数据库后session自然就掉了,ttDaemonAdmin –stop,(停之前做个Command>call ttckpt;)然后再起来ttDaemonAdmin –start,不建议这么做,咱们还是有温柔一点的方法的,ttxactadmin dsn 这条命令就能解决,执行下这个命令就知道这就是查出支持那个session的系统PID,查出来kill掉。
经过一番努力session终于杀死了,重新drop下试试吧!
Command> drop user bill;
15168: Cannot drop a user that owns database objects (TABLE BILL.A)
The command failed.
第2种报错:看字面意思就是,不能删除有对象的用户,换句话说不就是删用户前要先把它的对象都删了,查看了下Timesten的文档对于drop user的描述:
Description
Before you can drop a user:
这个描述写了对执行drop user前应该确认的事,第一条是废话,没这个用户肯定没法子drop了;第二条就是上面那个错误的原因了,存在对象的用户不能被drop;第三条看意思是存在复制关系的时候drop用户这条操作也会被复制的,就是备机的这个用户也会被drop掉。
现在似乎情况已经明朗了,造语句一个一个对象的删吧,这个测试环境该用户的对象不多,大概几百个,不过一个个的drop也很耗时。最后找到另一种方法:我们发现bill用户就是建立在一个叫做master1的datastore上的,那么直接destroy掉这个datastore再重新建个datastore,再在上面建用户bill可以么,事实证明是可以的。
先看看datastore是什么吧,官方的解释:
DataStore
The database path name uniquely identifies the physical database. It is the full path name of the database and the file name prefix, for example: C:\data\AdminData. This name is not a file name. The actual database file names have suffixes, such as .ds0 and .log0, for example C:\data\AdminData.ds0 and C:\data\AdminData.log0.
这段话就是告诉我们datastore是数据库文件名的前缀,没太多的意义,再来看看一些培训材料上怎么说的:
TimesTen中一个data store可以等同于为一个数据库。 一个TimesTen实例可以同时管理多个data store。
一个data store的组成:
在文件系统上有2个checkpoint文件: dsname.ds0, dsname.ds1。
在文件系统上包含若干事务日志文件: dsname.logn ( n从0开始,依次累加)
包含3个系统保留的文件: dsname.res0,dsname.res1,dsname.res2操作系统中一块共享内存段。
这段意思话是说datastore和oracle的用户是一个级别的。。。好像逻辑上不太好理解。由此可以推断destroy datastore和在oracle上drop user属于一个级别的操作。
1、首先摧毁数据库:在使用的数据库也是不能摧毁的。
$ttDaemonAdmin –stop;ttDaemonAdmin –start;ttdestroy master1
2、重建datastore,创建datastore需要2个条件,一是得建立数据文件和日志文件的目录,二是编写配置文件:安装目录下找到info/sys.odbc.ini
添加配置:
[master1]
Driver=/ttadm/ttadm1/TimesTen/billmdb/lib/libtten.a
DataStore=/ttadm/ttadm1/billdata/master1
DatabaseCharacterSet=AL32UTF8
Connections=512
ConnectionCharacterSet=ZHS16GBK
PermSize=30720
RecoveryThreads=32
TempSize=2048
Preallocate=1
LogFileSize=1024
AutoCreate=0
CkptFrequency=600
LogBufMB=1024
LogDir=/ttadm/ttadm1/mdblog
WaitForConnect=0
PLSQL=1
PLSQL_TIMEOUT=0
LockWait=2
CkptRate=50
摧毁datastore时不会删除这些配置,只需检查下即可。执行ttisql dsn创建datastore:
>ttisql master1
connect "DSN=master1";
833: Data store /ttadm/ttadm1/billdata/master1 not found
The command failed.
Done.
万恶的错误码,没找到master1这个datastore,来看看这个命令ttisql master1,它在有datastore的时候可以连接,没有的时候会创建,现在很明显这个命令只尝试了连接这个动作,没有进行创建,肯定是哪里有问题的。创建datastore只会和俩个地方有关联,目录和配置文件,目录是死的,不会有问题,查看下配置文件,AutoCreate=0,罪魁祸首就是它了,这个参数在不设定的时候会默认为1,所以大多数材料上看不到它的影子,但是这里设定了,就不可以自动创建datastore了,官方注释:
修改参数AutoCreate=1;重新执行ttisql dsn创建datastore:
等了一段时间发现依然没有创建成功,而且磁盘空间越来越小,再次检查配置文件。和数据文件大小相关的参数有:
PermSize=30720
TempSize=2048
修改小些:
PermSize=64
TempSize=64
Destroy掉先前没有完全创建成功的datastore,再次执行ttisql dsn创建datastore:
几分钟后,创建成功,关闭数据库,将先前修改过的配置文件改回来,再次启动进入后,创建需要的用户:
创建用户
Command> create user bill identified by bill;
赋给用户管理权限
Command> grant admin to bill;
最后,使用bill用户登录数据库,将正式环境中bill用户下的对象导入。
三、总结
这种重建用户的方法有自己的局限性,在datastore下有多个用户时就不可以用了。就只能查出对象进行drop了(还有没有别的方法,在以后的工作中再挖掘)。
付:查看用户对象的方法:
l 列出表: tables| alltables [tablename]
l 查看表结构: desc[sribe] tablename
l 查看索引: indexes| allindexes [tablename]
l 查看视图: views | allviews
l 查看序列: sequences | allsequences
l 查看同义词: synonyms | allsynonyms
l 查看函数: functions | allfunctions
l 查看存储过程:procedures | allprocedures
l 查看包: packages | allpackages