数据库

Oracle创建索引要做到三个适当

☆樱花仙子☆ 提交于 2020-04-07 12:11:55
在 Oracle 数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较困难了。笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力。具体的来说,要做到这个三个适当有如下几个要求。   一、 根据表的大小来创建索引。   虽然给表创建索引,可以提高查询的效率。但是数据库管理员需要注意的是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。这个认识是错误的。恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。   一般来说,不需要为比较小的表创建索引。如在一个 ERP 系统的数据库中, department 表用来存储企业部门的信息。一般企业的部分也就十几个,最多不会超过一百个。这 100 条记录对于人来说,可能算是比较多了。但是对于计算机来说,这给他塞塞牙缝都还不够。所以,对类似的小表没有必要建立索引。因为即使建立了索引,其性能也不会得到很大的改善。相反索引建立的开销,如维护成本等等,要比这个要大。也就是说

重做日志中如何分析日志容量及切换频率?

百般思念 提交于 2020-04-07 12:03:35
导读 在Oracle数据库的世界里,Redo Log是一个非常核心的存在,通过Redo日志,Oracle实现了数据变更的延迟写出,通过日志的顺序写推延了数据块离散写的性能影响,从而实现了高效率运作。 Redo Log首先在Buffer中生成,然后写出到磁盘上的Redo Log File – 重做日志文件,那么如何配置日志文件就成为数据库优化和健康巡检的重要内容之一。如果日志文件过小,就会出现重做日志频繁切换,检查点不能及时完成等问题,影响到数据库的正常运行。 最常见的,如果在告警日志中看到 Checkpoint not complete 的提示,就意味着存在日志切换重用时的阻塞。如果频繁出现,那么就必须采取主动的优化措施,如加大日志文件大小、增加日志组等。 在白求恩 – Bethune 智能巡检平台上,我们专门设定了于此有关的检查分析项目,帮助用户及时简单的剖析在日志设置上可能存在的问题。 在【数据库空间资源 – 重做日志】分析项,可以找到和Redo相关的分析项: 如果在日志设置上存在问题,Bethune会给出分析提示,如以下数据库的日志组大小不一致,三组日志大小是50M,另外两组日志大小是100M,这是不规范的配置,可能来自于某次临时的日志组增加,事实上需要DBA进行审视和整改: 对于日志切换频率,Bethune 给出了详细的趋势分析,多日数据的趋势作为对比展现

四行shell脚本实现zabbix_server的高可用

二次信任 提交于 2020-04-07 11:21:08
场景模拟: 高可用的重要性 一家中小型企业需要使用zabbix_server监控大量设备,某天,一位新来的员工操作服务器失误,导致zabbix_server服务器系统奔溃无法开机。这时候zabbix_server服务中断了,这家企业的所有设备都无法进行监控,假如此时,监控的设备中有重要的业务主机,出现了告警,但是由于zabbix_server无法采集数据,导致运维人员不知道业务主机出现了一个严重的告警,业务也受到了影响。最后给企业带来巨大的经济损失。 名词解析: 什么是高可用? 高可用技术简单的说就是,保障业务在出现故障的时候,进行快速的切换,从而不影响到业务的正常运转。 什么是VIP(虚拟IP)? 高可用技术离不开VIP,高可用的原理其实就是用户通过VIP访问业务,而VIP会映射到对应的服务器IP。 默认情况下,客户端通过192.168.74.150的IP映射到的192.168.74.149这台主zabbix_server的服务,如果主zabbix_server服务器的关机了,那么客户端继续使用192.168.74.150的ip就会映射到备用zabbix_server(192.168.74.148)这台服务。 准备内容: 安装两台zabbix_server,一台数据库服务器(主zabbix_server和备zabbix_server的数据都保存在这台数据库上) 备:zabbix

深入浅出Oracle:Redo的作用

被刻印的时光 ゝ 提交于 2020-04-07 10:42:59
深入浅出Oracle:Redo的作用 Oracle 通过Redo来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。Redo对于Oracle数据库来说至关重要。 在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File(在归档模式下,Redo Log File最终会写出为归档日志文件)。 在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图6-1所示。 图6-1 Oracle Instance Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式 存储 (Redo Entries也经常被称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。在必要的时候Redo Entries被用于数据库恢复。 Redo Entries的内容被Oracle数据库进程从用户的内存空间复制到SGA中的Redo Log Buffer之中。Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的

分布式之数据库和缓存双写一致性方案解析(三)

我的未来我决定 提交于 2020-04-07 10:30:26
正文 博主本来觉得, 《分布式之数据库和缓存双写一致性方案解析》 ,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 先删缓存,再更新数据库,再删缓存 这一方案作为缓存更新策略,而不是先更新数据库,再删缓存。并且搬出了两篇大佬的文章, 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 ,希望博主能加以说明。因为问的人太多了,所以才有了这篇文章的诞生。 正文 在开始这篇文章之前,我们先自己思考一下以下两个更新策略 方案一 (1)删缓存 (2)更数据库 (3)删缓存 方案二 (1)更数据库 (2)删缓存 大家看下面的文章前,自己先思考一下, 方案一的步骤(1)有没有存在的必要 ? 先上一个结论:方案二存在的缺点,方案一全部存在,且方案一比方案二多一个步骤,所以应该选方案二。 下面,针对 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点 (1)方案二在步骤(2),出现删缓存失败的情况下,会出现数据不一致的情形,如下图所示 Cache Aside Pattern方案存在什么问题? 答:如果先操作数据库,再淘汰缓存,在原子性被破坏时: (1) 修改数据库成功了 (2) 淘汰缓存失败了 导致,数据库与缓存的数据不一致 (2

【赵强老师】利用数据库触发器实现数据的同步

好久不见. 提交于 2020-04-07 10:14:05
一、什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句。每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二、创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]table_name | [schema.]view_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] PL/SQL_BLOCK | CALL procedure_name; 其中: BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器

