C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性相关的知识,希望对你有一定的参考价值。


1.虚表/日期/序列:SEQUENCE

oracle的虚表dual用来构成select的语法规则,不要当表来看,oracle保证dual里永远只有一条记录,可用它来做如下很多事。


如下若是c语言写1/86400就是=0(因为整数除),只有浮点数才能这样运算。oracle中是非常精确的,不用担心精度问题。

如下sysdate函数返回值可以当成值来用。






SQL>CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE NOCACHE;

如上新建一个序列第一次取当前值是取不到的(提示该序列在此会话中未定义),必须.nextval再.currval取当前值。下面起步为100,步长为5。

下面给表增加两个字段crttime和keyid(导出数据时用到keyid),下面在crttable.sql中


如下insert into里必须有主键obtid和ddatetime,将序列生成器下个值赋给keyid字段


下面为rowid伪列和rownum伪列:rowid(是数据详细地址,通过rowid,oracle可最快定位某行具体的数据在磁盘中存放的物理位置)的格式不用管。rownum(查询返回的结果集中行的序号,可使用它来限制查询返回的行数)是变的是结果集的一个序号(C语言很少用rownum)。

如下第一行select时需要将rownum和rowid写出来查询才能看到,第二行用rowid作为查询或更新的条件最快(区别索引)

如上每条记录虽然存在数据库里(即表空间,表空间还是数据文件)最后还是存在磁盘上(在磁盘上就有位置),就是/oracle/base/oradata/snorcl11g里的.dbf文件。vi crttable.sql


vi psurfdata.cpp


下面是以shqx用户登陆。

2.索引/视图/链路/同义词:create index/view/link/synonym

虚日序,索视链同。如下decode函数如果sex为1显示男,为2显示女…(if 1 男,else if 2 女,else if 3 非男非女,else if null 不确定,else 错误)。

keyid从序列生成器取出来我们没把它当成主键,应该它是唯一的索引(索引也是数据,需要存储空间),因为keyid不可能重复。

索引创建时是否指定为唯一索引呢?看列的性质如obtid+ddatetime是唯一的,keyid是唯一的【只拿obtid出来或只拿ddatetime出来肯定不是唯一的,若创建唯一索引的话数据插入时插不进去。比如现在建一个表,表里有一个字段弄成唯一索引,再往里插入重复的值肯定报错】。

如果某列出现在查询条件中,而列的数据是无序的,查询时只能从第一行开始一行一行匹配。创建索引就是对某些特定列中数据排序或归类,生成独立索引表。在某列创建索引后,如果该列出现在查询条件中,oracle会自动的引用该索引,先从索引表中查询出符合条件记录的ROWID,由于ROWID是记录的物理地址,因此可根据ROWID快速定位到具体记录。

唯一索引效果相当于主键约束(即主键不允许重复),当表和索引在不同的表空间时效率更高,如下数据库自动将obtid和ddatetime主建字段创建唯一索引,下面在crttable.sql中。



每建一个索引就相当于把列的数据拿出来单独存放,如下创建索引的实质就是2列(rowid也算1列)或多列(与上面依次对应)拿出来组成一个像表一样的对象(像书的目录),用专门空间存放。所以索引有开销,虽提高查询效率,但一方面是需要更多的存储空间,另一方面是影响表的增、删、改的性能(对数据进行操作时,索引需要更新),所以不能表的什么字段都建上索引,需要设计,规范如下。

适合建立索引的列特点:where后经常用到的列,主键本身唯一性索引,保持数据唯一性。下面在plsql developer中tools菜单里Explainplan,选中F5分析。




ddatetime在数据库中是整数

如上如果业务系统对数据库进行全表扫描的话,我们监控查到告诉他做改进

如下第三条就是上面to_char函数用不了索引


视图就是访问数据的一个窗口,当成一个表来用,下面为先授权

如上可以exit退出,也可直接切换connect scott用户


视图不占用表空间,在emp将hiredate设置为系统时间,从v_emp查也有效果







drop view …


如下登录sqlplus是客户端,数据库服务端在tnsnames.ora中snorcl…198里配置ip和端口

如下注意snorcl11g_to_198中间有个to


如下设为私有的话,自己可以用自己

如上方法如果改了如下服务名,就不好用了

如下另一种方法创建不用snorcl11g_198服务名

下面连接远程数据库服务器不要产生远程事务:1.性能低,2.远程事务容易拖垮数据库,对远程数据库的访问可以select,但不要update,insert,delete(都会产生事务)

下面是同义词:数据库对象(表,视图,序列,存储过程,包)的一个别名。

如下dblinkname指snorcl11g_198等等


实际不可能给shqx和密码给客户,给普通用户如scott给客户并授权

如下是更多sql,如下先查下有什么表:select * from tab;结果集不包含1234…这个列和EMPNO…这个行(就是外面框架)

如下是列的拼接即内容的拼接,前面是字符串后面是数字也可以拼接,行没有显示(sal+100),但结果集里最后有数字900,拼接符||不是C语言中的或,优先级高于+号。

