如何在 Vagrant 中创建 Oracle 数据库并在我的本地 Rails 应用程序和 SQL 开发人员中连接到它?
How to create an Oracle database inside Vagrant and connect to it in my local Rails app and SQL Developer?
我遵循了 https://github.com/oracle/vagrant-boxes 的 OracleDatabase/18.3.0/README.md
的指示。
当vagrant up
安装完成后,终端输出:
oracle-18c-vagrant: ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: my_password
我尝试通过 SQL Developer 连接到这个数据库,在新的数据库连接中使用以下值 window:
- 连接名称:
my_local_oracle_db
- 用户名:
PDBADMIN
- 密码:
my_password
- 连接类型:
Basic
- 主机名:
localhost
- 端口:
1521
- SID:
ORCLCDB
但它给了我一个错误:ORA-01017: invalid username/password; logon denied
Q1) 我需要先在vagrant里面新建一个数据库吗?我可以使用什么指令来创建它?
Q2) 我应该输入什么值才能使用 SQL Developer 连接到它?
接下来,使用 Rails
连接它
我在 config/database.yml
中使用了这个配置:
test:
adapter: oracle_enhanced
hostname: localhost
port: 1521
username: PDBADMIN
password: my_password
但是当我执行 rails db:migrate
时,它失败了并出现以下错误:
$ RAILS_ENV=test rails db:migrate
Warning: NLS_LANG is not set. fallback to US7ASCII.
rails aborted!
NoMethodError: undefined method `match' for nil:NilClass
Q3) 我应该在 config/database.yml 中输入什么值?
我的 Rails 应用安装了 ruby-oci8
和 activerecord-oracle_enhanced-adapter
个 gem。
Q1:不,您不必创建数据库; Vagrantfile 创建一个 CDB (ORCLCDB) 和一个 PDB (ORCLPDB1)。
配置完成后,两者都可以使用了。
如果您不熟悉多租户概念,请参阅 About the Multitenant Architecture。
Q2:正如 Bjarte 已经提到的,要连接到 PDB,您需要使用 Service Name
选项而不是 SID
。
PDBADMIN
用户只存在于ORCLPDB1
PDB中,所以需要指定ORCLPDB1
为服务
请注意 PDBADMIN
在安装后没有很多权限,您可能希望首先以 SYSTEM
连接到 CDB 并授予 PDBADMIN
更多权限 -- 例如
ALTER SESSION SET CONTAINER=ORCLPDB1
GRANT DBA TO PDBADMIN
另请注意,您的端口号有错字(1512 而不是 1521)
Q3:见oracle-enhanced documentation
以下对我有用:
development:
adapter: oracle_enhanced
database: //localhost:1521/orclpdb1
username: pdbadmin
password: MySecretPassword
$ rake db:migrate
== 20200319203904 CreateAuthors: migrating ====================================
-- create_table(:authors)
-> 0.0628s
== 20200319203904 CreateAuthors: migrated (0.0630s) ===========================
Q1) 需要先在vagrant里面新建一个数据库吗?我可以使用什么指令来创建它?
我认为数据库已经在 vagrant 中创建,所以我不需要再次创建它。
Q2) 我应该输入什么值才能使用 SQL Developer 连接到它?
在新数据库连接中输入以下值window:
Connection Name: my_local_oracle_db
Username: SYS
Password: my_password
Role: SYSDBA
Connection Type: Basic
Hostname: localhost
Port: 1521
SID: ORCLCDB
这会将我连接到数据库中的 SYS 用户。
但我认为我需要使用 SYS 用户在同一数据库中创建另一个用户。
为此,在 SQL Developer 中连接到上述数据库后,运行 下面 SQL 命令:
CREATE USER C##db_name_here IDENTIFIED BY my_password2 DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
GRANT CONNECT TO C##db_name_here;
GRANT RESOURCE TO C##db_name_here;
GRANT UNLIMITED TABLESPACE TO C##db_name_here;
GRANT CREATE VIEW TO C##db_name_here;
GRANT CREATE MATERIALIZED VIEW TO C##db_name_here;
GRANT CREATE PROCEDURE TO C##db_name_here;
GRANT CREATE TYPE TO C##db_name_here;
GRANT CREATE DATABASE LINK TO C##db_name_here;
这个用户将是我在 Rails config/database.yml
中连接的用户
Q3) 我应该在 config/database.yml 中输入什么值?
test:
adapter: oracle_enhanced
hostname: localhost
port: 1521
database: ORCLCDB
username: C##db_name_here
password: my_password2
我遵循了 https://github.com/oracle/vagrant-boxes 的 OracleDatabase/18.3.0/README.md
的指示。
当vagrant up
安装完成后,终端输出:
oracle-18c-vagrant: ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: my_password
我尝试通过 SQL Developer 连接到这个数据库,在新的数据库连接中使用以下值 window:
- 连接名称:
my_local_oracle_db
- 用户名:
PDBADMIN
- 密码:
my_password
- 连接类型:
Basic
- 主机名:
localhost
- 端口:
1521
- SID:
ORCLCDB
但它给了我一个错误:ORA-01017: invalid username/password; logon denied
Q1) 我需要先在vagrant里面新建一个数据库吗?我可以使用什么指令来创建它?
Q2) 我应该输入什么值才能使用 SQL Developer 连接到它?
接下来,使用 Rails
连接它我在 config/database.yml
中使用了这个配置:
test:
adapter: oracle_enhanced
hostname: localhost
port: 1521
username: PDBADMIN
password: my_password
但是当我执行 rails db:migrate
时,它失败了并出现以下错误:
$ RAILS_ENV=test rails db:migrate
Warning: NLS_LANG is not set. fallback to US7ASCII.
rails aborted!
NoMethodError: undefined method `match' for nil:NilClass
Q3) 我应该在 config/database.yml 中输入什么值?
我的 Rails 应用安装了 ruby-oci8
和 activerecord-oracle_enhanced-adapter
个 gem。
Q1:不,您不必创建数据库; Vagrantfile 创建一个 CDB (ORCLCDB) 和一个 PDB (ORCLPDB1)。
配置完成后,两者都可以使用了。
如果您不熟悉多租户概念,请参阅 About the Multitenant Architecture。
Q2:正如 Bjarte 已经提到的,要连接到 PDB,您需要使用 Service Name
选项而不是 SID
。
PDBADMIN
用户只存在于ORCLPDB1
PDB中,所以需要指定ORCLPDB1
为服务
请注意 PDBADMIN
在安装后没有很多权限,您可能希望首先以 SYSTEM
连接到 CDB 并授予 PDBADMIN
更多权限 -- 例如
ALTER SESSION SET CONTAINER=ORCLPDB1
GRANT DBA TO PDBADMIN
另请注意,您的端口号有错字(1512 而不是 1521)
Q3:见oracle-enhanced documentation
以下对我有用:
development:
adapter: oracle_enhanced
database: //localhost:1521/orclpdb1
username: pdbadmin
password: MySecretPassword
$ rake db:migrate
== 20200319203904 CreateAuthors: migrating ====================================
-- create_table(:authors)
-> 0.0628s
== 20200319203904 CreateAuthors: migrated (0.0630s) ===========================
Q1) 需要先在vagrant里面新建一个数据库吗?我可以使用什么指令来创建它?
我认为数据库已经在 vagrant 中创建,所以我不需要再次创建它。
Q2) 我应该输入什么值才能使用 SQL Developer 连接到它?
在新数据库连接中输入以下值window:
Connection Name: my_local_oracle_db
Username: SYS
Password: my_password
Role: SYSDBA
Connection Type: Basic
Hostname: localhost
Port: 1521
SID: ORCLCDB
这会将我连接到数据库中的 SYS 用户。
但我认为我需要使用 SYS 用户在同一数据库中创建另一个用户。
为此,在 SQL Developer 中连接到上述数据库后,运行 下面 SQL 命令:
CREATE USER C##db_name_here IDENTIFIED BY my_password2 DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK;
GRANT CONNECT TO C##db_name_here;
GRANT RESOURCE TO C##db_name_here;
GRANT UNLIMITED TABLESPACE TO C##db_name_here;
GRANT CREATE VIEW TO C##db_name_here;
GRANT CREATE MATERIALIZED VIEW TO C##db_name_here;
GRANT CREATE PROCEDURE TO C##db_name_here;
GRANT CREATE TYPE TO C##db_name_here;
GRANT CREATE DATABASE LINK TO C##db_name_here;
这个用户将是我在 Rails config/database.yml
Q3) 我应该在 config/database.yml 中输入什么值?
test:
adapter: oracle_enhanced
hostname: localhost
port: 1521
database: ORCLCDB
username: C##db_name_here
password: my_password2