1. 获取镜像

  1. # 查看可用的稳定版本
  2. sudo docker search oracle
  3. # 镜像大小:6.85G
  4. sudo docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
  5. sudo docker image ls |grep oracle

2. 创建数据卷

  1. sudo mkdir -p /share/oracle/data

3. 启动容器

  1. sudo docker run -d -p 8087:8080 -p 1521:1521 --restart=always \
  2. --name oracle_11g \
  3. -v /share/oracle/data:/home/oracle/app/oracle/oradata/mydata \
  4. registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
  5. sudo docker ps -a |grep oracle
  6. sudo docker start oracle_11g
  7. sudo docker restart oracle_11g
  8. sudo docker stop oracle_11g
  9. sudo docker rm oracle_11g

4. 数据库信息

1. 连接信息

  1. port: 1521
  2. sid: helowin
  3. service name: helowin
  4. username: system
  5. password: oracle

2. 账户口令

  1. system / oracle
  2. sys / oracle

5. 容器配置

1. 环境变量设置

  1. # 进入容器终端
  2. sudo docker exec -it oracle_11g bash
  3. # 切换超级用户(root/helowin)
  4. su - root
  5. # 添加系统环境变量
  6. vi /etc/profile

内容如下:

  1. export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
  2. export ORACLE_SID=helowin
  3. export PATH=$ORACLE_HOME/bin:$PATH

生效配置:

  1. source /etc/profile

2. 创建sqlplus软连接

  1. ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

3. 密码修改

  1. # 1. 切换到oracle用户
  2. su - oracle
  3. # 2. 登录sqlplus
  4. ## 方式1
  5. sqlplus / as sysdba
  6. ## 方式2
  7. sqlplus /nolog
  8. conn /as sysdba
  9. # 3. 修改sys和system用户密码(默认:oracle),并设置密码永不过期
  10. SQL> alter user system identified by ${新密码};
  11. SQL> alter user sys identified by ${新密码};
  12. SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
  13. # 4. 其他相关操作
  14. ## 查看数据库用户和权限
  15. SQL> select * from v$pwfile_users;
  16. ## 为system用户添加sysdba权限
  17. SQL> grant sysdba to system;

6. 验证

  1. # 进入终端
  2. sudo docker exec -it oracle_11g /bin/bash
  3. # 查看日志
  4. sudo docker logs oracle_11g
  5. sudo docker logs -f -t --tail=50 oracle_11g
  6. # 查看网络
  7. sudo docker network ls
  8. sudo docker inspect oracle_11g

7. 客户端工具

Oracle客户端说明:

  1. c#(.net)连接oracle使用的是oci接口,必须安装oracle客户端,并配置本地网络服务名 tnsnames.ora。
  2. java可以使用thin进行连接,而不需要安装oracle客户端。
  3. Oracle网站有精简版的客户端软件(Oracle Instant Client Basic,Basic Lite:17M,Basic:45M(含中文字符集)),解压,并编辑tnsnames.ora既可,比较方便,无需安装570M左右的标准客户端 ,而且安装后还不好卸载。

    1. DbVisualizer(推荐)

    • Settings Format:Server Info

      1. Database TypeAuto DetectOracle
      2. DriverJDBC):Oracle Thin
      3. Connection TypeSID
      4. Database Server${IP}
      5. Database Port1521
      6. SIDhelowin
      7. Database Useridsystem
      8. Database Password${密码}
    • Settings Format:Database URL

      1. Database TypeAuto DetectOracle
      2. DriverJDBC):Oracle Thin
      3. Database URLjdbc:oracle:thin:@${IP}:1521:helowin
      4. Database Useridsystem
      5. Database Password${密码}

      2. Navicat Premium

    • Basic

      1. 连接名:[自定义]
      2. 连接类型:BasicSIDServiceName
      3. 主机名或IP地址:${IP}
      4. 端口:1521
      5. 服务名或SIDhelowin
      6. 用户名:system
      7. 密码:oracle
    • TNS

      1. 连接名:[自定义]
      2. 连接类型:TNSTNSName
      3. 网络服务名:(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = ${IP})(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = helowin)))
      4. 用户名:system
      5. 密码:oracle

      3. PL/SQL Developer

  4. 提前安装好Oracle客户端。

  5. 修改tnsnames.ora(product\11.2.0\client_1\network\admin\),添加连接串。

    ORCL_DOCKER =
    (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ${IP})(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = helowin)
     )
    )
    
  6. PL/SQL developer连接测试。

    8. 表空间操作

    1. 创建数据库文件

    ```bash

    Windows

    SQL> create tablespace bdapts logging datafile ‘e:\orcl\bdapts.dbf’ size 100m autoextend on next 32m maxsize 500m extent management local; SQL> create temporary tablespace bdapts_temp tempfile ‘e:\orcl\bdapts_temp.dbf’ size 100m autoextend on next 32m maxsize 500m extent management local;

Linux

进入容器,使用oracle用户,创建文件目录

mkdir -p /home/oracle/data/ts SQL> create tablespace bdapts logging datafile ‘/home/oracle/data/ts/bdapts.dbf’ size 100m autoextend on next 32m maxsize 500m extent management local; SQL> create temporary tablespace bdapts_temp tempfile ‘/home/oracle/data/ts/bdapts_temp.dbf’size 100m autoextend on next 32m maxsize 500m extent management local;

<a name="UVuLn"></a>
## 2. 创建用户并建立与数据库文件的映射关系
```sql
create user bdapuser identified by bdapuser default tablespace bdapts temporary tablespace bdapts_temp;