java.sql.SQLException: 数字溢出 的解决办法

心已入冬 提交于 2020-04-07 07:46:18
java.sql.SQLException: 数字溢出 的解决办法 今天碰到了 Java .sql.SQLException: 数字溢出.............的错误。 原因可能有以下两种,一:使用的jdbc驱动与 数据库 版本不匹配引起的,把版本改为一致的,测试看看; 二:可能是数据库的某个NUMBER类型的字段超出对应实体类属性的接收范围(如数据库字段是11位的手机号,而对应实体类使用Integer接收Phone这个属性,必然溢出), 解决方法:将实体类该属性的数据类改为Long即可。 来源: https://www.cnblogs.com/HiJacky/p/5902731.html

PHP ORM

百般思念 提交于 2020-04-07 05:54:36
概述 你可能已经在一些表单中使用过了文档块的注释,这个东西有点像是提供文档的元数据(Metadata)的工具,比如PHPDocumentor(一个利用php代码中的注释生成文档的工具: @author @link等等 在java里这样的工具使用的很普遍) .文档块注释工具在文档环节内嵌了一些元数据,这些数据是可以被代码解析的,过程像是json数据被解析成一个js数组,下面来讲讲这些常用的annotation语法 annotation的实现位于 Doctrine\Common\Annotations 下面 参考说明 @Column 俗称表的字段,这个符号标记一个注解的实例变量为持久化的,它必须是在php文档快注释里的实例变量.这个变量里存储的任何值都会被保存起来,然后 作为一个实体的生命周期的一部分 从数据库里加载. @Column中必填的属性: type : doctrine中的类型,在php跟数据库呈现之间转换 @Column中可选的属性: name : 这个属性对应了数据库中字段名,如果不定义 那么表字段名应该跟这个注解的变量名是一样的 length : 在string字符串类型的字段中 表示了数据库中字符串的最长长度.Doctrine本身不会验证字符串的长度. precision : 用于十进制中表示的精度 ( 仅用于十进制的字段 ) scale : 十进制数值的范围

PHP页面显示乱码?(编码统一问题)

二次信任 提交于 2020-04-07 05:30:19
MySQL数据库编码、html页面编码、PHP或html文件本身编码要全部一致。 1、MySQL数据库编码:建立数据库时指定编码(如gbk_chinese_ci),建立数据表、建立字段、插入数据时不要指定编码,会自动继承数据库的编码。 数据库连接时,也有编码,可以在连接完数据库后,执行 mysql_query ('SET NAMES gbk'); 2、html页面的编码,指的是这一行的设置: <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> 3、PHP或html文件本身的编码:用editplus打开php文件或html文件,另存时,选择的编码,如果数据库和页面编码是gbk,则这儿的编码选择ansi;如果数据库和页面编码是utf-8,则这儿也选择utf-8。 4、另外要注意的是,Javascript或Flash中传递的数据是utf-8编码,如果数据库和页面编码是gbk,要进行转码,然后写入数据库。 将"你好"从GBK转换到UTF-8格式 iconv ("gbk","utf-8","你好"); 5、在PHP程序中,可以加上一行,来指定PHP源程序的编码: header ('Content-type: text/html; charset=gbk'); 来源: oschina 链接: https:/

ubuntu中mysql的操作和安装

给你一囗甜甜゛ 提交于 2020-04-07 05:27:42
  ubuntu上安装mysql非常简单只需要几条命令就可以完成。    1. sudo apt-get install mysql-server   2. sudo apt-get isntall mysql-client   3. sudo apt-get install libmysqlclient-dev   登陆mysql数据库可以通过如下命令:   mysql -u root -p 使用mysqladmin 命令设置用户密码: mysqladmin -u root password "passwd" MySQL添加用户、删除用户与授权 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户   1.1 登录MYSQL:   mysql -u root -p   密码   1.2 创建用户:    mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));   这样就创建了一个名为:test 密码为:1234 的用户。    注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%"