精华内容
下载资源
问答
  • Linux平台Oracle连接MySQL

    2021-01-19 17:04:36
    【前言】Windows平台Oracle连接MySQL的方法已经给大家介绍过了,现在大部分的Oracle和MySQL都是在Linux平台上面,刚好最近也有这种需求,顺手把整个搭建过程记录起来和大家分享。【原理】通过ODBC连接MySQL的原理图...

    【前言】Windows平台Oracle连接MySQL的方法已经给大家介绍过了,现在大部分的Oracle和MySQL都是在Linux平台上面,刚好最近也有这种需求,顺手把整个搭建过程记录起来和大家分享。

    【原理】通过ODBC连接MySQL的原理图

    3989e82f59412bb1a599daf6126090ee.png

    【说明】Driver Manager: 负责管理应用程序和驱动程序间的通信, 主要功能包括: 解析DSN (数据源名称,ODBC的数据源名称在ODBC.INI文件中配置), 加载和卸载驱动程序,处理ODBC调用,将其传递给驱动程序.

    Connector/ODBC(MyODBC驱动程序):实现ODBC API所提供的功能, 它负责处理ODBC函数调用,将SQL请求提交给MySQL服务器,并将结果返回给应用程序.

    ODBC.INI是ODBC配置文件,记录了连接到服务器所需的驱动信息和数据库信息。Driver Manager将使用它来确定加载哪个驱动程序(使用数据源名DSN)。驱动程序将根据指定的DSN来读取连接参数。

    【配置思路】

    在Linux下配置mysql ODBC 需要有以下步骤:

    a) 安装Driver Manager , 本案例使用unixODBC 来作为Driver Manager

    b) 安装MySQL驱动程序, 本案例使用Connector/ODBC

    c) 配置ODBC.INI

    【环境说明】

    操作系统:CentOS release 6.5 (Final)

    目标数据库:ORACLE 11.2.0.3

    源数据库:mysql5.23

    【操作步骤】

    一、ODBC的配置

    1.1、在目标数据库上面安装unixODBC,脚本:yum install unixODBC

    1.2、安装mysql-connector-odbc,下载链接:http://pan.baidu.com/s/1bnuiWCR 密码:rf98

    进行解压后修改文件名放在/usr/local/

    [root@test local]# pwd

    /usr/local

    [root@OTO-DBR-T02 local]# ll

    total 56

    drwxr-xr-x. 5 root root 4096 Oct 22 11:15 mysql-connector-odbc

    1.3、配置odbc.ini文件

    [myodbc]#需要记住该名称

    Driver = /usr/local/mysql-connector-odbc/lib/libmyodbc5.so

    Description = Connector/ODBC 5.1 Driver DSN

    SERVER = 192.168.199.244

    PORT = 3306

    USER = root

    PASSWORD = root

    DATABASE = test

    OPTION = 0

    TRACE = OFF

    1.4、测试连接

    [root@test local]# isql myodbc -v

    +---------------------------------------+

    | Connected! |

    | |

    | sql-statement |

    | help [tablename] |

    | quit |

    | |

    +---------------------------------------+

    SQL>

    祝贺,弹出该窗口说明可以连接到mysql了。

    二、监听的配置

    2.1 进入ORACLE_HOME/hs/admin

    [oracle@test admin]$ vi initmyodbc.ora

    # This is a sample agent init file that contains the HS parameters that are

    # needed for the Database Gateway for ODBC

    #

    # HS init parameters

    #

    HS_FDS_CONNECT_INFO = myodbc

    HS_FDS_TRACE_LEVEL = ON

    HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

    #

    # ODBC specific environment variables

    #

    set ODBCINI= /etc/odbc.ini

    #

    # Environment variables required for the non-Oracle system

    #set =

    2.2 配置listener.ora 文件

    进入$ORACLE_HOME/network/admin

    [oracle@test admin]$ vi listener.ora

    # listener.ora Network Configuration File: /oracle/oracle11/network/admin/listener.ora

    # Generated by Oracle configuration tools.

    LISTENER =

    (DESCRIPTION_LIST =

    (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = test)(PORT = 1521))

    )

    )

    ADR_BASE_LISTENER = /oracle

    SID_LIST_LISTENER =

    (SID_LIST =

    (SID_DESC =

    (SID_NAME = CLRExtProc)

    (ORACLE_HOME = /oracle/oracle11 ) #ORACLE_HOME

    (PRESPAWN_MAX = 20)

    )

    (SID_DESC =

    (SID_NAME = myodbc) #与上面的文件名对应

    (ORACLE_HOME = /oracle/oracle11 ) #ORACLE_HOME

    (PROGRAM = dg4odbc) #11g为dg4odbc,10g不一样

    )

    )

    ~

    重启监听后看下myodbc的服务是否已经启动

    [oracle@test oracle11]$ lsnrctl status

    LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-OCT-2015 15:22:12

    Copyright (c) 1991, 2009, Oracle. All rights reserved.

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test)(PORT=1521)))

    STATUS of the LISTENER

    ------------------------

    Alias LISTENER

    Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production

    Start Date 22-OCT-2015 15:08:57

    Uptime 0 days 0 hr. 13 min. 15 sec

    Trace Level off

    Security ON: Local OS Authentication

    SNMP OFF

    Listener Parameter File /oracle/oracle11/network/admin/listener.ora

    Listener Log File /oracle/diag/tnslsnr/test/listener/alert/log.xml

    Listening Endpoints Summary...

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test)(PORT=1521)))

    Services Summary...

    Service "CLRExtProc" has 1 instance(s).

    Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...

    Service "myodbc" has 1 instance(s).

    Instance "myodbc", status UNKNOWN, has 1 handler(s) for this service...

    The command completed successfully

    2.3 配置 tnsnames.ora 文件

    myodbc =

    (DESCRIPTION =

    (ADDRESS_LIST =

    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

    )

    (CONNECT_DATA =

    (SERVICE_NAME = myodbc) #与上面的监听相对应

    )

    (HS = OK)

    )

    2.4 创建dblink

    create database link myodbc connect to "root" identified by "root" using 'myodbc' ;

    2.5 检查dblink

    SQL> select * from dual@myodbc;

    D

    -

    X

    说明已经完成在linux平台的ORACLE连接MySQL的配置;

    另:配置完2.2步骤之后可能数据库本身的监听服务就不见了,这时候可以执行,让系统进行重新注册

    alter system set local_listener='(address=(protocol=tcp)(port=1521)(host= hostname))'  scope=both;

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 一、oracle sysdba 级用户的认证方式有两种方式:OS认证和口令文件认证。OS认证就是说若以oracle的安装用户登录的话可以直接登录到数据库并且是sys用户,权限为sysdba的。口令认证就是登陆数据库必须用户名和口令。1...

    一、oracle sysdba 级用户的认证方式有两种方式:OS认证和口令文件认证。

    OS认证就是说若以oracle的安装用户登录的话可以直接登录到数据库并且是sys用户,权限为sysdba的。口令认证就是登陆数据库必须用户名和口令。

    1、os认证    oracle安装之后默认情况下是启用了os认证的,这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以安装oracle时的用户登录os,那么此时在登录oracle数据库时不需要任何验证,如:

    SQL> connect /as sysdba

    已连接。

    SQL> connect sys/aaa@dmt as sysdba

    已连接。

    SQL> connect sys/bbb as sysdba

    已连接。

    SQL> connect aaa/bbb as sysdba

    已连接。

    SQL> show user

    USER 为 "SYS"

    SQL>

    不论输入什么用户(哪怕这个用户如aaa在数据库中根本不存在),只要以sysdba权限连接数据库,都可以连接上,并且连接用户是sys,这样很方便,有时候,如果忘记了数据库的密码,而又想登录数据库,可以通过这种方式,前提是在数据库服务器上。

    但是方便的同时也带来了一些安全隐患,于是很多人想屏蔽os认证,在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注释掉这句话(在前面加上#),就可以屏蔽os功能,要想以sys用户连上数据库必须输入正确的sys口令,如:

    SQL> connect /as sysdba

    ERROR:

    ORA-01031: 权限不足

    SQL> connect sys/aaa as sysdba

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    SQL> connect aaa/bbb as sysdba

    ERROR:

    ORA-01031: 权限不足

    SQL> connect sys/system as sysdba

    已连接。

    SQL>

    或者可以把oracle的安装用户从组ora_dba中删除掉,当然也可以直接把ora_dba这个组也删除,都可以屏蔽os功能。在unix/linux下也可以在文件sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及删除dba(groupdel dba)组或者把oracle用户从dba组中删除都可以屏蔽os认证。利用这两种方法屏蔽os功能似乎总有些让人不放心,或者说不能让人完全信服,因为毕竟系统管理员还是可以创建ora_dba or dba组以及修改sqlnet.ora文件,如何彻底屏蔽os功能?让它"永世不得翻身"呢?我没有这方面的经验,大家可以补充!

    默认情况下,linux 下的oracle的支持OS认证方式,除非特别声明。

    其设定在文件¥ORACLE_HOME/network/admin/sqlnet.ora。

    SQLNET.AUTHENTICATION_SERVICES=(none)

    若没有指定这个话,则两种模式都可以。若指定=none,则表示不用OS认证方式。

    2、口令文件

    oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件,因此我认为在数据库中存放sys用户的口令其实没有任何意义!使用口令文件的好处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。开始安装完oracle,没有给普通用户授予sysdba权限,口令文件中只存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库处于open状态。

    oracle 口令文件一般为:¥ORACLE_HOME/dbs/orapw$SID.ora.

    如:

    SQL> grant sysdba to test;

    授权成功。

    SQL> connect test/aaa@orcl as sysdba

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    警告: 您不再连接到 ORACLE。

    SQL> connect test/test@orcl as sysdba

    已连接。

    SQL> alter database close;

    数据库已更改。

    SQL> grant sysdba, sysoper to test;

    grant sysdba, sysoper to test

    *

    第 1 行出现错误:

    ORA-01109: 数据库未打开

    到底有几个用户被授予了sysdba或者sysoper权限,可以通过查询如下v$pwfile_users获得,v$pwfile_users的信息就是源于口令文件的(This view lists users who have been granted SYSDBA and SYSOPER privileges as derived from the password file.)

    SQL> select * from v$pwfile_users;

    USERNAME SYSDB SYSOP

    ------------------------------ ----- -----

    SYS TRUE TRUE

    TEST TRUE FALSE

    到底可以有几个用户被授予sysdba或者sysoper权限,是由创建口令文件时指定的entries数决定的,准确的说还不完全是,最终还和os block的大小有关,如果entries指定了5,一个os block可以存放8个用户的口令,那么可以由8个用户被授予sysdba或者sysoper。

    下面看一个简单的测试:

    SQL> declare

    2     v_string varchar2(100);

    3  begin

    4  for i in 1..100 loop

    5     v_string := 'create user test'||i||' identified by test'||i;

    6     execute immediate v_string ;

    7  end loop;

    8  end;

    9  /

    PL/SQL 过程已成功完成。

    SQL> select count(*) from dba_users where username like '%TEST%';

    COUNT(*)

    ----------

    101

    这里之所以是101,是因为之前已经创建过test用户

    SQL> declare

    2     v_string varchar2(100);

    3  begin

    4          for i in 1..100 loop

    5             v_string := 'grant sysdba to test'||i;

    6                  execute immediate v_string ;

    7          end loop ;

    8  end ;

    9  /

    declare

    *

    第 1 行出现错误:

    ORA-01996: GRANT 失败: 口令文件 '' 已满

    ORA-06512: 在 line 6

    SQL> select * from v$pwfile_users;

    USERNAME                       SYSDB SYSOP

    ------------------------------ ----- -----

    SYS                            TRUE  TRUE

    TEST1                          TRUE  FALSE

    TEST2                          TRUE  FALSE

    TEST3                          TRUE  FALSE

    TEST4                          TRUE  FALSE

    TEST5                          TRUE  FALSE

    TEST6                          TRUE  FALSE

    TEST7                          TRUE  FALSE

    TEST8                          TRUE  FALSE

    已选择9行。

    SQL>

    可以清楚的看到v$pwfile_users里面并不是创建口令文件时指定的entries=5而是9条记录,意味着9个用户的口令占用了一个os block,其实也可能是多个os block,总之这些block都是满的,但是观察口令文件,还是占了2k,这是我解释不清的地方。通过os命令发现;每个簇字节数4096;这里其实就是os block 大小实际上是4k,但是口令文件占用了2k,根本没有用满一个os block,不知道何故,也是我的疑惑 (

    This parameter specifies the number of entries that you require the password file to accept. This number corresponds to the number of distinct users allowed to connect to the database as SYSDBA or SYSOPER. The actual number of allowable entries can be higher than the number of users, because the ORAPWD utility continues to assign password entries until an operating system block is filled. For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four.

    )

    win下查看os block大小

    C:\WINDOWS\system32>fsutil fsinfo ntfsinfo e:

    NTFS 卷序列号 :       0x12afb454f6e54b31

    版本 :                         3.1

    区数量 :                  0x00000000040270d0

    簇总数 :                  0x0000000000804e1a

    可用簇  :                  0x00000000000b8d41

    保留总数 :                  0x0000000000000000

    每个扇区字节数  :               512

    每个簇字节数 :               4096

    每个 FileRecord 段的字节数    : 1024

    每个 FileRecord 段的簇数 : 0

    Mft 有效数据长度 :           0x00000000058d0000

    Mft 起始 Lcn  :                  0x0000000000000004

    Mft2 起始 Lcn :                  0x0000000000080000

    Mft 区域起始 :                  0x0000000000483740

    Mft 区域结尾   :                  0x000000000049c760

    C:WINDOWS\system32>

    还有一个问题修改了口令,口令长度增加了,按说占用的空间多了,但是查询v$pwfile_users发现还是9条记录?不过这个问题突然想到了答案,那就是不论我们的口令多长,加密之后的长度几乎都是相同的,也就是说口令文件占用的大小和口令指定的长度几乎关系不大!

    SQL> edit

    已写入 file afiedt.buf

    1  declare

    2     v_string varchar2(100);

    3  begin

    4          for i in 1..100 loop

    5             v_string := 'alter user test'||i||' identified by  aaaaaaaaaaaaaaaaaaaaaa'||i;

    6                  execute immediate v_string ;

    7          end loop ;

    8* end ;

    SQL> /

    PL/SQL 过程已成功完成。

    SQL> declare

    2     v_string varchar2(100);

    3  begin

    4          for i in 1..100 loop

    5             v_string := 'grant sysdba to test'||i;

    6                  execute immediate v_string ;

    7          end loop ;

    8  end ;

    9  /

    declare

    *

    第 1 行出现错误:

    ORA-01996: GRANT 失败: 口令文件 '' 已满

    ORA-06512: 在 line 6

    SQL> select * from v$pwfile_users;

    USERNAME                       SYSDB SYSOP

    ------------------------------ ----- -----

    SYS                            TRUE  TRUE

    TEST1                          TRUE  FALSE

    TEST2                          TRUE  FALSE

    TEST3                          TRUE  FALSE

    TEST4                          TRUE  FALSE

    TEST5                          TRUE  FALSE

    TEST6                          TRUE  FALSE

    TEST7                          TRUE  FALSE

    TEST8                          TRUE  FALSE

    已选择9行。

    SQL>

    E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:\oracle\product\10.2.0\db_1

    databasepwd.ora password=system entries=5

    OPW-00005: 存在相同名称的文件 - 请删除或重命名

    E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:oracleproduct10.2.0db_1

    databasepwd.ora password=system entries=5 force=y

    创建口令文件需要注意的是=前后没有空格!另外值得一提的是10g增加了一个新的参数force default值n,它的作用类似于创建表空间时的reuse功能,当同名文件存在时是否覆盖。

    是否使用口令文件,是通过oracle提供的一个参数remote_login_passwordfile来控制的,remote_login_passwordfile有none,shared,exclusive3个值,none表示不使用口令文件,exclusive表示实例独占使用口令文件,也就是各自实例使用单独的口令文件,shared表示多个实例共享一个口令文件,缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感),unix下寻找口令文件的顺序是oracle_home\dbs\orapwSID,如果找不到,会在dbs目录想寻找orapw文件,如果找不到9i下会报错,数据库可以启动到mount状态,当然再次alter database open之后还是可以打开数据库。10g下open数据库时不在检查口令文件。win下如果在oracle_home/database/下找不到pwdsid.ora文件,不会寻找任何文件。这里所说的win下如果找不到PWDsid.ora文件之后不会寻找任何文件其实是相对unix下如果找不到orapwSID文件之后会寻找orapw文件而言的。其实win下寻找口令文件也是有顺序的。寻找顺序是这样的:首先寻找注册表中ora_sid_pwfile环境变量所指向的口令文件,其次寻找ora_pwfile执行的口令文件,最后才寻找$ORACLE_HOME/database/PWDsid.ora,下面做一个简单的测试:

    开始存在一个口令文件PWDtsid.ora,之后又创建了两个口令文件pwd.ora和orapwd.ora

    C:>orapwd file=E:\oracle\product\10.2.0\db_1\database\pwd.ora password=manager entries=5 force=y

    C:>orapwd file=E:\oracle\product\10.2.0\db_1\database\orapwd.ora password=manager_system entries=5

    C:>e:

    E:>cd E:\oracle\product\10.2.0\db_1\database

    E:\oracle\product\10.2.0\db_1\database>dir *pwd*

    驱动器 E 中的卷没有标签。

    卷的序列号是 F6E5-4B31

    E:\oracle\product\10.2.0\db_1\database 的目录

    2007-12-07  21:30             2,048 orapwd.ora

    2007-12-07  21:29             2,048 pwd.ora

    2007-12-06  21:44             2,048 PWDtsid.ora

    3个口令文件的口令分别是system, manager, system_manager没有什么特别的意义,都是随意指定的,其中在注册表中ora_tsid_pwfile指向了文件E:\oracle\product\10.2.0\db_1\databasepwd.ora,ora_pwfile指向了E:\oracle\product\10.2.0\db_1\databaseorapwd.ora,然后通过远程client端进行测试:

    SQL> connect sys/system@testdb as sysdba

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    警告: 您不再连接到 ORACLE。

    SQL> connect sys/manager@testdb as sysdba

    已连接。

    SQL> connect sys/manager_system@testdb as sysdba

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    警告: 您不再连接到 ORACLE。

    SQL>

    测试结果显示要求输入的口令是manager,而manager对应的口令文件是环境变量ora_tsid_pwfile所指向的pwd.ora,之后删除环境变量ora_tsid_pwfile再次连接:

    SQL> connect sys/system@testdb as sysdba

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    警告: 您不再连接到 ORACLE。

    SQL> connect sys/manager_system@testdb as sysdba

    已连接。

    SQL>

    这次要求输入的口令是manager_system,而manager_system对应的口令文件是环境变量ora_pwfile所指向的orapwd.ora,之后删除环境变量ora_pwfile进行连接测试:

    SQL> connect sys/system@testdb as sysdba

    已连接。

    SQL>

    连接成功,system对应的口令文件正是$ORACLE_HOME/database/PWDtsid.ora

    接着上面介绍共享口令文件,由于在unix下会寻找orapw文件(该文件不含sid的信息),因此各个实例可以shared口令文件,前提是需要把参数remote_login_passwordfile设置为shared,该参数是静态参数,修改之后需要重启实例,当然也可以通过连接的方式(unix下ls)实现口令文件共享,不过没感觉到共享口令文件有什么好处;win下可以通过在注册表中指定环境变量ora_sid_pwfile或者ora_pwfile来改变口令文件的位置和名称,从而也可以实现口令文件共享。

    共享口令文件会有很多问题:

    首先要求所有的sys口令相同,其次orcl库上的用户xys被授予了sysdba,结果在test1库上通过v$pwfile_users也可以看到xys用户。

    SQL> connect sys/system as sysdba

    ERROR:

    ORA-01017: invalid username/password; logon denied

    SQL> connect sys/manager as sysdba

    已连接到空闲例程。

    SQL> startup

    ORACLE 例程已经启动。

    Total System Global Area 167772160 bytes

    Fixed Size 1247900 bytes

    Variable Size 62915940 bytes

    Database Buffers 100663296 bytes

    Redo Buffers 2945024 bytes

    数据库装载完毕。

    数据库已经打开。

    SQL> alter user sys identified by system;

    用户已更改。

    SQL> show user

    USER 为 SYS;

    SQL> show parameter db_name

    NAME TYPE VALUE

    ------------------------------------ ----------- ------------------------------

    db_name string test1

    SQL> select * from v$pwfile_users;

    USERNAME SYSDB SYSOP

    ------------------------------ ----- -----

    SYS TRUE TRUE

    XYS TRUE FALSE

    SQL> select username from dba_users;

    USERNAME

    ------------------------------

    OUTLN

    SYS

    SYSTEM

    TEST

    DBSNMP

    TSMSYS

    DIP

    已选择7行。

    从上面查询结果看到数据库orcl和test1,准确的说是实例共享了口令文件之后,test1中根本不存在用户xys,但是通过v$pwfile_users还是查询出来了

    还有一个问题是如果remote_login_passwordfile=shared则sys的口令通过

    alter user...不能修改!

    SQL> show parameter remote_log

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    remote_login_passwordfile            string      SHARED

    SQL> alter user sys identified by manager;

    alter user sys identified by manager

    *

    第 1 行出现错误:

    ORA-28046: 不允许更改 SYS 口令

    提到alter user...这个系统权限,我觉得oracle做的不是很安全,只要有了alter user权限,sys用户的口令可以随意修改

    ,另外凡是修改具有sysdba or sysoper权限的用户,如果通过alter user来修改口令,那么同时修改了口令文件和数据库中的口令。

    简单的测试如下:

    SQL> create user test11 identified by test11;

    用户已创建。

    SQL> grant connect , alter user to test11;

    授权成功。

    SQL> connect test11/test11

    已连接。

    SQL> CONNECT / as sysdba

    已连接。

    SQL> grant select on dba_users to test11;

    授权成功。

    SQL> connect test11/test11

    已连接。

    SQL> col username format a10

    SQL> col password format a30

    SQL> select password , username from dba_users where username ='SYS';

    PASSWORD                       USERNAME

    ------------------------------ ----------

    75800913E1B66343               SYS

    SQL> show user

    USER 为 TEST11;

    SQL> alter user sys identified by manager;

    用户已更改。

    SQL> select password , username from dba_users where username ='SYS';

    PASSWORD                       USERNAME

    ------------------------------ ----------

    5638228DAF52805F               SYS

    SQL>

    remote_login_passwordfile=shared时,也不能把sysdba or sysoper授予普通用户!

    SQL> grant sysdba to test;

    grant sysdba to test

    *

    第 1 行出现错误:

    ORA-01999: 口令文件不能在 SHARED 模式下更新

    SQL> grant sysoper to test;

    grant sysoper to test

    *

    第 1 行出现错误:

    ORA-01999: 口令文件不能在 SHARED 模式下更新

    通过上面两部分内容的解释,了解了os认证和口令文件之后,如果为了安全不想让用户以sysdba or sysoper权限连接数据库,可以通过上面的方法屏蔽os认证的同时静止使用口令文件。

    3、sysdba 和 sysoper

    很多人可能不了解sysdba and sysoper到底是什么,其实他们是oracle的system privilege,通过查询系统权限表system_privilege_map可以清楚的知道:

    SQL> select name from system_privilege_map where name like 'SYS%';

    NAME

    ----------------------------------------------------------------------------

    SYSOPER

    SYSDBA

    只不过这两个权限就是以这种方式发挥作用的!

    两种权限的比较在oracle doc上给出了明确的交代:

    The following operations are authorized by the SYSDBA and SYSOPER system privileges:

    System Privilege Operations Authorized

    SYSDBA Perform STARTUP and SHUTDOWN operations

    ALTER DATABASE: open, mount, back up, or change character set

    CREATE DATABASE

    DROP DATABASE

    CREATE SPFILE

    ALTER DATABASE ARCHIVELOG

    ALTER DATABASE RECOVER

    Includes the RESTRICTED SESSION privilege

    Effectively, this system privilege allows a user to connect as user SYS.

    SYSOPER Perform STARTUP and SHUTDOWN operations

    CREATE SPFILE

    ALTER DATABASE OPEN/MOUNT/BACKUP

    ALTER DATABASE ARCHIVELOG

    ALTER DATABASE RECOVER (Complete recovery only. Any form of incomplete recovery, such as UNTIL TIME|CHANGE|CANCEL|CONTROLFILE requires connecting as SYSDBA.)

    Includes the RESTRICTED SESSION privilege

    This privilege allows a user to perform basic operational tasks, but without the ability to look at user data.

    值的一提的是win下尤其是home版的xp控制面板中没有组的可操作界面,而oracle默认安装之后也没有为我们创建ora_oper 这个组,因此在以sysoper权限连接数据库时提示没有权限:

    SQL> connect / as sysoper

    ERROR:

    ORA-01031: 权限不足

    为了能够以sysoper方式连接数据库,于是可以通过dos命令方式创建ora_oper组,同时把os用户加入到这个组中:

    E:>net  localgroup ora_oper /add

    命令成功完成。

    E:>net  localgroup ora_oper wch /add

    命令成功完成。

    有关localgroup的详细说明可以通过命令net help localgroup获得更多的帮助,注意和group的区别,group用在domain中

    再次尝试接连,连接成功:

    SQL> connect / as sysoper

    已连接。

    SQL> show user

    USER 为 PUBLIC;

    SQL>

    但是需要注意的是以sysoper权限连接数据库时显示的schema是public,而以sysdba连接时显示的schema是我们众所周知的sys,这也是sysdba和sysoper的区别之一。

    同时需要注意的是在linux下默认是可以以sysoper 连接数据库的:

    [oracle@xys oracle]$ sqlplus /nolog

    SQL*Plus: Release 11.1.0.6.0 - Production on Fri Dec 7 23:52:49 2007

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    SQL> connect / as sysoper

    Connected to an idle instance.

    SQL> create user wch identified externally;

    用户已创建。

    SQL> grant create session to wch;

    授权成功。

    SQL> show parameter auth

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- -------------------------

    os_authent_prefix                    string      OPS$

    remote_os_authent                    boolean     FALSE

    SQL> col username format a10

    SQL> col password format a30

    SQL> select username , password from dba_users where username='WCH';

    USERNAME   PASSWORD

    ---------- ------------------------------

    WCH        EXTERNAL

    SQL> connect /

    ERROR:

    ORA-01017: 用户名/口令无效; 登录被拒绝

    警告: 您不再连接到 ORACLE。

    SQL>

    使用普通用户os认证的好处是可以在执行一些批处理脚本时屏蔽数据库连接用户的口令,如exp ,expdp . sqlldr等。

    展开全文
  • Linux下运行java程序(jdk 1.7),该程序会获取Oracle数据库连接,为了提高处理速度,采用了多个进程并行启动处理,这时,偶尔会发生数据库连接获取超时失败的异常发生.而且windows环境下没有问题.java.sql.SQLException: ...

    Linux下运行java程序(jdk 1.7),该程序会获取Oracle数据库连接,为了提高处理速度,采用了多个进程并行启动处理,这时,偶尔会发生数据库连接获取超时失败的异常发生.而且windows环境下没有问题.

    java.sql.SQLException: IO Error: End of TNS data channel

    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)

    at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)

    at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)

    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)

    或者

    java.sql.SQLException: IO Error: Connection reset

    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)

    at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)

    at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)

    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)

    解决办法:

    java启动的时候添加启动参数 「-Djava.security.egd=file:/dev/./urandom」

    注意:「-Djava.security.egd=file:/dev/urandom」的话,相当于「-Djava.security.egd=file:/dev/random」

    原因分析

    Oracle的JDBC  driver程序里面在获取db连接的时候用到了java的SecureRandom,来获取随机字节数据流,用来产生随机数,-Djava.security.egd配置的就是随机数据收集伪设备,linux下有两种:

    1./dev/random,利用系统中断来生成随机数据,所以当系统不是很繁忙的时候,中断数很少,那么调用进程就会进入等待状态,直到有足够用的中断数的时候,才会返回随机数,而这时可能已经发生getConnection超时了

    2./dev/urandom,不利用系统中断来生成随机数,所以不会造成调用进程等待

    所以,我们的遇到的情况必须使用urandom才行,由于java的bug,即使指定file:/dev/urandom,SecureRandom使用的仍然是random,为了绕过这个bug,我们发现了「-Djava.security.egd=file:/dev/./urandom」这种配置方式,来达到我们使用urandom的目的.

    为了验证配置前后的速度,可以用下面的小程序进行对比确认

    JRand.java

    import java.security.SecureRandom;

    class JRand {

    public static void main(String args[]) throws Exception {

    System.out.println("Ok: " +

    SecureRandom.getInstance("SHA1PRNG").nextLong());

    }

    }

    time java -Djava.security.egd=file:/dev/urandom JRand

    time java -Djava.security.egd=file:/dev/./urandom JRand

    展开全文
  • linux 下使用otl 来连接oracle10g 数据库,当前只写了oracle的一个查询语句。并提供了编译的Makefile说明Linux 下Otl 连接oracle的简单例子这个otl弄的很纠结的了,上网上在linux 下只见有例子 ,但是都没见有编译...

    在linux 下使用otl 来连接oracle10g 数据库,当前只写了oracle的一个查询语句

    。并提供了编译的Makefile说明

    Linux 下Otl 连接oracle的简单例子

    这个otl弄的很纠结的了,上网上在linux 下只见有例子 ,但是都没见有编译的命令出现,搞得一直没有编译通过。不过最后终于弄好了

    编译的时候出现的几个问题了:

    1 otl_connect otl_connect' was not declared in this scope 还有not a type

    2 /oci.h:461:23: error: oratypes.h: No such file or directory

    3 undefined reference to `OCIServerDetach' 等

    等等 主要的问题还是一些头文件没有被包含进去

    下面参照一个例子来说明:

    //文件名称:otloracle.cpp

    #include //c的标准头

    #include //c++头文件

    #define OTL_ORA10G //指定连接的数据库类型 这个是必须的了,

    //且注意了 这些宏必须定义在 #include "otlv4.h",不然编译时会报otl_connect not a type // 即说:otl_connect 并不是一种类型,但是当你去 otlv4.h 中去查看时,确实有这么的一 //个类

    //相关的宏定义列表 http://www.wendangwang.com/otl3_compile.htm

    #define OTL_ANSI_CPP //使用标准的c++库

    #define ConnectDb "tspdb/tspdb@tspdb" //我的数据连接的用户和密码以及ORACLE_SID #include "otlv4.h" //这个就是otl的库了 使用otl只有这么一个头文件 ,相关缺少的库文件在编译的时候需要再去查,一般oracle 就是一个libclntsh.so

    //#include "oci.h" //这个没什么用,不需要

    using namespace std; //标准的I/O命名空间

    char strSelect[100]={"select businum,businame,crt_date from m01_busi_type"}; //查询的语句

    otl_connect oracledb; //定义个数据库连接实例

    int selectDB() //查询的函数

    {

    otl_stream oraout(100,strSelect,oracledb);

    int count=0;

    char myfeild1[64]="";

    char myfeild2[64]="";

    char myfeild3[64]="";

    cout<

    while(!oraout.eof())

    {

    oraout>>myfeild1;

    oraout>>myfeild2;

    oraout>>myfeild3;

    展开全文
  • 在程序中连接Oracle数据库的方式与其他常用数据库,如:MySql,Sql Server不同,这些数据库可以通过直接指定IP的方式连接,但是Oracle则需要通过Oracle客户端配置网络服务名的方式来连接。否则就会出现“ORA-12154: ...
  • 问题描述oralce linux 可以ssh到其他设备,可是其他设备ssh不上oracle linuxssh username@hostip -vOpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013debug1: Reading configuration data /etc/ssh/ssh_configdebug1:...
  • 就是在已有的数据库实例上创建一个新的帐号,访问一些新的表操作步骤如下:1、登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用户)2、以sysdba方式来打开sqlplus,命令...
  • 请输入用户名: sys/sys@wq2000aserveras sysdba 连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - ...
  • 分享给大家供大家参考,具体如下:1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用户)2)首先要打开监听器命令如下:lsnrctl start,然后sqlplus /nolog ,然后conn /as...
  • JAVA版本:1.8JDBC连接oracle的jar包:odbc5.jarClass.forName("oracle.jdbc.driver.OracleDriver").newInstance();开一个实例需要用到OracleDriver的四个properties:user:用户 Stringpassword:密码 ...
  • #1:runuser命令runuser命令使用一个替代的用户或者组ID运行一个Shell。这个命令仅在root用户时有用。仅以会话PAM钩子运行,并且没有密码提示。如果用一个非root用户,并且该用户没有权限设置user ID,这个命令将会...
  • 从事Oracle相关工作的人,每天都会使用各种工具连接Oracle数据库,比如:SQL*Plus、PL/SQL、TOAD、SQLDeveloper等等,下面就列举了几种连接Oracle的方式,本例中使用的是SQL*Plus为例。1、Easy Connect命名方式...
  • 配置好rac后,两个节点用tnsping都可以ping通,但用sqlplus连接都出现以下错误,不知道哪里出了问题[oracle@rac2 admin]$ lsnrctl statusLSNRCTL for Linux: Version 9.2.0.4.0 - Production on 04-MAR-2008 08:32:26...
  • 相信作为ORACLE数据库的开发人员没有少碰到“ORA-12154: TNS: 无法解析指定连接标识符”,今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到同样问题的友人们提供帮助。问题场景描述:服务器端...
  • 在某些特定的情形下,有时候需要从客户端连接到RAC中指定的实例,而不是由客户端Load_balance来动态选择或者是通过服务器端的监听器根据负载情形来转发。对此我们可以通过为tnsnames.ora中特定的网络服务名添加...
  • 官网连接 https://docs.oracle.com/en/database/oracle/oracle-database/19/index.html
  • 有些时候产线DB进行保养,限制的时间比较短,而通常这个时候又有大量用户远程连接的情况下,通过shutdown immediate来关闭数据库,需要的时间比较长,虽然通过shutdown abort来关闭数据库比较快速,但是容易出现...
  • LinuxOracle数据库备份的方法有很多,就像mysql一样可以使用不同方法进行备份oracle数据库先来介绍一些不使用脚本我们直接使用命令备份与还原oracle数据库Oracle数据备份:步骤 1 备份用户数据。1.使用linux系统...
  • 在安装oracle的时候PL/SQL报错:“ORA-12154: TNS:无法解析指定连接标识符”,在网上找了很多资料,然后问题解决。其中下面的文章分析的过程很值得学习,特地转载过来时刻告诫自己全局观的重要性!!!下面是引用...
  • 这样对于需要定时执行的www.cppcns.com脚本,我们可以建个先介绍一下客户端的安装:linux 环境到oracle 官网下载,之后安装以下两个模块:rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpmrpm -ivh...
  • 在虚拟机上安装好Linux系统后选择虚拟机设置—>网络适配器—>网络连接—>桥接模式1.2然后进入系统配置网卡。永久修改:vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0(设备名称)TYPE=Ethernet...
  • 本文讲述了LINUXOracle数据导入导出的方法。分享给大家供大家参考,具体如下:一. 导出工具 exp1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/binexp导出工具将数据库中数据备份压缩成一个二进制系统...
  • 用PL/SQL Developer连接公司 Oracle 数据库,登录时出现如下错误信息:ORA-12154: TNS: 无法解析指定连接标识符,(有时可能不会出现错误对话框,但也连不上,多试几次都会弹出如下图的错误对话框)。 1. 检查服务...
  • 一、连接数据库(pdb可插拔数据库) #使用sqlplu / as sysdba登录数据库主容器 [tian][oracle@junzi ~]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Fri Jun 4 11:21:02 2021 Copyright (c)...
  • 问题用Nodejs连接oracle是比较麻烦的,不像使用mysql,Mogondb,redis等有相当丰富的库。就连官方提供的oracledb也在linux上安装的时候屡屡失败。准备工作为什么指定8.3.0版本呢,经过多个版本Node在多个版本的linux...
  • 使用SQLPlus连接Oracle数据库,ORA-12154: TNS: 无法解析指定的连接标识符 在使用SQLPlus连接数据库时出现以下错误。 然后查看了一下服务有没有启动。 listener服务必须要启动,OracleServiceBOOKSALES服务也启动了...
  • Oracle数据库常用命令、Linux监听配置、oracle linux下开放1521端口时间:2020-02-14 来源:一、Linux下Oracle数据库常用命令oracle用户下执行:$ sqlplus system/manager @ file.sql 执行sql脚本文件$ sqlplus ...
  • Oracle 数据库用户管理Oracle 权限设置一、权限分类:系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。二、系统...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,537
精华内容 25,014
关键字:

linux指定用户连接的oracle

linux 订阅