|
本帖最后由 极佳数据库急救 于 2013-9-29 02:21 编辑
一、环境和需求1、环境
Mysql数据库服务器:
OS version:linux 5.3 for 64 bit
Mysql Server version: 5.0.45
Oracle数据库服务器:
OS version:linux 5.3 for 64 bit
Oracle version:oracle 11g r2
2、需求
把mysql数据库的数据转移到oracle数据库。目前mysql数据库的备份文件为.sql文件,每个表一个.sql文件,把这些文件的数据导入到oracle数据库。
二、mysql数据恢复
采用先把mysql数据库备份文件恢复到一个mysql测试库中,然后使用oracle sql developer把mysql测试库中的数据转移到oracle数据库。
mysql备份恢复到myql测试库:
因为本次试验采用的mysql备份为.sql文件,所以采用批量source处理。批量执行.sql文件,实现在mysql测试库重新建立表并恢复数据。
如果备份文件采用的是其他方式,则需要用对应的恢复办法进行恢复。
恢复操作:
[root@localhost ~]# mysql -u root -p
Enter password: ---输入root用户的密码。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 90
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use test;
Database changed
mysql> source actors.sql;
mysql> source act_tactics.sql;
mysql> ………………
一次把所有的.sql文件贴在mysql的命令窗口,批量执行即可。
注:因为mysql库是生产库,不能直接做实验,所以才把备份恢复到一个测试库中,进行测试,实际中如果可以直接连mysql数据库,则这一步可以省略。
三、通过oracel sql developer转换数据库
Mysql转到oracle数据库,要根据不同情况选择不同的方法:
1、 从现有的mysql库直接转到oracle数据库
这是不用恢复mysql数据库,直接可以用sql developer转到oracle里,这时要现在oracle数据库中建好用户(用户名为mysql数据库名),选好默认表空间,mysql数据就会导入到该用户下。
2、 从mysql数据库导出的sql文件导入到oracle数据库
如果是只有mysql的导出文件,则需要先把该文件恢复到一个mysql数据库中,然后再把恢复后的mysql数据库转换到oracle数据库中。
这种情况要注意oracle数据库的用户名。因为sql developer把mysql转换到oracle数据库中时,会把mysql的数据存放到一个用户下,这个用户名一定会和mysql的数据库名相同。如果oracle中已有这个用户,则数据直接导入到该用户下;如果没有这个用户,则sql developer会直接创建这样的用户,并把数据导入到该用户下。需要注意的是,sql developer默认创建的oracle数据库用户的默认表空间是user,如果不注意,很有可能会导致user表空间爆满!!!所以这种情况最好先建一个和mysql数据库名一样的oracle用户,以防止user表空间爆满影响数据导入。
1、安装oracel sql developer
首先从oracle官方网站下载oracle sql developer,下载的sql developer是没有集成jdk的,如果本机也没有安装过jdk,则需要先安装对应版本的jdk,这个可以查找sql developer的readme.html文件,里面会说明需要的jdk。
安装的第一步会让你选择JDK,否则无法安装。安装非常简单,这里就不做说明。
Windowd 64位sqldeveloper下载:
http://download.oracle.com/otn/java/sqldeveloper/sqldeveloper64-3.0.04.34-no-jre.zip
Windowd 32位sqldeveloper下载:
http://download.oracle.com/auth/otn/java/sqldeveloper/sqldeveloper-3.0.04.34.zip?e=1313718071&h=0b242a06885410fbb4df8b5628a804e8
安装JDK和mysql-connector-java:
jdk-6u27-windows-x64. exe下载地址(最第要用jdk-6u11以后的版本):
http://download.oracle.com/auth/otn-pub/java/jdk/6u27-b07/jdk-6u27-windows-x64. exe?e=1313726411&h=ff3cc2d66e07d7d63d6f8e9fbabc3743
mysql-connector-java各版本下载:
http://download.softagency.net/mysql/Downloads/Connector-J/
mysql-connector-java配置:
2011-11-1 10:25 上传下载附件 (49.24 KB)
以上的mysql-connector-java-5.0.8-bin.jar就是mysql-connector-java-5.0.8.zip解压出来的文件。配置好jdbc后,即可开始数据库连接。
如果要连接sql server,则下载jtds-1.2.5-dist.zip配置即可。
2、连接数据库
连接oracle的用户要有create table权限,一般用system用户就可以。连mysql数据库因为是读取数据,用什么用户都可以(一般默认是root用户)。
转换后oracle数据库会多一个新的用户名,就是mysql的数据库名。除了这个用户,系统还会自动建一个名为EMULATION的用户,该用户可以锁定或删除都可以。
打开sqldeveloper. exe:
2011-11-1 10:25 上传下载附件 (27.78 KB)
新建oracle数据库连接:
Sql developer转换数据时会产生一些字典表,这些字典表会保存到sql developer链接oracle数据库的用户中,如果这个用户的名字和Mysql数据库名字不同,则mysql数据不会保存在该用户下。
2011-11-1 10:25 上传下载附件 (40.86 KB)
点击测试,测试连接:
2011-11-1 10:25 上传下载附件 (41.44 KB)
点击保存:
2011-11-1 10:25 上传下载附件 (41.89 KB)
点击连接,即可连接到oracle数据库:
2011-11-1 10:26 上传下载附件 (33.17 KB)
新建mysql数据库连接:
1.)选择mysql选项卡
2011-11-1 10:26 上传下载附件 (39.11 KB)
2.)填写mysql数据库信息
2011-11-1 10:26 上传下载附件 (40.53 KB)
填写完进行测试,成功后点击保存,并连接到mysql数据库。
2011-11-1 10:26 上传下载附件 (36.74 KB)
3、复制表
如果不用迁移整个数据,只是迁移表的数据,则可以直接在mysql数据库库中选中要转移的表,点“右键”选“复制到oracle”即可。此时会把表转移到sql developer链接oracle数据库的用户下,并且该用户下不能有同名的表。
不过从以往的经验看,复制表要比迁移数据库效率低,所以如果是复制所有的表,最好用移植数据库功能。
4、移植数据库
点击“工具”,选择“移植”
2011-11-1 10:26 上传下载附件 (45.05 KB)
移植简介
2011-11-1 10:26 上传下载附件 (75.8 KB)
2011-11-1 10:26 上传下载附件 (69.92 KB)
2011-11-1 10:26 上传下载附件 (67.32 KB)
2011-11-1 10:26 上传下载附件 (70.63 KB)
选择要转换的mysql数据库,添加到列表中:
2011-11-1 10:26 上传下载附件 (72.02 KB)
2011-11-1 10:26 上传下载附件 (72.36 KB)
指定转换规则,可以根据自己的情况设定字段属性的转换,也可以新添加规则。不过一般选择默认的就能满足需求。
2011-11-1 10:26 上传下载附件 (77.67 KB)
选择目标数据库
2011-11-1 10:26 上传下载附件 (72.16 KB)
2011-11-1 10:26 上传下载附件 (70.86 KB)
查看转换概要,点击“完成”开始转换
2011-11-1 10:26 上传下载附件 (74.81 KB)
2011-11-1 10:26 上传下载附件 (15.67 KB)
2011-11-1 10:26 上传下载附件 (12.4 KB)
转换完成后需要检查数据库的各种对象是否完成,状态是否正确,尤其是表的数量一定要核对,因为有时候有些表会不能成功转换,需要手工操作。
四、修改oracle用户名
因为转换过来的数据默认存放在USERS表空间里,而且会创建一个和mysql数据库名一模一样的oracle用户,并把mysql数据库导入到该用户下。可以exp出来新用户的数据后,然后再导入到正确的用户下,这样数据也会存在正确的表空间下面。但是如果数据量很大的时候,exp/imp会很浪费时间,建议数据量大的时候不要采用这种方式。
如果要是先建好用户(用户名用mysql数据库的数据库名),定义好用户的默认表空间,然后再做mysql到oracle转换,这样就可以即把表存放到正确的位置,又可以用正确的用户名。也可以改变数据库的默认表空间防止自动创建用户的默认表空间使用user表空间:
SQL> ALTER DATABASE DEFAULT TABLESPACE mis_data;
注意:改过名字的用户,权限会继承,但是默认表空间不会继承,需要手工再设定默认表空间:
SQL> ALTER USER OA identified by oa default tablespace MIS_DATA temporary tablespace TEMP;
修改底层表 USER$更换用户名
注:修改oracle用户名需要sys用户,或者给操作用户操作user$表的权限。
SQL> grant select on user$ TO system;
SQL> grant update on user$ to system;
1、 查看用户的user#
SQL> show user
USER is "SYSTEM"
SQL> select user#,NAME from SYS.user$ WHERE NAME='TEST';
USER# NAME
---------- ------------------------------
93 TEST
2、修改用户名
SQL> UPDATE USER$ SET NAME='新用户名' WHERE USER#=93;
已更新 1 行。
注:单引号中的新用户名一定要用大写,如果是小写,下面会提示找不到该用户。
3、提交完成
SQL> COMMIT;
4、修改系统检查点
SQL> ALTER SYSTEM CHECKPOINT;
5、修改新用户密码
SQL> ALTER USER 新用户名 IDENTIFIED BY 新密码;
6、如果提示新用户不存在,则刷新shared_pool
SQL> ALTER USER 新用户名 IDENTIFIED BY 新密码
*ERROR 位于第 1 行:ORA-01918: 用户'新用户'不存在
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
7、刷新shared_pool后重新修改用户密码
SQL> ALTER USER 新用户 IDENTIFIED BY 新密码;
8、测试连接
SQL> CONN 新用户/新密码@orcl;
9、查看新用户是否拥有原用户的对象
SQL> SELECT * FROM TAB;
五、mysql远程连接1、改表法
可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"。代码如下:
mysql -u root –p vmware
mysql> use mysql;
mysql> update user set host = '%' where user = 'root';
mysql> select host, user from user;
2、授权法
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3'IDENTIFIED BY
'mypassword' WITH GRANT OPTION;
我用的第一个方法,刚开始发现不行,在网上查了一下,少执行一个语句 mysql>FLUSH RIVILEGES使修改生效,就可以了。
3、另外一种方法
在安装mysql的机器上运行:
1)进入MySQL服务器
d:\mysql\bin\>mysql -h localhost -u root
2)赋予任何主机访问数据的权限
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION
3)修改生效
mysql>FLUSH PRIVILEGES
4)退出MySQL服务器
mysql>EXIT
这样就可以在其它任何的主机上以root身份登录啦。
如果经过上面的操作,还不能解决问题,那可能就是服务器的安全设置问题,是不是ip安全策略或防火墙没有开启3306的例外。
4、安全模式修改用户密码
在用root登录mysql数据库的时候报错:
[root@mail mysql]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
这个错误一般都是root登录mysql的密码错误造成的(root登录mysql的密码和登录系统时的密码不是同一个密码,有时候可以不一样),使用下面的方法可以重新设定root登录mysql数据库的密码,该方法非常使用,有时候为了系统安全,一定要把root登录mysql和登录系统时的密码改成不一致:
[root@localhost mysql]# service mysqld stop
[root@localhost mysql]# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
然后可以不用密码直接进入系统:
[root@localhost mysql]# mysql -u root mysql
进入系统后可以直接修改root用户的密码:
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit
[root@localhost mysql]# service mysqld start
[root@localhost mysql]# mysql -uroot -p
Enter password: <输入新设的密码newpassword>
mysql>
启动mysql安全模式的命令参数:
skip-grant-tables:grant-tables,授权表。在启动mysql时不启动这个表,像忘了密码啥的,用这个模式启动很方便的。
skip-networking:不监听3306,说白了就是不启动mysql的网络服务。
user=mysql:这俺就不形容了。
|
|