对于熟悉oracle的人,在学习mysql的过程中,可以利用对oracle的了解,来学习mysql,应该可以起到一定的帮助作用。
那么,我将把我看到的两者的异同点进行分享,这个是不断积累的过程,可能前后会有不同的认识,希望能帮助我们自己更快的学习。
1.不同点
mysql主要面向分布式环境
oracle更趋向于集中
oracle 是多进程
mysql 是单进程,多线程
2.对应的参数
最大连接数
oracle :processes 默认:150
mysql:max_connections 默认:151
内存分配
oracle:sga_target
mysql:innodb_buffer_pool_size
3.对应的功能
分布式:
oracle: dblink
mysql:Federated MySQL storage engine
后面续。。。
4.参数文件
oracle:$ORACLE_HOME/dbs/spfilesid.ora spfile.ora initsid.ora
mysql:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
启动时,可以指定不同的位置:
oracle: startup pfile=pfile文件位置
mysql: mysql --defaults-file=/etc/my-opts.cnf
查看参数
oracle: show parameter pool;
mysql: show variables like '%pool%';
动态设置参数:
oracle:
全局: alter system set sql_trace=true ;
session:alter session set sql_trace=true ;
mysql:
全局: set global tx_isolation=1;
session: set session tx_isolation=1;
5.数据库
oracle:数据库是物理存储部分
mysql:数据库,对应oracle的一个模式 (schema)
6.日志文件
oracle:alert文件,trace文件,审计日志文件,联机日志文件,归档日志文件。
mysql:error 日志文件,General query log,slow query log,Binary log,audit log file
oracle没有 slow query log对应的概念。
查看归档日志:
oracle:archive log list;
mysql:
mysql> show binary logs;
+---------------------+-----------+
| Log_name | File_size |
+---------------------+-----------+
| mysql-binlog.000001 | 633 |
| mysql-binlog.000002 | 143 |
| mysql-binlog.000003 | 143 |
| mysql-binlog.000004 | 173036379 |
| mysql-binlog.000005 | 120 |
| mysql-binlog.000006 | 143 |
| mysql-binlog.000007 | 143 |
| mysql-binlog.000008 | 143 |
| mysql-binlog.000009 | 120 |
+---------------------+-----------+
9 rows in set (0.00 sec)
mysql> show master status;
+---------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| mysql-binlog.000009 | 120 | | | |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
查看日志内容:
oracle: logminer
mysql: mysqlbinlog
shell# mysqlbinlog mysql-binlog.000001
删除日志
oracle:删除归档
使用rman命令
rman>delete archivelog until time 'sysdate-7';
mysql:删除binlog
mysql>
purge binary logs before now()-interval 3 day;
purge binary logs to "mysql-binlog.000003"; (不包含 mysql-binlog.000003);
7.把操作记录到文件
oracle: sqlplus 中,使用 spool /home/oracle/test.txt
mysql: tee /root/test.txt
8.客户端工具
oracle:sqlplus
mysql:mysql
9.调用某个文件
oracle: 使用@,比如:
@/home/oracle/test.sql;
mysql: 使用source ,比如:
source /home/mysql/test.sql;
10.编程
oracle:有过程,函数,触发器,包
mysql:只有过程,函数,触发器
11.job
oracle:job
dbms_job来创建。
mysql:event
12.事务隔离级别
oracle:默认读提交,不能修改
mysql:默认重复读,可以修改为其他
13.数据字典
oracle:
一般通过 dictionary 来查询,比如要查有哪些数据字典
select table_name from dict;
mysql:
查询 information_schema数据库中的表
比如:
use information_schema;
show tables;
13.匿名块
oracle:支持
mysql:不支持
变通办法,写一个存储过程来实现。
下面为一个往表插入50000条记录的例子 :
delimiter //
create procedure p_insert(p_upper int)
begin
declare i int default 1;
while i < p_upper do
insert into orders_range(id) values(i);
set i=i+1;
end while;
end;
//
call p_insert(50000);
//
14.for loop
oracle:支持
mysql:不支持for loop
在编程中,使用到循环,只支持:loop ... end loop,while ... do,repeat while ... end repeat;等。
15.日期字段默认值
oracle:hire_date date default sysdate;
mysql :
默认值不支持函数,对于 date类型,不能使用 date default now(),
如果需要,可以使用触发器来实现,或者使用 timestamp类型 ,默认为 current_timestamp;
hire_date timestamp;
比如下面的例子:
create table test(last_name varchar(20),hire_date timestamp );
insert into test (last_name) values('zq');
mysql> select * from test;
+-----------+---------------------+
| last_name | hire_date |
+-----------+---------------------+
| zq | 2015-04-12 13:45:34 |
+-----------+---------------------+
1 row in set (0.00 sec)
16.移动数据
oracle:
外部表,sqlloader,expdp\exp /impdp/imp
mysql:
select into outfile / load data [local] infile 对应 sqlloader
下面是例子:
select * into outfile '/u01/test/emp2.sql'
fields terminated by ','
from emp;
[root@sztech1 test]# more emp2.sql
100,smitty,5000,2015-04-05
200,\N,\N,\N
300,\N,\N,\N
mysql> desc emp_bak
-> ;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| empid | int(11) | YES | | NULL | |
| last_name | varchar(20) | YES | | NULL | |
| salary | double | YES | | NULL | |
| hire_date | date | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
load data infile '/u01/test/emp2.sql'
into table emp_bak
fields terminated by ',' ;
外部表好像没有看到
mysqldump 对应 oracle的 exp/imp
本来Oracle就具代表性,所以有如此情况!学习的话,还是先学Oracle感觉更有好处!当然直接学MySQL的话要简单些,Oracle难度要大些。
17.设置日志文件大小
oracle:
创建联机日志文件时,指定大小
alter database add logfile group xxx ('/home/oracle/redo01.dbf') size 500m;
mysql :
修改变量来实现:
innodb_log_file_size=500m
18.查看执行计划:
比如下面这条sql语句:
SELECT COUNT(*) as 'Cities', SUM(Country.Population) AS Population, Continent
FROM Country JOIN City
ON CountryCode = Code
GROUP BY Continent
ORDER BY Population;
oracle:
可以使用
explain plan
for
SELECT COUNT(*) as 'Cities', SUM(Country.Population) AS Population, Continent
FROM Country JOIN City
ON CountryCode = Code
GROUP BY Continent
ORDER BY Population;
然后,使用 select * from table(dbms_xplan.display);进行查看
mysql:
explain
SELECT COUNT(*) as 'Cities', SUM(Country.Population) AS Population, Continent
FROM Country JOIN City
ON CountryCode = Code
GROUP BY Continent
ORDER BY Population;
显示:
+----+-------------+---------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-------------+---------+--------------------+------+---------------------------------+
| 1 | SIMPLE | Country | ALL | PRIMARY | NULL | NULL | NULL | 239 | Using temporary; Using filesort |
| 1 | SIMPLE | City | ref | CountryCode | CountryCode | 3 | world.Country.Code | 9 | Using index |
+----+-------------+---------+------+---------------+-------------+---------+--------------------+------+---------------------------------+