【转载】利用srvctl管理RAC数据库

[[Oracle]] 【转载】利用 srvctl 管理 RAC 数据库 srvctl 即 Server Control,是 Oracle 提供的一个命令行工具,用以用于管理 Oracle 的 RAC 环境。srvctl 在 Oracle 9i 中被引入,Oracle10g、11g 对其功能进行了很大的增强和改进。下面介绍下此命令的简单用法。 一、 查看实例状态(srvctl status) 查询所有实例和服务的状态: [oracle@node-rac1 ~]$ srvctl status database -d racdb Instance racdb2 is running on node node-rac2 Instance racdb1 is running on node node-rac1 查询实例 racdb1 的状态: [oracle@node-rac1 ~]$ srvctl status instance -d racdb -i racdb1 Instance racdb1 is running on node node-rac1 查询实例 racdb2 的状态: [oracle@node-rac1 ~]$ srvctl status instance -d racdb -i racdb2 Instance racdb2 is running on node node-rac2 查询特定节点上应用程序的状态: [oracle@node-rac1 ~]$ srvctl status nodeapps -n node-rac2 VIP is running on node: node-rac2 GSD is running on node: node-rac2 Listener is running on node: node-rac2 ONS daemon is running on node: node-rac2 查询特定节点上 ASM 实例的状态 [oracle@node-rac1 ~]$ srvctl status asm -n node-rac2 ASM instance +ASM2 is running on node node-rac2. 在上面的命令行操作中,都用到的参数是: ...

【转载】在 Oracle 中设置自增列

database Oracle 【转载】在 Oracle 中设置自增列 如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它。 一、什么是自增列 ? 自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段,这样每次增加一行时,不用指该字段的值,它就会自动增加,而且是唯一的。 当在 MySQL 中定义列时,我们可以指定一个名为 AUTO_INCREMENT 的参数。然后,每当将新值插入此表中时,放入此列的值比最后一个值加 1。 但很不幸,Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢? 二、在 Oracle 11g 中设置自增字段 1. 创建表 首先创建一张用于测试的表: CREATE TABLE "TEST" ( ID NUMBER(11) PRIMARY KEY, NAME VARCHAR2(50BYTE) NOT NULL ); 2. 创建序列 然后创建一个名为 TEST_ID_SEQ 的序列(序列名称自己随意设定): CREATE SEQUENCE TEST_ID_SEQ INCREMENT BY 1 START WITH 100 MAXVALUE 999999999 NOCYCLE NOCACHE; 如果要删除序列,可以使用下面的 SQL 命令: DROP SEQUENCE TEST_ID_SEQ; 对 SEQUENCE 的一些说明: INCREMENT BY 用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。 START WITH 用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值,当序列号顺序递减时默认值为序列号的最大值。 MAXVALUE 用于指定序列生成器可以生成的组大序列号(必须大于或等于 START WITH,并且必须大于 MINVALUE),默认为 NOMAXVALUE。 MINVALUE 用于指定序列生成器可以生成的最小序列号(必须小于或等于 START WITH,并且必须小于 MAXVALUE),默认值为 NOMINVALUE。 CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为 NOCYCLE。 CACHE 用于指定在内存中可以预分配的序列号个数(默认值:20)。 到这一步其实就已经可以实现字段自增,只要插入的时候,将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了: ...

Oracle 的字符集与乱码

database Oracle Oracle 的字符集与乱码 最近有个需求,通过 python 处理数据,然后将数据存入到 oracle 11g 库中,中间遇到了一些编码相关的问题。由于可以直接登录上 oracle 所在的服务器,所以在本机上的 sqlplus 属于客户端,只是直接连接了本机,既然这样的话,就需要配置 NLS_LANG。 很多文章只会提到,将 NLS_LANG 配置改成 SIMPLIFIED CHINESE_CHINA.AL32UTF8,或者通过 os.environ 进行设置,这确实可以解决问题,但真正的原因并不是改个这个就完事了。 其实 oracle 数据库已经做了很多的字符转换工作,只要配置得当,那么数据就能正常存入,查询,转码的过程中也不会出问题,所以就必须知道,字符具体会在那些地方变更。 下面的这篇文章解决了我的问题,也让编码问题更为清晰。 字符集的作用 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理。 在整个运行环节中,字符集在 3 个环节中发挥作用: 软件在操作系统上运作时的对用户的显示,此时采用操作系统定义的字符集进行显示。我们在系统 I/O 编程的时候经常要指定字符集,C# 中的 Text.Encoding=Encoding.Default 实际上就是告诉编译器,文本使用系统定义的默认字符集进行编码。sqlplus 也是运行在操作系统上的软件,当然要使用系统所指定的字符集对外显示内容。 数据向 Oracle 服务端传送前的通告。也就是 sqlplus 告诉服务器现在使用的字符集是什么。 数据流到达服务器后,按照服务器所使用的字符集自动翻译客户端的数据,然后存储进系统。 在客户端 sqlplus 和服务端传送数据,数据会按照服务端字符集进行翻译,这个过程是自动完成的不需要人工干预。任何时候,oracle 服务端总是按照自己的字符集设置来存取数据,客户端要想正确显示从服务端读取到的数据,也需要按照本地的字符集设置进行翻译,这个过程也是自动的。(重点是 按照本地的字符集设置) 服务器端需要采用合适的字符集进行数据存储,这个很容易理解,ASCII 字符集没办法用来存储中文汉字,因为它根本没有描述汉字所需要的编码空间。 问题常常存在于客户端与服务端通讯的过程中,sqlplus 作为运行在操作系统上的软件,无论是显示还是通讯,必然使用操作系统所使用的字符集设置。无论 sqlplus 设置的字符集,作用只有一个,那就是通告服务器端,为相互之间的字符集翻译做准备。 客户端的字符集设置是在NLS_LANG环境变量中设置的,客户读端的字符集可以和oracle客户端设置得不一样(本来人家就是自动翻译的),但是客户端字符集一定要和操作系统设置的字符集相匹配!(后面会有匹配表) 出现编码错误的原因 考虑一下,sqlplus 使用的是操作系统的字符集定义在显示和发送数据(假设是 TYPE_A),却告诉 oracle 服务器自己使用的字符集是 TYPE_B,oracle 服务器会怎么办?它会将客户端发送过来的 TYPE_A 数据当作 TYPE_B 字符集格式用自身的 TYPE_C 字符集进行翻译,然后再存储进系统,这就形成了乱码。反向的过程类似,Oracle服务器发出的数据格式没有疑问是 TYPE_C,但是客户端软件认为自己使用的编码是 TYPE_B 并进行了翻译,交给操作系统用 TYPE_A 字符集总的字符/编码映射关系进行翻译显示,最终导致了无法正确显示。 ...