oracle数据库自动备份-备份oracle数据
1.并发
并发性是OLTP数据库最重要的特性,但并发涉及资源的获取、共享和锁定。
数据库:
MySQL主要使用表级锁,资源的锁粒度非常大。 如果一个会话长时间锁定一个表,其他会话将无法更新表中的数据。
虽然 InnnoDB 引擎的表可以使用行级锁,但是这种行级锁的机制依赖于表的索引。 如果表没有索引,或者SQL语句没有索引,仍然使用表级锁。
甲骨文:
Oracle使用行级锁,锁定资源的粒度要小很多。 它只锁住SQL需要的资源,锁在数据库中的数据行上,与索引无关。 所以oracle对并发的支持要好很多。
2.一致性
甲骨文:
Oracle支持serializable隔离级别,可以达到最高级别的读一致性。 每个会话提交后,其他会话可以看到提交的更改。 Oracle通过在undo表空间中构建多版本数据块来实现读一致性。
如果每次session查询时相应的数据块发生变化oracle数据库自动备份,oracle session会在undo表空间中建立查询时的旧数据块。
数据库:
mysql多版本数据块的结构没有类似oracle的机制,只支持read committed隔离级别。 当一个会话读取数据时,其他会话不能更改数据,但可以在表的末尾插入数据。
当session更新数据时,要加排它锁,其他session不能访问数据。
三、事务
长期以来,Oracle 一直全面支持事务。
MySQL 只能支持 InnoDB 存储引擎的行级锁事务。
4.数据持久化
甲骨文
因为oracle将提交的sql操作行写入在线日志文件并保存在磁盘中,所以可以恢复提交的数据。
如果数据库或主机异常重启,oracle可以在重启后测试在线日志,恢复客户提交的数据。
数据库:
默认会提交sql语句,但是更新过程中如果重启了db或者host,可能会导致数据丢失。
五、投稿方式
Oracle用户默认需要手动提交,不需要自动提交。
MySQL 默认为自动提交。
6.逻辑备份
Oracle数据在逻辑备份中没有被锁定,备份的数据是一致的。
备份mysql逻辑时,要对数据进行加锁,保证备份数据一致,影响dml的正常使用。
七、热备份
Oracle有成熟的热备工具rman,热备时不影响用户数据库的使用。 即使备份数据库不一致,在恢复时也可以通过归档日志和联机重做日志进行一致性恢复。
数据库:
myisam在使用mysql内置引擎mysqlhostcopy进行热备时,需要对表加读锁,影响dml操作。
Innodbinnodb的表和索引会被备份,但是.frm文件不会被备份。 使用ibbackup进行备份时,会有一个日志文件记录备份过程中数据的变化,所以不需要锁表,也不会影响其他用户使用数据库。 但是这个工具是付费的。
innobackup 是一个结合ibbackup的脚本,会互相帮助备份.frm文件。
八、sql语句的扩展性和灵活性
mysql有很多非常实用方便的sql语句扩展,比如limit功能,insert多行数据可以一次插入,select一些管理数据不用add from。
甲骨文在这方面感觉比较稳定和传统。
九、复制
oracle:既有传统的push-pull数据复制,也有dataguard的双机或多机容灾机制。 主库的问题是可以自动切换到主库,但是配置管理比较复杂。
mysql:复制服务器的配置简单,但是当主库出现问题时,集群库可能会丢失一些数据。 并且需要手动将plex库切换为主库。
10.性能诊断
Oracle有各种成熟的性能诊断和调整工具,可以实现很多自动分析和诊断功能。比如awr、addm、sqltrace、tkproof等。
mysql的诊断调优方法很少,主要是慢查询日志。
11.权威与安全
mysql用户与host相关,感觉没有意义,更容易被假hosts和ip利用。
Oracle 权限和安全概念更加传统和规则。
12.分区表和分区索引
oracle的分区表和分区索引功能非常成熟,可以提高用户访问db的体验。
mysql分区表不成熟,稳定。
13. 管理工具
Oracle拥有众多成熟的命令行、图形界面、Web管理工具,以及众多的第三方管理工具,使管理极为方便高效。
mysql管理工具很少,linux下管理工具的安装有时需要安装额外的包(phpmyadmin等),有一定的复杂性。
十四、技术支持
oracle有问题可以联系客服
mysq自己解决问题
15.授权
甲骨文费用
mysq 开源 - 免费
16.选择
推荐使用money oracle
建议没钱,mysq可以满足需求。 (阿里巴巴、维基百科等大型项目也使用mysql,主要使用分布式存储、缓存、分表分库等技术。
这里有另一篇主要从SQL端对比的文章:
本文主要介绍Oracle数据库和MySQL数据库的区别,希望对您有所帮助。
1.群组功能使用规则
mysql中的group函数在select语句中可以随意使用,但是如果oracle中的查询语句中有group函数,则必须处理其他列名或者group by函数,否则子句中的列会报错错误
例如:
从用户中选择名称,计数(金钱); 这个在mysql中没有问题,在oracle中也没有问题。
并按名称从用户组中选择 name、count(money) 或从用户中选择 max(name)、count(money);
在oracle上不会报错,同理这两种情况在mysql上也不会报错
2.处理自动增长的数据类型
MYSQL有一个自动增长的数据类型,插入一条记录时自动获取数据值,不需要操作这个字段。 ORACLE没有自动增长的数据类型需要建立一个自动增长序号,在插入记录时将序号的下一个值赋给该字段。
CREATE SEQUENCE序号名(最好是表名)序号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
如果定义了自增长序列号,则最大值根据字段NUMBER(6)的长度确定,最大值为999999
INSERT插入语句的字段值为:序号名称.NEXTVAL
3.处理单引号
MYSQL的字符串可以用双引号括起来,而ORACLE只能用单引号括起来。 在插入和修改字符串之前,必须替换单引号:用两个单引号替换所有的单引号。
4、SQL语句翻页的处理
MYSQL SQL语句处理翻页比较简单,用LIMIT开始位置记录个数; PHPSEEK也可以定位结果集的位置。 ORACLE对翻页的SQL语句的处理比较繁琐。 每个结果集只有一个ROWNUM字段来标记其位置,只能使用ROWNUM80。
下面是两条ORACLE翻页SQL语句,经过分析比较好(ID字段名是唯一关键字):
声明一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE condition 1 ORDER BY condition 2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY condition 3;
说法二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE condition 1 ORDER BY condition 2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY condition 3;
5.处理长字符串
ORACLE对长字符串的处理也有其特殊之处。 如果要在INSERT中插入更长的词,UPDATE中的最大可操作字符串长度小于或等于4000个单字节。 String,请考虑CLOB类型的字段,借用ORACLE自带的方法DBMS_LOB包。 在插入修改记录之前,需要判断非空和长度,而不是空字段值和超长字段值,应该发出警告,并返回上次操作。
6. 处理日期字段
MYSQL的日期字段分为DATE和TIME两种类型。 ORACLE只有日期字段DATE,包括年月日分秒信息。 当前数据库的系统时间为SYSDATE,精确到秒,或者字符串转换为日期函数TO_DATE('2001-08-01','YYYY-MM-DD年-月-日24小时:分:秒格式 YYYY-MM-DD HH24:MI:SS TO_DATE() 日期格式有很多种,可以参考ORACLE DOC 日期字段转字符串函数 TO_CHAR('2001-08-01','YYYY- MM-DD HH24:MI:SS')
日期字段的数学公式差异很大。 MYSQL查找从现在开始7天后的时间 DATE_FIELD_NAME > SUBDATE(NOW(), INTERVAL 7 DAY) ORACLE查找从现在开始7天后的时间 DATE_FIELD_NAME > SYSDATE - 7;
MYSQL插入当前时间的几个函数有: NOW()函数返回当前日期和时间,格式为`'YYYY-MM-DD HH:MM:SSoracle数据库自动备份,可以直接存入DATETIME字段。 CURDATE() 以 'YYYY-MM-DD 格式返回今天的日期,可以直接存储在 DATE 字段中。 CURTIME() 以'HH:MM:SS 格式返回当前时间,可以直接存储在TIME 字段中。 例子:insert into tablename(fieldname) values(now())
oracle的当前时间是sysdate
7.处理空字符
MYSQL非空字段也有空内容,而ORACLE如果定义了非空字段就不允许空内容。 按照MYSQLNOT NULL定义ORACLE表结构,导入数据时会出错。 所以在导入数据的时候,要对空字符进行判断。 如果是NULL或者是空字符,需要改成空字符串。
8.字符串的模糊比较
MYSQL中使用string%这样的字段名,ORACLE中也可以使用like%'string%'这样的字段名,但是这种方法不能使用索引,速度也不快。 使用字符串比较函数 instr(field name, 'string ')>0 会得到更准确的搜索结果。
9、对于程序和函数,在数据库操作完成后,请注意结果集和指针的释放。