-- 相关操作
-- 将用户的空间扩展为20MB
alter user bdapuser quota 20m on bdapts;
-- 给用户指定两个表空间,并且可使用大小不限制(unlimited)
alter user bdapuser quota unlimited on ${tablespace1} quota unlimited on ${tablespace2};
  • 参数说明

    • DEFAULT TABLESPACE:默认表空间。
    • TEMPORARY TABLESPACE:临时表空间。
    • QUOTE:创建用户后,当用户分配的空间不够时,可以扩展用户的空间。quote设置用户在表空间上占用的空间大小。如果不指定默认表空间,Oracle会将SYSTEM表空间指定为用户的默认表空间;如果没有用quota子句,用户在特定表空间的配额为0,用户不能在该表空间上创建数据对象。
    • UNLIMITED ON:表空间大小不限制。

      3. 权限管理

      初始建立的用户没有任何权限,不能执行任何数据库操作,因此必须为用户设置权限或者角色。被赋予了某个角色的用户将拥有该角色所具备的权限,常被用到的系统预定义角色:CONNECT、RESOURCE、DBA、EXP_FULL_DATABASE、IMP_FULL_DATABASE。其中:CONNECT、RESOURCE、DBA主要用于数据库管理,数据库管理员需要被授予这三个角色。一般的数据库开发人员,需要被授予CONNECT、RESOURCE角色即可。EXP_FULL_DATABASE、IMP_FULL_DATABASE角色分别用于操作数据库导出、导入相关的操作。为用户授予角色。
      # 给用户赋予权限
      grant connect,resource,dba to bdapuser;
      grant create session to bdapuser;
      

      9. 数据库操作

  • 数据库登陆、创建、删除 ```bash

    解决SQLPlus中文字符集问题

    export NLS_LANG=”SIMPLIFIED CHINESE_CHINA.AL32UTF8”

登陆Oracle

自定义用户

sqlplus bdapuser/bdapuser

管理员用户

sqlplus sys/ as sysdba

注意:以sys用户登录必须指定身份为“as sysdba”或“as sysoper”,普通用户可以不指定身份

— 查看数据库编码 SQL> select userenv(‘language’) from dual;

— 创建数据库(不推荐,生产环境下数据库需要在指定的表空间下创建) SQL> create database bdapdb;

— 删除数据库 SQL> drop database bdapdb;

— 删除表空间 SQL> drop tablespace bdapts including contents and datafiles;


- **用户创建、删除、解锁**
```sql
-- 查询数据库所有用户
select * from all_users;

-- 切换用户,以下两种方式等同
connect bdapuser/bdapuser
conn bdapuser/bdapuser

-- 创建用户
create user bdapuser identified by bdapuser;

-- 修改用户密码
alter user bdapuser identified by bdapuser;

-- 解锁用户
alter user bdapuser account unlock;

-- 删除用户
drop user bdapuser cascade;
  • 表操作 ```sql — 创建表 create table T_USER (id number(10) NOT NULL primary key,user_name varchar2(40) NOT NULL,user_phone varchar2(11));

— 新增记录 insert into T_USER(id, user_name, user_phone) values(1, ‘北极星’, ‘13632608950’);

— 更新记录 update T_USER set user_name=’zhangsan1’ where user_name=’zhangsan’;

— 删除记录 delete from T_USER where id = 1;

— 删除表 truncate table T_USER; —— 删除所有数据,不会影响表结构,不会记录日志,数据不能恢复(删除很快) drop table T_USER; —— 删除所有数据,包括表结构一并删除,不会记录日志,数据不能恢复(删除很快)

— 查询记录 select * from T_USER;

— 重命名 alter table T_USER rename to T_USER_NEW;

— 字段操作 —— 增加字段 alter table T_USER add (remark varchar2(32)); alter table T_USER add (remark varchar2(32) default ‘空’ not null); —— 修改字段 alter table T_USER modify (remark number(4)); —— 重命名字段 alter table T_USER rename column remark to remark_new; —— 删除字段 alter table T_USER drop column remark; — 添加主键 alter table T_USER add primary key(id); alter table T_USER drop primary key(id);

— 索引 create [unique] index idxname on tabname(col….); drop index idxname;

— 视图 create view viewname as select statement; drop view viewname;


- **备份数据**
```bash
# 完全备份
exp bdapuser/bdapuser@helowin buffer=1024 file=/data/export/backup.dmp full=y;

