当前位置: 主页 > 数据库

oracle数据库自动备份-备份oracle数据

发布时间:2023-02-11 10:15   浏览次数:次   作者:佚名

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、对于程序和函数,在数据库操作完成后,请注意结果集和指针的释放。