对表使用别名,如下内表是dept,外表是emp

distinct关键字,取结果集中的唯一值,去重,如下有很多30,20,10重复

如下最后一个dname出问题


如下创建的aaa除了表和列,其他数据库对象都没有。下面1=2为了只保留表结构即第一行OBTID,DDATE…。

向aaa这个空表(前面1=2)insert,keyid不允许重复是唯一索引的约束,aaa没继承这些约束,所以keyid插入了3个1,但aaa继承了字段空还是非空这些属性。


如上给t_surfdata表增加一个obtname空字段,如下将t_obtcode中obtname字段值赋给t_surfdata中obtname空字段

3.表空间/数据文件/启动关闭/权限/备份恢复:exp/imp

vi .bash_profile,服务器安装好数据库后可装多个实例,就像类创建/定义/实例化一个对象/变量。

安装数据库的服务器有一半内存分配给oracle数据库的,不要太去关注oracle数据库这个概念。关注表空间这概念,建表时可指定表空间。不想创建表空间,USER表空间够用就用。





如上三行不用dbstart命令脚本启动数据库,如下dba重新登录,创建用户并授权,授权后需要重新登陆才生效。

如下revoke撤销权限是立马生效

数据处理好后别的业务系统要使用这数据,给分配一用户:给这用户connect和resource权限,再授权grant select any table to…

如下是备份和恢复:括号要\\来转义,以下为表模式导出。.dmp约定命名,表示是oracle的exp卸出来的。rows=n(no)表示只导出表定义,没导出数据。注意数据库字符集和版本。


以下为导入(必须是有dba权限的用户【如下shqx/pwdidc有dba权限】,导入的文件就是上面导出的.dmp文件),索引那些都会导进来但不能重复导入一样的表。

以下为用户模式导出(表模式只导出表,没有序列等等),将shqx这用户全导出。把shqx用户删了,创建一用户再把导入,整个用户完整恢复如下。

4.清理空闲会话/归档日志:kill session,archive log list


如下SQL*Net其实就是tcp的服务程序,是oracle的网络软件


自动创建文件:vi listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
    )
  )


vi listener.ora


别人用完我数据库不断开,我可以强行断开session


sqlplus / as sysdba;oracle日志有两种方式:归档,非归档(非归档模式在如下三个在线保留的日志:有的话就可以恢复,没有的话就恢复不了。所以经常改为归档模式)

NOARCHIVELOG为非归档模式,如上两种方式查看oracle是否为归档模式,如下由非归档转为归档。

如下归档日志文件名也可以叫…dbf

如上切换成归档模式成功,如下如果在线日志满了会自动写入归档日志里,对数据库很多操作,内容就写进去了。数据库不忙,一下写不进归档日志,所以手动切换日志,如下在线日志切换到了第二组,并写入了归档日志里。

删除归档日志,以前清理ftp采集的文件用时间,但是归档日志文件大小和数量由数据库繁忙程度决定,一分钟产生不定量的文件。目录满了,数据库归档失败,数据库停了。所以清理日志文件,保留最近多少个文件(按照归档日志文件名用Cdir类排序,从后面往前找):deletearchive.cpp见文章:https://blog.csdn.net/weixin_43435675/article/details/103476761

5.系统高可用性:rac

一台服务器比一般主机要大,同样cpu在里面不外露,但是服务器的磁盘以插拔形式暴露在外面有多个。如下是磁盘阵列技术,假设一个服务器有12个1T硬盘,如下raid0一但12个中一个坏了,没有一个1T补充上来,整个出问题。raid1两个盘之间互为备份,坏了就动态调整。



如下假如oracle数据库在一个服务器上运行,出问题了怎么办?(一般硬件故障)。Oracle三种高可用集群方案:1.RAC,2.Data Guard,3.OGG。如下是RAC技术,可以多个,但一般为两个。有的数据在内存,有的在缓存,2个要进行数据协调很麻烦,所以不是高性能,比单个服务器要慢。

如下为结合三种集群技术应用。

RAC有多个节点(上面为两个),应用程序只要做好客户端配置怎么连RAC数据库就行。

如下为应用系统的高可用性,不是数据库系统。把一个web系统相同全部部在多个服务器上,ip地址只有一个,那怎么访问呢?访问一网站时首先访问到nginx,nginx将访问请求均匀分给服务器。

应用程序系统手动切,不像oracle的RAC和dataguard那样自动切。因为应用程序热切换难,普通系统可冷备份,2个服务器后台的应用程序以及环境都准备好,一接到切换通知立马登录服务器,冷切换,10分钟左右。银行系统必须热备份热切换:跑两套应用系统,数据库系统,加负载均衡。

以上是关于C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性的主要内容,如果未能解决你的问题,请参考以下文章

C/C++10天气APP:MySQL,PostgreSQL,环境变量,动静态库,Linux/Oracle字符集

Oracle 游标

C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址

C++多态(下)

虚函数中的继承关系

C++学习:3多态