# 按用户导出
exp bdapuser/bdapuser@helowin file=/data/export/sys.dmp owner=(system,sys);

# 按表名导出
exp bdapuser/bdapuser@helowin file=/data/export/tabs.dmp tables=(t1,t2);

# 按过滤条件导出
exp bdapuser/bdapuser@helowin file=/data/export/query.dmp tables=(t1) query=" where f1 like 'fg%'";

# 导出时压缩/日志
exp bdapuser/bdapuser@helowin buffer=1024 file=/data/export/backup.dmp full=y compress=y log=/data/export/log.txt;

# 备份远程服务器的数据库
exp ${用户名}/${密码}@${远程的IP}:${端口}/${实例} file=${备份路径}.dmp full=y;

## 参数说明
○ @SID: 数据库实例名
○ buffer: 缓存大小
○ file: 具体的备份文件地址
○ full: 是否导出全部文件
○ ignore: 忽略错误,如果表已经存在,则也是覆盖
○ owner:指定要导出的用户表
○ tables:导出的表名
○ query:过滤条件
○ compress:是否压缩
○ log:日志路径
  • 数据导入 ```

    完整导入

    imp bdapuser/bdapuser@helowin file=/data/load/backup.dmp full=y ignore=y log=/data/export/log.txt;

导入指定表

imp bdapuser/bdapuser@helowin file=/data/load/backup.dmp tables=(t1,t2);

导入至远程服务器数据库

imp ${用户名}/${密码}@${远程的IP}:${端口}/${实例} file=${备份路径}.dmp full=y;

<a name="GwDDY"></a>
# 10.备份(选做)
```powershell
# 关闭虚拟机
vagrant halt

# 查看虚拟机名称(VagrantFile中box的名称:config.vm.hostname)
vboxmanage list vms

# 导出当前虚拟机
cd /cygdrive/i/learn_resource/tools/vagrant/box/CentOS
vagrant package --base hk-bigdata-1 --output Vagrant-CentOS-7.6-x86_64.VirtualBox-Oracle-11g.box

# 备份之后,可通过box文件直接加载到vagrant,无需重复之前创建Oracle操作即可使用
cd /cygdrive/i/learn_resource/tools/vagrant/box/CentOS
vagrant box add centos7.6-docker-oracle Vagrant-CentOS-7.6-x86_64.VirtualBox-Oracle-11g.box

# 查看box列表
vagrant box list

# 进入box存放目录(自定义),编写VagrantFile文件
cd /cygdrive/e/vagrant/mybox/hk2
mkdir share
touch share/README.md
echo 'test' > share/README.md
  • VagrantFile ```ruby

    -- mode: ruby --

    vi: set ft=ruby :

Vagrant.require_version “>= 1.6.0”

boxes = [ { :name => “hk-bigdata-2”, :eth1 => “192.168.56.102”, :mem => “8192”, :cpu => “2” } ]

Vagrant.configure(2) do |config|

config.vm.box = “centos7.6-docker-oracle”

第一次安装时请注释以下三行配置,配置ssh密码验证(sshd_config)后再打开

若加载的box已经配置好ssh(如:centos7.6-docker、centos7.6-base ),则需要取消注释

config.ssh.username = ‘vagrant’ config.ssh.password = ‘vagrant’ config.ssh.insert_key = true

ssh config end

config.vm.box_check_update = false if Vagrant.has_plugin?(“vagrant-vbguest”) config.vbguest.auto_update = false end

禁用系统默认的共享目录

config.vm.synced_folder ‘.’, ‘/vagrant’, disabled: true

boxes.each do |opts| config.vm.define opts[:name] do |config| config.vm.hostname = opts[:name] config.vm.provider “virtualbox” do |v| v.customize [“modifyvm”, :id, “—name”, opts[:name]] v.customize [“modifyvm”, :id, “—memory”, opts[:mem]] v.customize [“modifyvm”, :id, “—cpus”, opts[:cpu]] end config.vm.network :private_network, ip: opts[:eth1] end end config.vm.synced_folder “./share”, “/mnt/app-data”, type: “nfs” config.bindfs.bind_folder “/mnt/app-data”,”/share”,force_user:”vagrant”,force_group:”vagrant”,o:”nonempty” end


- **启动虚拟机**
```ruby
cd /cygdrive/e/vagrant/mybox/hk2
vagrant up
vagrant halt

参考

语雀:Docker安装Oracle_11g
https://www.yuque.com/fcant/operation/docker-oracle
博客园:Oracle中Basic与TNS的区别及与Oracle三种连接方式的关系
https://www.cnblogs.com/fps2tao/p/14059678.html
CSDN:JDBC连接ORACLE的三种URL格式
https://blog.csdn.net/u012062455/article/details/52442838
博客园:Oracle Client(客户端) 安装与配置
https://www.cnblogs.com/huangjinyong/p/9443631.html
语雀:Oracle数据库基本操作
https://www.yuque.com/fcant/sql/oracle-basic