Db_link
一般创建(global_name=false的情况)
create databaselink TEST_DBLINK
connect touser_name identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.27)(PORT =1521))
)
(CONNECT_DATA= (SERVICE_NAME = oradb10)
))';
上面为创建普通dbLink的方法,其中绿色和蓝色部分是常规关键字,红色部分是需要根据实际情况进行替换的,其中using 后面引号中的即为平常我们在 tnsnames.ora文件中配置的数据库连接串。
如果我们已经在tnsnames.ora文件中配置的数据库连接串 名字为 TEST,即
TEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.10.5.41)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = oradb10)
)
)
那么dblink可以这样创建
create databaselink TEST_DBLINK
connect touser_name identified by password
using ‘TEST';
这样创建的和上面的效果是一样的,常用第一种。创建好好后,可以通过如下语句验证dblink是否已经通了:
Select 1 from dual@TEST_DBLINK;
1
----------
1
如果成功查寻出结果,即表示dblink已经建好了
特殊创建(global_name=true的情况)
创建好dblink进行操作时报错:ora-02069 global_names必须为TURE,解决办法如下:
按照错误提示,我们应该先将global_name设为true,
Ø 首先查看当前被链接的数据库的相关配置:
SQL> showparameter global_names;
执行之后显示如下
NAME TYPE VALUE
-----------------------------------------------------------------------------
global_names boolean FALSE
可以看到当前被链接的库其global_names参数为FALSE。
Ø 查看数据库的global_name的值
SQL> select *from global_name;
执行之后显示如下
GLOBAL_NAME
------------------------------------------------------------------------------
ORADB10.WYS.COM.CN
(可以使用下边的语句修改global_name 名称(需sys用户)
update props$ setvalue$ = 'oradb10' where name = GLOBAL_DB_NAME';)
Ø 修改global_name为true
SQL>altersystem set global_names=true;
当修改了global_name为true时,以前创建的普通数据库链接已经无法成功链接了,再执行a)所创建的dblink
Select 1 fromdual@TEST_DBLINK;
第 1 行出现错误:
ORA-02085:database link TEST_DBLINK.WYS.COM.CN connectsto ORADB10.REGRESS.RDBMS.DEV.US.ORACLE.COM
(global_names参数设置为FALSE,影响的是创建数据库链接的那个库对数据库链接的使用。也就是说,如果一个库(实例)的global_names参数设值为TRUE,则该库连接其他库的数据库链接,其名称必须要与被连接的库的global_name相同)
如果你只创建一个dblink
create database link ORADB10.WYS.COM.CN
connect touser_name identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.27)(PORT = 1521))
)
(CONNECT_DATA= (SERVICE_NAME = oradb10)
))';
只需要使用被连接库的 global_name作为dblink的名称即可。
此时我们再创建多个dblink时可以使用如下方法:
create databaselink ORADB10.WYS.COM.CN@TEST_DBLINK1
connect touser_name identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.27)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = oradb10)
))';
create databaselink ORADB10.WYS.COM.CN@TEST_DBLINK2
connect touser_name identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.27)(PORT = 1521))
)
(CONNECT_DATA= (SERVICE_NAME = oradb10)
))';
上面创建的dblink和我们之前创建的相比,发现我们的dblink名称为global_name+’@ TEST_DBLINK1’,global_name+’@TEST_DBLINK2’,即通过@连接了一个用以标识不同连接的名称, 而
ORADB10.WYS.COM.CN@TEST_DBLINK2整体即作为dblink的名称使用。
(另外在创建数据库链接时,不能给其他SCHEMA创建链接,这是因为数据库链接(database link)其名称可以含有'.'即点号。比如A用户想给B用户创建一个DBLINK名叫LINKB,CREATEDATABASE LINK B.LINKB ......, 这个语句将会实际创建一个A用户下的名为B.LINKB的数据库链接。)
ü 创建dblink的时候可以加上public关键字,这样创建出来的dblink可以供当前实例下所有用户使用 。Create public databaselink TEST_DBLINK ……
Synonym
创建了dblink后,可以通过
Select * fromobject_name@TEST_DBLINK去访问远程数据库了,使用synonym可以简化访问远程数据库。
建立同义词的方法
create or replace[public] synonym TEST_TABLE
forTEST_TABLE@TEST_DBLINK;(public是可选参数,当加上时,即当前数据库实例下所有用户均可使用改同义词了,不加时则只对当前用户有效。)
以后可以直接
Select* from TEST_TABLE去查询远程数据库的TEST_TABLE表了。
(用户对象都可以创建同义词的)
常用数据字典
数据字典多以"USER_","ALL_","DBA_"为前缀,"USER_"视图中记录通常记录执行查询的帐户所拥有的对象的信息,"ALL_"视图中记录包括"USER"记录和授权至PUBLIC或用户的对象的信息,"DBA_"视图包含所有数据库对象,而不管其所有者。
平常工作中常用的有
dba_tables(user_tables),dba_synonyms(user_synonyms),dba_objects(user_objects),dba_procedures(user_procedures),dba_triggers(user_triggers),dba_jobs(user_jobs),
dba_TAB_COLS(user_TAB_COLS)等。(更多的可以在pl/sql中输入dba_ 等待提示,选择自己需要的。)
常见错误的解决办法
Drop tablespace:
drop tablespacecrm_data including contents anddatafiles;
drop tablespacecrm_data including contents cascadeconstraints;
报错有下面几种:
ORA-23515
---ORA-23515:materialized views and/or their indices exist in the tablespace
droptablespacecrm_data including contents and datafiles
*
ERROR at line 1:
ORA-23515:materializedviews and/or their indices exist in the tablespace
意思是:该表空间 CRM_DATA含有物化视图,或者含有物化视图的索引
解决办法:
-- 首先删掉该表空间下的的物化视图
select'dropmaterialized view '||owner||'.'||segment_name||' ;'
from dba_segments
where segment_namein(select mview_name from dba_mviews)
andtablespace_name = 'CRM_DATA'
-- 然后删除该表空间下的其他表空间下物化视图在本表空间下创建的索引
select *
from dba_segments
wheretablespace_name= 'CRM_DATA'
andsegment_name in
(select index_name
from dba_indexes
where table_name in (select mview_name fromdba_mviews));
ORA-02429
---ORA-02429:cannotdrop index used for enforcement of unique/primary key
drop tablespacecrm_idxincluding contents cascade constraints
*
ERROR at line 1:
ORA-00604:erroroccurred at recursive SQL level 1
ORA-02429:cannotdrop index used for enforcement of unique/primary key
ORA-02429的意思是: 让你删除该表空间下面的 primary key 和 unique key
处理办法:
select 'altertable'||owner||'.'||table_name||' drop constraint '||constraint_name||' ;'
fromdba_constraints
whereconstraint_typein ('U', 'P')
and(index_owner, index_name) in
(select owner, segment_name
from dba_segments
where tablespace_name = 'CRM_IDX');
ORA-14404
--ORA-14404:partitionedtable contains partitions in a different tablespace
droptablespacecrm_arc_data including contents and datafiles
*
ERROR at line 1:
ORA-14404:partitionedtable contains partitions in a different tablespace
意思是: 本表空间下面有这么样一个或一些分区表的分区: this partition OR partitions的table所包含的全部 partitions不在一个表空间下面:
处理办法:
select 'altertable'||owner||'.'||segment_name||' drop partition '||partition_name||' ;'
from dba_segments
where segment_namein(select distinct segment_name
from dba_segments
where tablespace_name= 'CRM_ARC_DATA'
and segment_typelike '%PART%')
andtablespace_name <> 'CRM_ARC_DATA';
直接drop 这个分区表(如果允许的话)
ORA-02449
---ORA-02449:unique/primary keys in table referenced by foreign keys
drop tablespacecrm_dataincluding contents and datafiles
*
ERROR at line 1:
ORA-02449:unique/primarykeys in table referenced by foreign keys
意思是: 这个要删除的表空间 里面含有这么样的一些主键: 其他表空间的表在这些主键上建有外键
处理办法: 去掉这些垃圾外键
select 'altertable'||owner||'.'||table_name||' drop constraint '||constraint_name||' ;'
fromdba_constraints
whereconstraint_type= 'R'
andtable_name in (select segment_name
from dba_segments
where tablespace_name ='CRM_DATA'
and segment_type like'%TABLE%');
如果还是不行的话,就用这个语句来删表空间:
droptablespacecrm_data including contents cascade constraints;
临时修改用户密码登录数据库
有时候我们可能不知道一个用户的密码,但是又需要以这个用户的身份做一些操作,又不能去修改掉这个用户的密码,这个时候我们已知本实例下某一用户及密码,并且拥有必要权限,就可以以下操作来临时登录。(在试验时此方法对sys用户无效)
具体操作过程如下:
1) SELECTT.USERNAME,T.PASSWORD FROM DBA_USERS T WHERE T.USERNAME='TOMODEFY';
2) 记录查询出的password 字串,供修改回去时使用。假设为 2D594E86F93B17A1
3) 修改用户密码,然后使用此密码登录:alter user TOMODEFY identified by test;
4) 将密码修改回原来:alter user systemidentified byvalues '2D594E86F93B17A1';
Oracle监听器服务无法启动解决办法
办法一:修改注册表
解决办法就是修改注册表,ImagePath
开始-->运行REGEDIT-->进入注册表找到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleXXXTNSListener
发现ImagePath关键值没有了,新建一个名为ImagePath的可扩充字符串值,编辑字符串的数值数据为:Oracle安装路径\BIN\TNSLSNR
办法二:重新配置个监听器
1.停掉所有ORACLE服务,设为手动。进入oracle网络管理工具“Net Configration Assistant”或“Net Assistant”,重新配置一个监听服务,名为“Listener1”。
2.进入“命令提示符”,运行“监听控制程序——LSNRCTL”,再运行“start listener1”,首次启动Listener1监听程序,为Listener1在操作系统服务里生成相关服务项。为了后面的修改操作能够生效,再运行“stop listener1”停止Listener1。
3.将服务中原Listener服务的“启动类型”改为“已禁用”,将已生成的Listener1服务的“启动类型”改为“自动”。
4.用“记事本”打开监听服务配置文件“ORACLE_HOME \ network \ admin \listener.ora”,将“LISTENER =”、“SID_LIST_LISTENER =”分别改为“LISTENER1 =”、“SID_LIST_LISTENER1 =”,并删除当前的“LISTENER1 =”、“SID_LIST_LISTENER1 =”项。该操作的作用为:不用费力为Listener1监听服务再配置常规参数、数据库监听等,直接采用原Listener服务的配置。
5.再启动Listener1监听服务,可以连接到数据库。
weblogic密码遗忘补救方法
备份 %DOMAIN_HOME%/security下的DefaultAuthenticatorInit.ldift文件,和%DOMAIN_HOME%下的boot.properties文件
(如果不在这个目录,那么找找%DOMAIN_HOME%/servers/AdminServer/security目录),这样如果下列步骤操作失败还能还原回去。
运行
java-cp/bea/weblogic92/server/lib/weblogic.jar weblogic.security.utils.AdminAccount<新用户名> <新密码> .(注意最后有个点的,点之前有空格)
执行完后在当前目录会生成一个新的DefaultAuthenticatorInit.ldift文件,然后替换原来的%DOMAIN_HOME%/security/DefaultAuthenticatorInit.ldift文件。
从%DOMAIN_HOME%/servers/AdminServer/data/ldap/子目录中删除初始化状态文件DefaultAuthenticatormyrealmInit.initialized,删除boot.properties。
运行startWebLogic.sh,启动过程中会让你输入用户名和密码,输入新建立的那个
用新的用户名密码登录管理控制台,在“安全领域”里点击“myrealm”,在用户和组里,找到之前的那个用户,修改密码,保存,那么以后可以继续使用原来的用户名和密码登录,
修改boot.properties中的用户密码为上一步修改过的用户密码(明文)格式为
username=用户名
password=密码
重启服务器,现在不用输入用户名密码了,成功启动后,weblogic会加密用户密码的。
ORACLE用IMP导入用户表时选择表空间的问题
在一个数据库里把一个用户A的在表空间AA上的表用exp导出到exp.dmp文件中,再把它导入到另一台机器上的数据库里,这时用的是用户B,默认表空间是BB,但是用imp导入时我们发现表是导入到了B用户下,但是还是存在了AA表空间里面,但是需要导入到BB里,这时我们又试了好几次,都是这样。
解决方案。
SQL> createuser B identified by B default tablespace BB;//先创建一个用户
SQL> grantresource,connect to B;
SQL> grant dbato B;//赋DBA权限
SQL> revokeunlimited tablespace from B;//撤销此权限
SQL> alter userB quota 0 on system;//将用户在System表空间的配额置为0
SQL> alter userB quota unlimited on BB;//设置在用户在BB表空间配额不受限。
经过上述设置后,就可以用imp导入数据,数据将会进入指定的BB表空间:
C: impsystem/123456@vdb fromuser=A touser=B file=G:\exp.dmpignore=y grants=n
顺便说两个小问题:
(1)IMP-00003: 遇到 ORACLE 错误 1658
ORA-01658: 无法为表空间 MYHUANG 中的段创建 INITIAL 区
通常这个问题可以通过Resize增加表空间数据文件大小来解决。
(2)删除表空间
SQL> drop tablespace BB includingcontents anddatafiles