블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

최근에 올라온 글

'01.오라클'에 해당되는 글 117건

  1. 2014.09.05 [오라클]how to change the character set from WE8MSWIN1252 to AL32UTF8 in oracle rac 11g.
  2. 2013.04.19 [오라클]MySQL Vs. Oracle
  3. 2013.04.12 [오라클]DataPump Job
  4. 2013.04.03 [오라클]Script Base Install
  5. 2013.03.12 [오라클]ORA-06553: PLS-553: character set name is not recognized
  6. 2013.02.26 [오라클]제약조건 확인
  7. 2013.02.23 [오라클]INVALID Object 해결
  8. 2013.02.23 [오라클]아카이브 로그 설정
  9. 2013.02.23 [오라클]프로시저, 함수/펑션.FUNCTION 보기
  10. 2013.02.23 [오라클]INVALID recompile
  11. 2013.02.23 [오라클]system tablespace rename
  12. 2013.02.22 [오라클]권한 설정
  13. 2013.02.20 [오라클]DELETE, UPDATE 후 commit 데이터 복구
  14. 2013.02.20 [오라클]리스너 파일 크기 변경
  15. 2013.02.20 [오라클]DB링크 개념
  16. 2013.02.20 [오라클]비용기반 옵티마이저
  17. 2013.02.20 [오라클]DELETE와 TRUNCATE의 차이점
  18. 2013.02.20 [오라클]클라이언트 IP 접속 제한
  19. 2013.02.20 [오라클]클라이언트 IP 알아내기
  20. 2013.02.20 [오라클]테이블 설계시 고려해야 될 점
  21. 2013.02.20 [오라클]Characterset 변경
  22. 2013.02.20 [오라클]Full export / import
  23. 2013.02.06 [DB암호화]암호화에 따른 성능 이슈
  24. 2013.02.01 [오라클]NLS_LANG 관련 정보
  25. 2013.01.30 [오라클]cold backup 후 복구 방법(10g above)
  26. 2013.01.30 [오라클]cold backup 후 복구 방법 (9i)
  27. 2013.01.23 [오라클]유용한 DBA View 조회
  28. 2013.01.23 [오라클] V$ object 와 object 의 차이점
  29. 2013.01.23 [오라클]OFFLINE DROP 후 복구 절차
  30. 2012.12.20 [오라클]ORA-00031: session marked for kill 의 해결책

how to change the character set from WE8MSWIN1252 to AL32UTF8 in oracle rac 11g.

Steps to change the character set from WE8MSWIN1252 to AL32UTF8

1. Make the cluster database to false from any of the node.

SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE; -- RAC Only

2. Now shut down both the instance running on the nodes

SQL> SHUTDOWN IMMEDIATE;

3. Now start the database on any one node.

SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8; 
SQL> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16; 
SQL> SHUTDOWN IMMEDIATE;


4. Now start the db on one node and change the cluster database parameter to true.

SQL> ALTER SYSTEM SET CLUSTER_DATABASE=true scope=spfile;

SQL> Shut immediate;

5. Now start the database using srvctl services

$ Srvctl start database –d RAC.



Asian data in AL16UTF16 is more compact than UTF8 and save disk space and have less disk I/O with Asian data. But The maximum lengths for NCHAR and NVARCHAR2 are 1000 and 2000 characters, which is less than the lengths for NCHAR (2000) and NVARCHAR2 (4000) in UTF8.

When we need to use European data... UTF8 better...

Assume I created database with NATIONAL CHARACTER SET AL16UTF16. And need to use UTF8.
Anyway should backup before and Export/[Import] data about NCHAR and NVARCHAR2...
Because We Can not change NATIONAL CHARACTER SET when NCLOB, NCHAR or NVARCHAR2 data exists.

set lines 130
set pages 10
column PROPERTY_NAME format a35
column PROPERTY_VALUE format a35
column DESCRIPTION format a35
select * from database_properties where property_name='NLS_NCHAR_CHARACTERSET'

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
--------------------------------------------------------------
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set

create table a (b nvarchar2(4000));
create table a (b nvarchar2(4000))
*
ERROR at line 1:
ORA-00910: specified length too long for its datatype

create table a (b nvarchar2(2001));
create table a (b nvarchar2(2001))
*
ERROR at line 1:
ORA-00910: specified length too long for its datatype

create table a (b nvarchar2(2000));

Table created.

Begin Step by Step...

- SHUTDOWN IMMEDIATE
- STARTUP MOUNT
- ALTER SYSTEM ENABLE RESTRICTED SESSION

Perhaps should:
alter system set job_queue_processes=0
alter system set aq_tm_processes=0

- ALTER DATABASE OPEN
- ALTER DATABASE NATIONAL CHARACTER SET UTF8

If =>
ALTER DATABASE NATIONAL CHARACTER SET UTF8
*
ERROR at line 1:
ORA-12717: Cannot issue ALTER DATABASE NATIONAL CHARACTER SET when NCLOB, NCHAR or NVARCHAR2 data exists

Check alert log and remove data from list (don't forget backup before), Example:

Mon Feb 09 11:52:45 2009
ALTER DATABASE NATIONAL CHARACTER SET UTF8
PM.PRINT_MEDIA (AD_FLTEXTN) - NCLOB populated
ORA-12717 signalled during: ALTER DATABASE NATIONAL CHARACTER SET UTF8....

remark:
ORA-12717: Cannot issue ALTER DATABASE NATIONAL CHARACTER SET when NCLOB, NCHAR or NVARCHAR2 data exists
Cause: NCLOB, NCHAR or NVARCHAR2 data changed the representation to Unicode when converting to a multibyte character set and must be migrated.
Action: Remove NCLOB, NCHAR or NVARCHAR2 data as listed in the alert file. The above type data can be migrated by methods such as import/export.

- SHUTDOWN IMMEDIATE
- STARTUP

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
---------------------------------------------------------------------
NLS_NCHAR_CHARACTERSET UTF8 NCHAR Character set

create table a (b nvarchar2(4000));

Table created.

Posted by redkite
, |

2 Oracle and MySQL Compared

This chapter compares the MySQL database and the Oracle database. It includes the following sections:

2.1 Database Security

This section includes information about security issues with MySQL databases and Oracle databases.

As with Oracle, MySQL users are maintained by the database. MySQL uses a set of grant tables to keep track of users and the privileges that they can have. MySQL uses these grant tables when performing authentication, authorization and access control for users.

2.1.1 Database Authentication

Unlike Oracle (when set up to use database authentication) and most other databases that use only the user name and password to authenticate a user, MySQL uses an additional location parameter when authenticating a user. This location parameter is usually the host name, IP address, or a wildcard (Ò%Ó). With this additional parameter, MySQL may further restrict a user access to the database to a particular host or hosts in a domain. Moreover, this also allows a different password and set of privileges to be enforced for a user depending on the host from which the connection is made. Thus, user scott, who logs on from abc.com may or may not the same as user scott who logs on from xyz.com.

2.1.2 Privileges

The MySQL privilege system is a hierarchical system that works through inheritance. Privileges granted at a higher level are implicitly passed down to all lower levels and may be overridden by the same privileges set at lower levels. MySQL allows privileges to be granted at five different levels, in descending order of the scope of the privileges:

  • Global

  • Per-host basis

  • Database-level

  • Table-specific

  • Column-specific (single column in a single table

Each level has a corresponding grant table in the database. When performing a privilege check, MySQL checks each of the tables in descending order of the scope of the privileges, and the privileges granted at a lower level take precedence over the same privileges granted at a higher level.

The privileges supported by MySQL are grouped into two types: administrative privileges and per-object privileges. The administrative privileges are global privileges that have server-wide effects and are concerned with the functioning of MySQL. These administrative privileges include the FILE, PROCESS, REPLICATION, SHUTDOWN and SUPER privilege. The per-object privileges affect database objects such tables, columns, indexes, and stored procedures, and can be granted with a different scope. These per-object privileges are named after the SQL queries that trigger their checks.

Unlike in Oracle, there is no concept of role in MySQL. Thus, in order to grant a group of users the same set of privileges, the privileges have to be granted to each user separately. Alternately, though less satisfactory for auditing, users performing tasks as a role may all share a single user account that is designated for the "role" and with the required privileges granted.

2.2 Schema Migration

The schema contains the definitions of the tables, views, indexes, users, constraints, stored procedures, triggers, and other database-specific objects. Most relational databases work with similar objects.

This section contains the following:

2.2.1 Schema Object Similarities

There are many similarities between schema objects in Oracle and MySQL. However, some schema objects differ between these databases. For more information about schema objects, see Oracle SQL Reference.

Table 2-1 shows the differences between Oracle and MySQL.

Table 2-1 Schema Objects in Oracle and MySQL

OracleMySQL

AFTER trigger

trigger

BEFORE trigger

trigger

Check constraint

Check constraint

Column default

Column default

Database

Database

Foreign key

Foreign key

Index

Index

Package

N/A

PL/SQL function

Routine

PL/SQL procedure

Routine

Primary key

Primary key

Role

N/A

Schema

Schema

Sequence

AUTO_INCREMENT for a column

Snapshot

N/A

Synonym

N/A

Table

Table

Tablespace

N/A

Temporary table

Temporary table

Trigger for each row

Trigger for each row

Unique key

Unique key

User

User

View

View


2.2.2 Schema Object Names

Oracle is case insensitive to object names, and Oracle schema object names are stored as uppercase.

As in Oracle, column, index, stored procedure, and trigger names as well as column aliases in MySQL are case insensitive on all platforms. However, the case sensitivity of database and tables names for MySQL differs from Oracle. In MySQL, databases correspond to directories within the data directory, and tables correspond to one or more files within the database directory. As such, the case sensitivity of the database and table names is determined by the case sensitivity of the underlying operating systems. This means that database and table names are not case-sensitive in Windows and are case-sensitive in most varieties of Unix. However, MySQL allows users to determine how the database and table names are stored on disk and in their use in MySQL through the lower_case_table_names system variable. Table aliases are case-sensitive in releases before MySQL 4.1.1.

Both Oracle and MySQL let you use reserved words as object names by representing the name with a quoted identifier. However, MySQL allows some reserved words such as DATE and TIMESTAMP to be used as unquoted identifier for object names, although this is not allowed in Oracle. SQL Developer appends an underscore (_) to the name of a MySQL object that is an Oracle reserved word.

MySQL and Oracle have some minor differences in their definition of an identifier. In MySQL, an unquoted identifier may begin with a digit, and double quotation marks are allowed in a quoted identifier; however, neither of these is allowed in an Oracle identifier. In MySQL, the quote character is the backtick (`). If the SQL mode ANSI_QUOTES is set, double quotes can also be used to quote the identifiers. In Oracle, identifiers are quoted using double quotation marks.

You should choose a schema object name that is unique by case and by at least one other characteristic, and ensure that the object name is not a reserved word from either database.

2.2.3 Table Design Considerations

This section discusses table design issues that you need to consider when converting MySQL databases to Oracle. This section includes the following­:

2.2.3.1 Character Data Types

MySQL and Oracle have some differences in the character types that they support and in the way they store and retrieve the character type values.

MySQL supports the CHAR and VARCHAR type for character type with a length that is less than 65,535 bytes. The CHAR type can have a maximum length of 255 bytes, and as of MySQL 3.23 it may also be declared with a length of 0 byte. Before MySQL 5.0.3, the length specification for the VARCHAR type is the same as the CHAR type. From MySQL 5.0.3 on, the maximum length for the VARCHAR type is 65,535 bytes. Oracle supports four character types: CHAR, NCHAR, NVARCHAR2 and VARCHAR2. The minimum length that can be declared for all Oracle character types is 1 byte. The maximum size allowed for CHAR and NCHAR is 2,000 bytes, and for NVARCHAR2 and VARCHAR2 it is 4,000 bytes.

MySQL CHAR values are right-padded with spaces to the specified length when they are stored, and trailing spaces are removed when the values are retrieved. On the other hand, VARCHAR values are stored using as many characters as are given, but before MySQL 5.0.3 trailing spaces are removed when the values are stored and retrieved. Oracle blank-pads the value for its CHAR and NCHAR type to the column length if the value is shorter than the column length, and trailing spaces are not removed on retrieval. For NVARCHAR2 and VARVHAR2 data type columns, Oracle stores and retrieves the value exactly as is given, including trailing spaces.

If a value is assigned to a character type column that exceeds its specified length, MySQL truncates the value and does not generate an error unless the STRICT SQL mode is set. Oracle generates an error if the value assigned to a character type column exceeds its specified length.

In MySQL, every character type (CHAR, VARCHAR, and TEXT) column has a column character set and collation. If the character set or collation is not explicitly defined in the column definition, the table character set or collation is implied if specified; otherwise, the database character or collation is chosen. In Oracle, the character set for CHAR and VARCHAR2 types is defined by the database character set, and for the character set for NCHAR and NVARCHAR types is defined the national character set.

When declaring a CHAR or VARCHAR type in MySQL, the default length semantics is characters instead of bytes for MySQL 4.1 and later. In Oracle, the default length semantics is bytes for CHAR and VARCHAR2 types and characters for NCHAR and NVARCHAR2 types.

SQL Developer will map MySQL CHAR and VARCHAR types to Oracle CHAR and VARCHAR2 types, respectively. SQL Developer will determine the maximum number of bytes for the Oracle CHAR and VARCHAR2 data type columns from the number of bytes required to hold the maximum length specified for the corresponding MySQL CHAR and VARCHAR data type columns. If the MySQL VARCHAR2 column is such that the data exceeds 4000 bytes, convert the column to an Oracle CLOB data type column.

2.2.3.2 Column Default Value

MySQL differs from Oracle in the way it handles default value for a column that does not allow NULL value.

In MySQL, for a column that does not allow NULL value and for which no data is provided for the column when data is inserted into the table, MySQL determines a default value for the column. This default value is the implicit default value for the column data type. However, if the strict mode is enabled, MySQL generates errors, and for transactional tables it rolls back the insert statement.

In Oracle, when data is inserted into a table, data must be provided for all columns that do not allow NULL value. Oracle does not generate a default value for columns that have the NOT NULL constraint.

2.2.4 Migrating Multiple Databases

SQL Developer supports the migration of multiple MySQL databases if they are on the same MySQL database server.

2.2.5 Schema Migration Considerations for MySQL

Schema migration considerations for MySQL apply in the following areas"

2.2.5.1 Databases

When migrating MySQL databases to Oracle, SQL Developer maps each MySQL database to a tablespace in Oracle. Database objects, such as tables, indexes and views are stored in the respective tablespaces and are referenced from the Oracle schema for the user that owns them.

2.2.5.2 Mapping MySQL Global and Database-Level Privileges to Oracle System Privileges

SQL Developer does not process all the administrative privileges on MySQL, except the SUPER privilege. Table 2-2 shows the mappings for MySQL per-object privileges granted at the different levels as well as the SUPER privilege granted at the global level.

Table 2-2 MySQL Privileges and Oracle System Privileges

LevelPrivilegeSystem Privilege(s) on Oracle

Global

ALTER

ALTER ANY TABLE, ALTER ANY SEQUENCE, ALTER ANY CUSTER, COMMENT ANY TABLE

Global

ALTER ROUTINE

ALTER ANY PROCEDURE, DROP ANY PROCEDURE

Global

CREATE

CREATE ANY TABLE, CREATE ANY SEQUENCE, CREATE ANY CLUSTER, CREATE DATABASE LINK, COMMENT ANY TABLE

Global

CREATE ROUTINE

CREATE ANY PROCEDURE

Global

CREATE USER

CREATE USER, GRANT ANY PRIVILEGE

Global

CREATE VIEW

CREATE ANY VIEW

Global

DELETE

ALTER ANY TABLE, DROP USER, DELETE ANY TABLE

Global

DROP

DROP ANT TABLE, DROP ANY SEQUENCE, DROP ANY CLUSTER, DROP ANY VIEW

Global

EXECUTE

EXECUTE ANY PROCEDURE

Global

INDEX

CREATE ANY INDEX, ALTER ANY INDEX, DROP ANY INDEX

Global

INSERT

INSERT ANY TABLE

Global

LOCK TABLES

LOCK ANY TABLE

Global

SELECT

SELECT ANY TABLE

Global

SUPER

CREATE ANY TRIGGER, DROP ANY TRIGGER

Global

UPDATE

UPDATE ANY TABLE

Global

USAGE

CREATE SESSION, ALTER SESSION, UNLIMITED TABLESPACE

Database

CREATE

CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE TABLE

Database

CREATE ROUTINE

CREATE PROCEDURE

Database

CREATE VIEW

CREATE VIEW

Table

CREATE

CREATE TABLE

Table

CREATE VIEW

CREATE VIEW


2.2.5.3 Temporary Tables

SQL Developer does not support the migration of temporary tables.

In MySQL, temporary tables are database objects that are visible only to the current user session and are automatically dropped when the user session ends.

The definition of temporary tables in Oracle differs slightly from MySQL, in that the temporary tables, once created, exist until they are explicitly dropped and they are visible to all sessions with appropriate privileges. However, the data in the temporary tables is visible only to the user session that inserts the data into the table, and the data may persist for the duration of a transaction or a user session.

2.2.5.4 Owner of Schema Objects

SQL Developer creates an Oracle schema for the MySQL root user that owns, for all databases to be migrated, all database objects except stored procedures. For stored procedures, the MySQL users that created them remain the owner. SQL Developer creates an Oracle schema for each MySQL user that is migrated.

2.3 Data Types

This section describes the data types used within Oracle. It shows the MySQL data types and the Oracle equivalent. It includes information about the following:

2.3.1 Supported Oracle Data Types

Table 2-3 describes the Oracle data types supported by Oracle SQL Developer.

Table 2-3 Supported Oracle Data Types

Data TypeDescription

BLOB

A binary large object. Maximum size is 4 gigabytes.

CHAR (SIZE)

Fixed-length character data of length size bytes. Maximum size is 2000 bytes. Default and minimum size is 1 byte.

CLOB

A character large object containing single-byte characters. Both fixed-width and variable-width character sets are supported, both using the CHAR database character set. Maximum size is 4 gigabytes.

DATE

The DATE data type stores date and time information. Although date and time information can be represented in both CHAR and NUMBER data types, the DATE data type has special associated properties. For each DATE value, Oracle stores the following information: century, year, month, day, hour, minute, and second.

FLOAT

Specifies a floating-point number with decimal precision 38, or binary precision 126.

LONG (SIZE)

Character data of variable length up to 2 gigabytes, or 2^31 -1 bytes.

LONG RAW

Raw binary data of variable length up to 2 gigabytes.

NCHAR (SIZE)

Fixed-length character data of length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 2000 bytes. Default and minimum size is 1 character or 1 byte, depending on the character set.

NCLOB

A character large object containing multibyte characters. Both fixed-width and variable-width character sets are supported, both using the NCHAR database character set. Maximum size is 4 gigabytes. Stores national character set data.

NUMBER

Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127.

NVARCHAR2 (SIZE)

Variable-length character string having maximum length size characters or bytes, depending on the choice of national character set. Maximum size is determined by the number of bytes required to store each character, with an upper limit of 4000 bytes. You must specify size for NVARCHAR2.

RAW (SIZE)

Raw binary data of length size bytes. Maximum size is 2000 bytes. You must specify size for a RAW value.

VARCHAR (SIZE)

The VARCHAR data type is currently synonymous with the VARCHAR2 data type. Oracle recommends that you use VARCHAR2 rather than VARCHAR. In the future, VARCHAR might be defined as a separate data type used for variable-length character strings compared with different comparison semantics. The maximum size is 4000 and the minimum of 1 is the default.

BINARY_DOUBLE

A 64-bit, double-precision floating-point number data type.

BINARY_FLOAT

A 32-bit, single-precision floating-point number data type.


For more information about Oracle data types, see Oracle Database SQL Language Reference.

2.3.2 Default Data Type Mappings

Table 2-4 shows the default settings used by SQL Developer to convert data types from MySQL to Oracle. SQL Developer enables you to change the default setting for certain data types by specifying an alternative type. For information about changing the default data type mappings, see the SQL Developer online help.

Table 2-4 Default Data Type Mappings Used by Oracle SQL Developer

MySQL Data TypeOracle Data Type

BIGINT

NUMBER(19, 0)

BIT

RAW

BLOB

BLOB, RAW

CHAR

CHAR

DATE

DATE

DATETIME

DATE

DECIMAL

FLOAT (24)

DOUBLE

FLOAT (24)

DOUBLE PRECISION

FLOAT (24)

ENUM

VARCHAR2

FLOAT

FLOAT

INT

NUMBER(10, 0)

INTEGER

NUMBER(10, 0)

LONGBLOB

BLOB, RAW

LONGTEXT

CLOB, RAW

MEDIUMBLOB

BLOB, RAW

MEDIUMINT

NUMBER(7, 0)

MEDIUMTEXT

CLOB, RAW

NUMERIC

NUMBER

REAL

FLOAT (24)

SET

VARCHAR2

SMALLINT

NUMBER(5, 0)

TEXT

VARCHAR2, CLOB

TIME

DATE

TIMESTAMP

DATE

TINYBLOB

RAW

TINYINT

NUMBER(3, 0)

TINYTEXT

VARCHAR2

VARCHAR

VARCHAR2, CLOB

YEAR

NUMBER


Note:

The ENUM and SET data types have no direct mapping in Oracle. SQL Developer maps ENUM columns in MySQL to VARCHAR2 columns in Oracle. It then adds a constraint and a trigger to those columns to ensure that only values that were allowed by the ENUM data type are allowed in the column it was mapped to in Oracle.

2.3.3 Comparing Data Types

This section lists the difference between MySQL and Oracle data types. For some MySQL data types there is more than one alternative Oracle data type. The tables include information about the following:

2.3.3.1 Numeric Types

When mapping MySQL data types to numeric data types in Oracle, the following conditions apply:

  • If there is no precision or scale defined for the destination Oracle data type, precision and scale are taken from the MySQL source data type.

  • If there is a precision or scale defined for the destination data type, these values are compared to the equivalent values of the source data type and the maximum value is selected.

The following table compares the numeric types of MySQL to Oracle:

MySQLSizeOracle
BIGINT8 BytesNUMBER (19,0)
BITapproximately (M+7)/8 BytesRAW
DECIMAL(M,D)M+2 bytes if D > 0, M+1 bytes if D = 0 (D+2, if M < D)FLOAT(24), BINARY_FLOAT
DOUBLE8 BytesFLOAT(24), BINARY_FLOAT, BINARY_DOUBLE
DOUBLE PRECION8 BytesFLOAT(24), BINARY_DOUBLE
FLOAT(25<=X <=53)8 BytesFLOAT(24), BINARY_FLOAT
FLOAT(X<=24)4 BytesFLOAT, BINARY_FLOAT
INT4 BytesNUMBER (10,0)
INTEGER4 BytesNUMBER (10,0)
MEDIUMINT3 BytesNUMBER (7,0)
NUMERICM+2 bytes if D > 0, M+1 bytes if D = 0 (D+2, if M < D)NUMBER
REAL8 BytesFLOAT(24), BINARY_FLOAT
SMALLINT2 BytesNUMBER(5,0)
TINYINT1 ByteNUMBER(3,0)

2.3.3.2 Date and Time Types

The following table compares the date and time types of MySQL to Oracle:

MySQLSizeOracle
DATE3 BytesDATE
DATETIME8 BytesDATE
TIMESTAMP4 BytesDATE
TIME3 BytesDATE
YEAR1 ByteNUMBER

2.3.3.3 String Types

When mapping MySQL data types to character data types in Oracle, the following conditions apply:

  • If there is no length defined for the destination data type, the length is taken from the source data type.

  • If there is a length defined for the destination data type, the maximum value of the two lengths is taken.

The following table compares the string types of MySQL to Oracle:

Note:

Reference to M indicates the maximum display size. The maximum legal display size is 255. A reference to L applies to a floating point types and indicates the number of digits following the decimal point.
MySQLSizeOracle
BLOBL + 2 Bytes whereas L<2^16RAW, BLOB
CHAR(m)M Bytes, 0<=M<=255CHAR
ENUM (VALUE1, VALUE2, ...)1 or 2 Bytes depending on the number of enum. values (65535 values max) 
LONGBLOBL + 4 Bytes whereas L < 2 ^ 32RAW, BLOB
LONGTEXTL + 4 Bytes whereas L < 2 ^ 32RAW, CLOB
MEDIUMBLOBL + 3 Bytes whereas L < 2^ 24RAW, BLOB
MEDIUMTEXTL + 3 Bytes whereas L < 2^ 24RAW, CLOB
SET (VALUE1, VALUE2, ...)1, 2, 3, 4 or 8 Bytes depending on the number of set members (64 members maximum) 
TEXTL + 2 Bytes whereas L<2^16VARCHAR2, CLOB
TINYBLOBL + 1 Bytes whereas L<2 ^8RAW, BLOB
TINYTEXTL + 1 Bytes whereas L<2 ^8VARCHAR2
VARCHAR(m)L+1 Bytes whereas L<=M and0<=M<=255 before MySQL 5.0.3 (0 <= M <= 65535 in MySQL 5.0.3 and later; effective maximum length is 65,532 bytes)VARCHAR2, CLOB

2.4 Data Storage Concepts

This section provide a description of the conceptual differences and similarities in data storage for MySQL and Oracle databases.

Data storage is an aspect of MySQL that sets it apart for nearly every database, including Oracle. In MySQL, databases correspond to directories within the data directory of the server. Tables within a database correspond to one or more files within the database directory, depending on the storage engine used for the tables.

A database can contain a mix of tables of different storage engines. A storage engine is responsible for the storage and retrieval of the data for a table.

MySQL offers a variety of storage engines (formerly called table types) to meet the different requirements of the user's environment. Table 2-5 shows the storage engines supported by MySQL.

Table 2-5 Storage Engines Supported by MySQL

Storage EngineDescription

MyISAM

The default non-transactional storage engine that provides full-text indexing and is highly portable

MERGE

A non-transactional storage engine that allows a collection of MyISAM tables with identical column and index information to be used as one

MEMORY (HEAP)

A non-transactional storage engine that stores data in memory

BDB (Berkeley DB)

The first transactional-safe storage engine

InnoDB

A transactional-safe storage engine designed for maximum performance when processing large volume of data and that provides row-level locking

FEDERATED

A storage engine that accesses data in tables of remote databases rather than in local tables

ARCHIVE

A storage engine that can store large amount of data without indexes in very small footprint

CSV

A storage engine that stores data in text file using comma-separated-values format

BLACKHOLE

A storage engine that acts as a "black hole" that accepts data but throws it away and does not store it

EXAMPLE

A "stub" engine that does nothing. Its purpose is to serve as an example that illustrates how to begin writing new engines.

ISAM

The original MySQL storage engine that has been deprecated in favor of the MyISAM storage engine as of version 5.0


Each storage engine has its benefits and drawbacks. Some of features that differentiate the storage engines are transaction, locking, concurrency and portability. The following table summarizes the features for four of the commonly used storage engines.

Table 2-6 Feature Comparison for Common Storage Engines

FeatureMyISAMHeapBDBInnoDB

Transactional

No

No

Yes

Yes

Lock granularity

Table

Table

Page

Row

Storage

A data file (.MYD) and an index file (.MYI) for each table

In-memory

A single data and index file (.db) for each table

A set of data files for all the tables

Portable

Yes

N/A

No

Yes


An Oracle database consists of one or more tablespaces. Tablespaces provide logical storage space that link a database to the physical disks that hold the data. A tablespace is created from one or more data files. Data files are files in the file system or an area of disk space specified by a raw device. A tablespace can be enlarged by adding more data files.

An Oracle database consists of a least a SYSTEM tablespace, where the Oracle tables are stored. It can also consist of user defined tablespaces. A tablespace is the logical storage location for database objects. For example, you can specify where a particular table or index gets created in the tablespace.

Posted by redkite
, |

Data Pump (Master Table)

      1) External Table 확장
      2) expdp, impdp
      * DB Link를 이용한 Network Mode (NETWORK_LINK 옵션)
      * Directory Object가 반드시 필요(DIRECTORY 옵션)
      * expdp 옵션에 의한 객체 단위 포함/제외 가능(EXCLUDE/INCLUDE 옵션 및 향상된 QUERY 옵션)
      * 제한적이긴 하지만 Parallel 가능(PARALLEL 옵션)
      * Master Table에 의한 중지 작업 재시작 및 작업 변경(추가 및 삭제)이 가능
      * REMAP_SCHEMA, REMAP_DATAFILE, REMAP_TABLESPACE 등 새로운 옵션

## 실습 01 ######################################################################

sqlplus system/oracle  또는 conn system/oracle

host mkdir C:\oracle10g\EXP_PUMP1
host mkdir C:\oracle10g\EXP_PUMP2

CREATE OR REPLACE DIRECTORY exp_pump_dir1 AS 'C:\oracle10g\EXP_PUMP1' ;
CREATE OR REPLACE DIRECTORY exp_pump_dir2 AS 'C:\oracle10g\EXP_PUMP2' ;

grant read, write on directory exp_pump_dir1 to public ;
grant read, write on directory exp_pump_dir2 to public ;

exit


cd c:\oracle10g\exp_pump

1)
expdp hr/hr DUMPFILE=exp_pump_dir1:exp_hr03.dmp LOGFILE=exp_pump_dir2:exp_hr03.log

expdp hr/hr DUMPFILE=exp_pump_dir:expdp_hr01.dmp NOLOGFILE=y

2)                                                                 
expdp hr/hr DIRECTORY=exp_pump_dir1 DUMPFILE=exp_hr02.dmp LOGFILE=exp_pump_dir2:exp_hr02.log

3)
set DATA_PUMP_DIR=exp_pump_dir

expdp system/oracle DUMPFILE=exp_hr_emp01.dmp NOLOGFILE=y tables=hr.employees
expdp system/oracle DUMPFILE=exp_hr05.dmp LOGFILE=exp_hr04.log SCHEMAS=hr


## 실습 02 expdp impdp 기본 옵션 ################################################

(실습 준비)

mkdir c:\oracle10g
mkdir c:\oracle10g\dptest

cd c:\oracle10g\dptest
sqlplus /nolog
conn sys/oracle as sysdba

create directory dp_test_dir as 'c:\oracle10g\dptest' ;

grant read, write on directory dp_test_dir to hr ;

conn hr/hr

create table emps03_02 tablespace example
as
  select * from hr.employees ;

insert into emps03_02 select * from emps03_02 ; --> 12회 정도 실행

commit ;

select sum(bytes)/1024/1024 AS "SIZE_MB" from user_segments
where  segment_name = 'EMPS03_02' ;

conn system/oracle

alter system checkpoint ;

exec dbms_stats.gather_table_stats('HR','EMPS03_02' -
     ,estimate_percent => dbms_stats.auto_sample_size -
     ,method_opt => 'FOR ALL COLUMNS SIZE AUTO' , cascade => TRUE) ;

select sum(bytes)/1024/1024 AS "SIZE_MB" from dba_segments
where  owner='HR' and segment_name = 'EMPS03_02' ;

exit

------------------------------------------------------------------------
## exp_test01_par01.txt 파일 작성

userid=hr/hr
directory=dp_test_dir
job_name=exptest01
logfile=exp_test01.log
filesize=2M
tables=emps03_02
estimate=statistics
estimate_only=y           <- 실제로 익스포트 안받고 확인받하는거야? 사용공간 분석이야

- 아래 애는 절대경로를 사용한다..
expdp parfile=exp_test01_par01.txt

------------------------------------------------------------------------
## exp_test01_par02.txt 파일 작성

userid=hr/hr
directory=dp_test_dir
job_name=exptest0102
logfile=exp_test0102.log
filesize=5M
tables=emps03_02
dumpfile=exp_test02_%U.dmp

expdp parfile=exp_test01_par02.txt

------------------------------------------------------------------------
## imp_test01_par03.txt 파일 작성

userid=hr/hr
directory=dp_test_dir
job_name=imptest0103
logfile=imp_test0103.log
tables=emps03_02
dumpfile=exp_test02_%U.dmp
table_exists_action=append


sqlplus system/oracle
truncate table hr.emps03_02 ;
exit

impdp parfile=imp_test01_par03.txt


## exp_test01_par04.txt  파일 작성

userid=hr/hr
directory=dp_test_dir
job_name=exptest0104
logfile=exp_test0104.log
filesize=5M
dumpfile=exp_test04_%U.dmp
EXCLUDE=VIEW
EXCLUDE=PACKAGE
EXCLUDE=INDEX:"LIKE 'EMP_%'"
EXCLUDE=TABLE:"LIKE 'EMPS03%'"
EXCLUDE=TABLE:"LIKE 'JOB%'"
QUERY=HR.employees:"WHERE department_id IN (10,20) and salary<1600"

expdp parfile=exp_test01_par04.txt


(참고)
CONTENT=METADATA_ONLY
CONTENT=DATA_ONLY
CONTENT=ALL

 

## 실습 03 Attach & JOB STOP & JOB RESTART ######################################

(준비작업)

sqlplus hr/hr

select sum(bytes)/1024/1024 AS "SIZE_MB" from user_segments
where  segment_name = 'EMPS03_02' ;

insert into emps03_02 select * from emps03_02 ; <--2회 실행

commit ;

conn system/oracle

alter system checkpoint ;

exit

## 작업내용 확인(현재 진행중이거나, 에러 후 중단된 작업내역을 확인가능.)

sqlplus /nolog
conn sys/oracle as sysdba

grant select on dba_datapump_jobs to hr ; <--조회 권한할당

conn hr/hr

desc dba_datapump_jobs

col OWNER_NAME format a10
col JOB_NAME format a15
col OPERATION format a15
col JOB_MODE format a10
col STATE format a15
set linesize 120

select * from dba_datapump_jobs ;

===================================================================

(SESSION 1)--------------------------------------------------------

## exp_test02_par01.txt 파일 작성

userid=hr/hr
directory=dp_test_dir
job_name=exptest0201
logfile=exp_test0201.log
filesize=30M
tables=emps03_02
dumpfile=exp_test0201_%U.dmp

sqlplus hr/hr


(SESSION 2)--------------------------------------------------------
cd c:\oracle10g\dptest
expdp parfile=exp_test02_par01.txt


(SESSION 1) 작업확인-----------------------------------------------

select * from dba_datapump_jobs ;  <--JOB_NAME 필드 확인


(SESSION 3) <--현재 작업중인 export에 연결.------------------------

expdp hr/hr attach=exptest0201  <--job이름

Export>


(SESSION 1)--------------------------------------------------------

select * from dba_datapump_jobs ;  <--ATTACHED_SESSIONS 수가 증가

(SESSION 3) 현재 작업 중단-----------------------------------------

Export> stop_job

yes 입력 --> 시간걸림 그동안에 다음 수행


(SESSION 1)

select * from dba_datapump_jobs ;  <--ATTACHED_SESSIONS 수가 감소

그 동안에 (SESSION 3) 중단 작업 완료
   --> 원래 SESSION 2도 중단됨

(SESSION 2) 강제 종료

(SESSION 1)

select * from dba_datapump_jobs ;  <-- NOT RUNNING

===================================================================
## 중단작업에 attach 및 작업 재시작 실습
===================================================================

(SESSION 3)

expdp hr/hr attach=exptest0201  <--job이름

Export>

(SESSION 1)

select * from dba_datapump_jobs ;


(SESSION 3) 중단 작업 재개

Export> start_job

Export> status=10  <-- 매 10초간 상태 확인

Export> continue_client <-- Session 2에서 시작된 작업인데 클라이언트가 종료되었으므로
                            Session 3에서 진행 결과를 받도록 설정.

작업완료 후에

(SESSION 1)

select * from dba_datapump_jobs ;

 

 

DBA_DATAPUMP_JOBS

>DBA_DATAPUMP_JOBS identifies all active Data Pump jobs in the database, regardless of their state, on an instance (or on all instances for Real Application Clusters). It also show all Data Pump master tables not currently associated with an active job.

Related View

>USER_DATAPUMP_JOBS displays the Data Pump jobs owned by the current user. This view does not display the OWNER_NAME column.

Column Datatype NULL Description
OWNER_NAME VARCHAR2(30)   User that initiated the job
JOB_NAME VARCHAR2(30)   User-supplied name for the job (or the default name generated by the server)
OPERATION VARCHAR2(30)   Type of job
JOB_MODE VARCHAR2(30)   Mode of job
STATE VARCHAR2(30)   Current job state
DEGREE NUMBER   Number of worker processes performing the operation
ATTACHED_SESSIONS NUMBER   Number of sessions attached to the job
DATAPUMP_SESSIONS NUMBER   Number of Data Pump sessions participating in the job

Posted by redkite
, |


Script.zip


오라클 데이터베이스를 생성할 때 보통은 DBCA를 이용한다.
그러나 DBCA만 사용해 DB를 생성하다보면, DBCA를 사용할 수 없는 상황에는 당황하게 된다.


다음은 DBCA를 이용할 수 없는 경우 오라클 데이터베이스를 생성하는 절차다.

  1. SID, ORACLE_HOME 설정

    export ORACLE_SID=testdbexport ORACLE_HOME=/path/to/oracle/home

  2. 초기화 파라미터 파일 생성 (minimal)
    $ORACLE_HOME/dbs에 init<SID>.ora 파일을 만든다.

    control_files = (/path/to/control1.ctl,/path/to/control2.ctl,/path/to/control3.ctl)
    undo_management = AUTO
    undo_tablespace = UNDOTBS1
    db_name = test
    db_block_size = 8192
    sga_max_size = 1073741824 # 1GBsga_target = 1073741824 # 1GB

  3. 패스워드 파일 생성

    $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/pwd{sid}.ora password=oracle entries=5

  4. 인스턴스 기동

    $ sqlplus '/as sysdba'

    SQL> startup nomount

  5. CREATE DATABASE 문 실행

    create database test
    dblogfile group 1 ('/path/to/redo1.log') size 100M,
    group 2 ('/path/to/redo2.log') size 100M,
    group 3 ('/path/to/redo3.log') size 100M
    character set ko16ksc5601
    national character set al16utf16
    datafile '/path/to/system.dbf' size 500M autoextend on next 10M maxsize unlimited extent management local
    sysaux datafile '/path/to/sysaux.dbf' size 100M autoextend on next 10M maxsize unlimited
    undo tablespace undotbs1 datafile '/path/to/undotbs1.dbf' size 100M
    default temporary tablespace temp tempfile '/path/to/temp01.dbf' size 100M;

    CREATE DATABASE 문 Syntax는 다음과 같다.
    CREATE DATABASE [database name]
    [CONTROLFILE REUSE]
    [LOGFILE [GROUP integer] file specification]
    [MAXLOGFILES integer]
    [MAXLOGMEMBERS integer]
    [MAXLOGHISTORY integer]
    [MAXDATAFILES integer]
    [MAXINSTANCES integer]
    [ARCHIVELOG|NOARCHIVELOG]
    [CHARACTER SET charset]
    [NATIONAL CHARACTER SET charset]
    [DATAFILE filespec [autoextend]]
    [DEFAULT TEMPORARY TABLESPACE tablespace filespec]
    [UNDO TABLESPACE tablespace DATAFILE filespec]
    [SET TIME_ZONE [time_zone_region]];

  6. Data Dictionary View 생성 스크립트 실행

    $ORACLE_HOME/rdbms/admin/CATALOG.sql$ORACLE_HOME/rdbms/admin/CATPROC.sql

  7. SPFILE 생성

    SQL> create spfile from pfile;

  8. 추가 테이블스페이스 생성
  9. sys, system 계정 암호 변경

Posted by redkite
, |

오라클 설치시 인스톨러에서 데이타베이스 자동 생성을 할 경우
OS 언어에 따라 자동으로 characterset 이 설정되어 설치되는데,
characterset을 임의로 변경하는 방법 입니다.

변경시나리오)

* 기존 개발용 오라클DB OLD_ORA 의 nls_characterset 은 US7ASCII 이다.

* 기존 클라이언트 nls_lang 은 AMERICAN_AMERICA.US7ASCII 이다.

* 새로운 한글windows OS에 오라클DB NEW_ORA 를 설치하였는데 nls_characterset 이 KO16MSWIN949 이다.

* OLD_ORA 의 데이타를 exp 유틸로 덤프를 떠서 NEW_ORA 에 imp 유틸로 복구하였는데,

일본및 중국 언어문자셋이 깨어져 버리고 ??? 등으로 바뀌어 유니크인덱스가 생성되지 않는다.

* 데이타 이전및 개발호환을 위해 nls_characterset 을 맞추기로 하였다.

새로 설치하지 않고 바꾸는 법 입니다.

절차 SQL> SHUTDOWN IMMEDIATE;
<만일의 사태를 대비해 풀백업을 한다>
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET US7ASCII;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

ALTER DATABASE CHARACTER SET US7ASCII 변경할때

큰집합이여야 된다는(superset) 등의 에러메세지 떨어질 경우
update SYS.PROPS$ set value$='US7ASCII' where name='NLS_CHARACTERSET';
shutdown immediate;
startup;

클라이언트 nls_characterset 셋팅 :
regedit
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1
- NLS_LANG = AMERICAN_AMERICA.US7ASCII

[nls 환경보기]
--DB
SELECT * FROM nls_database_parameters
WHERE parameter='NLS_CHARACTERSET' OR parameter='NLS_LANGUAGE'

-- session
SELECT * FROM v$nls_parameters

===============================================================================================

위와 같이 설정후 OLD_ORA 데이타 덤프를 NEW_ORA 로 Import 시킨후 한글이 정상적으로 들어와 졌습니다.

그런데 SQLTools,토드 등으로 접속후 객체브라우져로 객체 리스트 보기에서 아래와 같은 에러가 발생하면서

ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-553: character set name is not recognized

객체리스트가 보이지 않았습니다.

원인) 아래 쿼리를 날렸을때 데이터 타입이 중복되어서 나옴

쿼리)

select distinct(nls_charset_name(charsetid)) CHARACTERSET,
decode(type#, 1, decode(charsetform, 1, 'VARCHAR2', 2, 'NVARCHAR2','UNKOWN'),
9, decode(charsetform, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
96, decode(charsetform, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
112, decode(charsetform, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
from sys.col$ where charsetform in (1,2) and type# in (1, 9, 96, 112)

order by types_used_in;

결과)

CHARACTERSET TYPES_USED_IN
------------------------------ -------------
KO16MSWIN949 CHAR
US7ASCII CHAR
KO16MSWIN949 CLOB
US7ASCII CLOB
AL16UTF16 NCHAR
AL16UTF16 NCLOB
AL16UTF16 NVARCHAR2
KO16MSWIN949 VARCHAR2
US7ASCII VARCHAR2

CHAR,CLOB,VARCHAR2 에 중복된 CHARACTERSET이 존재함.

위와 같은 경우 다음과 같이 조취합니다.

조치2) sysdba로 아래 구문들 실행

주의사항)

a) Make sure the parallel_server parameter in INIT.ORA is set to false or it is not set at all.
b) Run the next script in SQLPLUS connected "as sysdba"

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
SQL> COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
SQL> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
-- yes, 2 times startup/shutdown . This is not a typo
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

만약 실행중 다음과 같은 오류발생시 아래단계 실행

오류가 안난다면 하지 않아도 됩니다.

ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE KO16KSC5601
==> ORA-12714: invalid national character set specified

원인)

NATIONAL CHARACTER SET 은 Oracle9i 이후에는 UTF8과 AL16UTF16 만 제공
확인)

SELECT VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER in ('NLS_NCHAR_CHARACTERSET','NLS_CHARACTERSET')
결과)

PARAMETER VALUE
---------------------------------- ---------------
NLS_CHARACTERSET KO16KSC5601

NLS_NCHAR_CHARACTERSET KO16KSC5601

조치)

update sys.props$ set value$='AL16UTF16' where name='NLS_NCHAR_CHARACTERSET';

이후 위의 조치2)를 다시실행하면 아래와 같은 결과를 얻을수 있다..

문제해결)

CHARACTERSET TYPES_USED_IN
------------------------------ -------------
US7ASCII CHAR
US7ASCII CLOB
AL16UTF16 NCHAR
AL16UTF16 NCLOB
AL16UTF16 NVARCHAR2
US7ASCII VARCHAR2

이후 SQLTools 나 토드접속시 에러가 나지 않고 객체리스트가 정상적으로 나오게 됩니다.

Posted by redkite
, |
테이블에 걸려있는 제약 조건의 확인

  - USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.

  - USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있다.

SQL> SELECT SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,
            DECODE(B.CONSTRAINT_TYPE, 
                  'P','PRIMARY KEY',
                  'U','UNIQUE KEY',
                  'C','CHECK OR NOT NULL',
                  'R','FOREIGN KEY') CONSTRAINT_TYPE,
            A.CONSTRAINT_NAME CONSTRAINT_NAME
     FROM USER_CONS_COLUMNS A,  USER_CONSTRAINTS B   
     WHERE A.TABLE_NAME = UPPER('&table_name')   
       AND A.TABLE_NAME = B.TABLE_NAME   
       AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME   
     ORDER BY 1;   

-- 테이블 명을 입력 하면 된다. 
table_name의 값을 입력하십시오: emp2
 
 
테이블의 특정 컬럼에 걸려있는 제약 조건의 확인

USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.

 
SQL> SET LINESIZE 300

SQL> SELECT SUBSTR(TABLE_NAME,1,15) TABLE_NAMES,   
            SUBSTR(COLUMN_NAME,1,15) COLUMN_NAME,   
            SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME   
     FROM USER_CONS_COLUMNS   
     WHERE TABLE_NAME = UPPER('&table_name')   
       AND COLUMN_NAME = UPPER('&column_name');   

table_name의 값을 입력하십시오: emp2
column_name의 값을 입력하십시오: empno
Posted by redkite
, |

SELECT 'EXEC DBMS_UTILITY.compile_schema(schema => '||owner||');'

FROM   dba_objects

WHERE  status = 'INVALID'

ORDER BY owner, object_type, object_name

/



set heading off

set feedback off

set linesize 80


select 'alter view "' || object_name || '" compile;'

from user_objects

where object_type = 'VIEW'

and status = 'INVALID'

/


alter view "EMP_PUBLIC_DATA" compile;

alter view "VIEW_T" compile;

alter view "DEPT_EMP_VIEW" compile;

alter view "DEPARTMENT_10" compile;


set heading on

set feedback on


select 'show errors view ' || object_name

from user_objects

where object_type = 'VIEW'

and status = 'INVALID'

/


'SHOWERRORSVIEW'||OBJECT_NAME

--------------------------------------------------------------------------------

show errors view EMP_PUBLIC_DATA

show errors view VIEW_T

show errors view DEPT_EMP_VIEW

show errors view DEPARTMENT_10


4 rows selected.

Posted by redkite
, |

아카이브 로그 모드(Archive Log Mode)란?

  우리가 오라클데이터베이스에 접속을해서 DML이나 DDL등의 명령어로 작업을 수행하면, 모든 작업의 기록이 리두로그 파일에 저장이 된다.


  작업의 양이 많아지면 리두로그파일에 기록하는 내용도 굉장히 많아지게 되겠죠. 그렇게 되면 데이터를 기록하기 위해서 리두로그파일을 늘려야 하는 일이 발생을 한다.


  그런데 오라클 리두로그파일은 계속 증가하는 것이 아니라 몇 개의 리두로그 파일을 만들어 놓고 번갈아 가면서 기록하는 구조로 되어 있다.


  이렇게 번갈아 가면서 기록을 하게 되면 새로운작업의 내용이 예전의 작업내용을 덮어쓰므로 예전의 작업한 내용을 잃게 된다는 단점이 있다. 그래서 예전의 작업한 내용에 데이터 손실이 발생하면 복구하기 어렵다는 단점이 있다.


  이런 단점을 해결하기 위한 방법이 리두로그파일의 내용을 다른 디렉토리에 자동으로 복사해서 저장하도록 운영하는 방법이다. 이렇게 운영하는 방법을 아카이브 로그 모드(Archive Log Mode)라고 한다.


  오라클데이터베이스는 기본적으로 No Archive Log Mode 이고, Archive Log Mode로 운영하기 위해서는 따로 설정을 해주어야 한다.


PFILE을 수정하여 데이타베이스를 archivelog mode로 설정하기

  NO ARCHIVE LOG 상태의 데이터베이스를 ARCHIVE LOG 모드 상태로 변경하기 위해서는 다음과 같은 순서로 작업해야 한다.


1) INIT.ORA 파라미터 파일을 수정한다.

2) 데이터베이스 인스턴스를 종료(SHUTDOWN)한다.

3) 데이터베이스 인스턴스를 MOUNT한다.(OPEN하지 않습니다)

4) 데이터베이스를 ARCHIVE LOG 모드로 변경한다.

5) 데이터베이스 인스턴스를 OPEN한다.

1) INIT.ORA파일의 parameter 수정

  INIT.ORA 파일에서 아래 부분을 수정하고, 주석(#)을 제거하고 저장합니다.


 

# 아카이브 프로세스를 오라클 시작과 함께 실행하도록 설정

# log switch 발생시 자동으로 archive를 수행 합니다

LOG_ARCHIVE_START = TRUE

 

# 아카이브 로그 파일을 저장할 디렉토리 설정

LOG_ARCHIVE_DEST = "C:\oracle\ora92\database\archive"  

 

# 아카이브 로그 파일의 이름 설정

LOG_ARCHIVE_FORMAT = %S.ARC

    

  ※ LOG_ARCHIVE_FORMAT 옵션


  - %S : redo 로그 시퀀스 번호를 표시하여 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.


  - %s : redo 로그 시퀀스 번호를 표시하고, 파일 이름 길이를 일정하게 맞추지 않는다.


  - %T : redo 스레드 넘버를 표시하며, 자동으로 왼쪽이 0으로 채워져 파일 이름 길이를 일정하게 만든다.


  - %t : redo 스레드 넘버를 표시하며, 파일 이름 길이를 일정하게 맞추지 않는다.


2) 데이터베이스 인스턴스를 종료

 

-- SQLPLUS 실행

SQLPLUS /nolog

 

-- SYSDBA 권한으로 접속 합니다. 

SQL>CONN SYS/MANAGER AS SYSDBA

  

SQL> SHUTDOWN IMMEDIATE

데이터베이스가 닫혔습니다.

데이터베이스가 마운트 해제되었습니다.

ORACLE 인스턴스가 종료되었습니다.

    

3) 데이터베이스 인스턴스를 MOUNT

 

SQL> STARTUP MOUNT pfile=C:\oracle\ora92\database\INITORA9I.ORA

데이터베이스가 마운트되었습니다.

    

4) DATABASE를 ARCHIVE LOG MODE로 전환.

 

SQL> ALTER DATABASE ARCHIVELOG; 

데이타베이스가 변경되었습니다.

    

5) DATABASE OPEN

 

SQL> ALTER DATABASE OPEN; 

    

6) ARCHIVE LOG MODE가 정상적으로 설정되어 있는지 확인한다.

 

SQL> ARCHIVE LOG LIST

데이터베이스 로그 모드              아카이브 모드

자동 아카이브             사용

아카이브 대상            C:\oracle\ora92\database\archive

가장 오래된 온라인 로그 순서     16

아카이브할 다음 로그   18

현재 로그 순서           18

    

7) 강제로 로그 스위치를 발생시켜서 아카이브 로그 파일이 저장되는지 확인

  C:\oracle\ora92\database\archive 디렉토리에 파일이 생성되었는지 확인 한다.


 

SQL> ALTER SYSTEM SWITCH LOGFILE;

시스템이 변경되었습니다.     

    

ARCHIVELOG MODE에서 NO ARCHIVELOG MODE로 전환하기

  먼저, 위에서 setting 했던 INIT.ORA 파일에서 설정했던 부분을 (#)으로 주석처리 한다.


 

#LOG_ARCHIVE_START = TRUE

#LOG_ARCHIVE_DEST = "C:\oracle\ora92\database\archive"  

#LOG_ARCHIVE_FORMAT = %S.ARC


-- 데이터베이스 종료

SQL> SHUTDOWN IMMEDIATE

 

-- 데이터베이스 인스턴스를  mount 

SQL> STARTUP MOUNT pfile=C:\oracle\ora92\database\INITORA9I.ORA

 

-- 데이터베이스를  no archive log mode로 전환.

SQL> ALTER DATABASE NOARCHIVELOG;

 

--  database open

SQL> ALTER DATABASE OPEN; 

 

-- 아카이브 로그 모드 상태 확인

SQL> ARCHIVE LOG LIST 

데이터베이스 로그 모드              아카이브 모드가 아님

자동 아카이브             사용 안함

아카이브 대상            C:\oracle\ora92\RDBMS

가장 오래된 온라인 로그 순서     17

현재 로그 순서           19    

    

SPFILE(서버 파라미터 파일)을 수정하여 데이타베이스를 ARCHIVELOG MODE로 설정

  Oracle9i 이상의 경우 서버 파라미터 파일을 사용 할 경우 아래와 같은 과정을 거쳐서 아카이브 로그모드로 변경해야 한다.


 

1) 파라미터 설정

 

-- sqlplus 실행

SQLPLUS /nolog

 

-- SYSDBA 권한으로 접속 합니다. 

SQL> CONN / AS SYSDBA

 

-- LOG_ARCHIVE_START 파라미터 변경

SQL> ALTER SYSTEM SET 

     LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;

 

-- LOG_ARCHIVE_DEST 파라미터 변경

SQL> ALTER SYSTEM SET 

     LOG_ARCHIVE_DEST='C:\oracle\ora92\database\archive' 

     SCOPE=SPFILE;

 

-- LOG_ARCHIVE_FORMAT 파라미터 변경

SQL> ALTER SYSTEM SET 

     LOG_ARCHIVE_FORMAT='%S.ARC' SCOPE=SPFILE;

 

 

2) DB Shutdown 

SQL> SHUTDOWN IMMEDIATE

 

 

3) Mount 상태로 Startup

SQL> STARTUP MOUNT

 

 

4) 아카이브 로그 모드 활성화

SQL>ALTER DATABASE ARCHIVELOG;

 

 

5) 데이타베이스 오픈

SQL> ALTER DATABASE OPEN; 

 

 

6) 아카이브 로그 모드가 정상적으로 설정되어 있는지 확인한다.

SQL> ARCHIVE LOG LIST;

데이터베이스 로그 모드              아카이브 모드

자동 아카이브             사용

아카이브 대상            C:\oracle\ora92\database\archive

가장 오래된 온라인 로그 순서     17

아카이브할 다음 로그   19

현재 로그 순서           19    

    

SPFILE(서버 파라미터 파일)에서 NO ARCHIVE LOG모드로 전환하기

 

1) 자동 아카이브 모드를 false로 변경 한.

SQL> ALTER SYSTEM SET 

     LOG_ARCHIVE_START=FALSE SCOPE=SPFILE;

 

 

2)DB shutdown 

SQL> SHUTDOWN IMMEDIATE

 


3) mount 상태로 startup

SQL> STARTUP MOUNT

 


4) 데이터베이스를  no archive log mode로 전환.

SQL> ALTER DATABASE NOARCHIVELOG;

 

 

5) 데이타베이스 오픈

SQL> ALTER DATABASE OPEN; 

 

 

6) 아카이브 로그 모드 상태 확인

SQL> ARCHIVE LOG LIST;

데이터베이스 로그 모드              아카이브 모드가 아님

자동 아카이브             사용 안함

아카이브 대상            C:\oracle\ora92\database\archive

가장 오래된 온라인 로그 순서     17

현재 로그 순서           19    

    

10g에서는 

ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE, FALSE SCOPE=SPFILE; 

제외하고 archive mode or noarchive mode 로 설정하시면 됩니다. 

그렇지 않고 

ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE, FALSE를 실행한다면 아래와 같은 에러가 발생합니다. 

"ORA-32004: obsolete and/or deprecated parameter(s) specified"



SQL> archive log list 

Database log mode Archive Mode 

Automatic archival Enabled 

Archive destination /u02/oracle/DB/arch/arch 

Oldest online log sequence 4 

Next log sequence to archive 6 

Current log sequence 6 

SQL> show parameters log_archive_dest_1 


NAME TYPE VALUE 

------------------------------------ --------------------------------- ------------------------------ 

log_archive_dest_1 string LOCATION=/u02/oracle/DB/arch/a 

rch MANDATORY REOPEN 

log_archive_dest_10 string 

SQL> alter system set log_archive_dest_1='LOCATION=/u02/oracle/DB/arch2/arch MANDATORY REOPEN' scope=both ; 


System altered. 


SQL> !ls -lrt /u02/oracle/DB/arch2/ 

total 0 


SQL> alter system switch logfile ; 


System altered. 


SQL> !ls -lrt /u02/oracle/DB/arch2/ 

total 17356 

-rw-r----- 1 oracle oinstall 17746432 Dec 20 11:16 archTLO_1_6_735939596.dbf 

Posted by redkite
, |

오라클에서 현재 사용하는 데이터 베이스에서

프로시저, 함수, USER_SOURCE 뷰를 보기 입니다.


SELECT * FROM USER_SOURCE;


LINE

NAME

TEXT

TYPE

소스 라인의 라인번호

객체의 이름

원본 텍스트

객체의 유형


TYPE : "TYPE", "TYPE BODY", "PROCEDURE", "FUNCTION", "PACKAGE", "PACKAGE BODY" or "JAVA SOURCE"

Posted by redkite
, |

Recompiling Invalid Schema Objects


Operations such as upgrades, patches and DDL changes can invalidate schema objects. Provided these changes don't cause compilation failures the objects will be revalidated by on-demand automatic recompilation, but this can take an unacceptable time to complete, especially where complex dependencies are present. For this reason it makes sense to recompile invalid objects in advance of user calls. It also allows you to identify if any changes have broken your code base. This article presents several methods for recompiling invalid schema objects.


Identifying Invalid Objects

The Manual Approach

Custom Script

DBMS_UTILITY.compile_schema

UTL_RECOMP

utlrp.sql and utlprp.sql

Identifying Invalid Objects


The DBA_OBJECTS view can be used to identify invalid objects using the following query.


COLUMN object_name FORMAT A30

SELECT owner,

       object_type,

       object_name,

       status

FROM   dba_objects

WHERE  status = 'INVALID'

ORDER BY owner, object_type, object_name;

With this information you can decide which of the following recompilation methods is suitable for you.


The Manual Approach


For small numbers of objects you may decide that a manual recompilation is sufficient. The following example shows the compile syntax for several object types.


ALTER PACKAGE my_package COMPILE;

ALTER PACKAGE my_package COMPILE BODY;

ALTER PROCEDURE my_procedure COMPILE;

ALTER FUNCTION my_function COMPILE;

ALTER TRIGGER my_trigger COMPILE;

ALTER VIEW my_view COMPILE;

Notice that the package body is compiled in the same way as the package specification, with the addition of the word "BODY" at the end of the command.


An alternative approach is to use the DBMS_DDL package to perform the recompilations.


EXEC DBMS_DDL.alter_compile('PACKAGE', 'MY_SCHEMA', 'MY_PACKAGE');

EXEC DBMS_DDL.alter_compile('PACKAGE BODY', 'MY_SCHEMA', 'MY_PACKAGE');

EXEC DBMS_DDL.alter_compile('PROCEDURE', 'MY_SCHEMA', 'MY_PROCEDURE');

EXEC DBMS_DDL.alter_compile('FUNCTION', 'MY_SCHEMA', 'MY_FUNCTION');

EXEC DBMS_DDL.alter_compile('TRIGGER', 'MY_SCHEMA', 'MY_TRIGGER');

This method is limited to PL/SQL objects, so it is not applicable for views.


Custom Script


In some situations you may have to compile many invalid objects in one go. One approach is to write a custom script to identify and compile the invalid objects. The following example identifies and recompiles invalid packages and package bodies.


SET SERVEROUTPUT ON SIZE 1000000

BEGIN

  FOR cur_rec IN (SELECT owner,

                         object_name,

                         object_type,

                         DECODE(object_type, 'PACKAGE', 1,

                                             'PACKAGE BODY', 2, 2) AS recompile_order

                  FROM   dba_objects

                  WHERE  object_type IN ('PACKAGE', 'PACKAGE BODY')

                  AND    status != 'VALID'

                  ORDER BY 4)

  LOOP

    BEGIN

      IF cur_rec.object_type = 'PACKAGE' THEN

        EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || 

            ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE';

      ElSE

        EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || 

            '"."' || cur_rec.object_name || '" COMPILE BODY';

      END IF;

    EXCEPTION

      WHEN OTHERS THEN

        DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || 

                             ' : ' || cur_rec.object_name);

    END;

  END LOOP;

END;

/

This approach is fine if you have a specific task in mind, but be aware that you may end up compiling some objects multiple times depending on the order they are compiled in. It is probably a better idea to use one of the methods provided by Oracle since they take the code dependencies into account.


DBMS_UTILITY.compile_schema


The COMPILE_SCHEMA procedure in the DBMS_UTILITY package compiles all procedures, functions, packages, and triggers in the specified schema. The example below shows how it is called from SQL*Plus.


EXEC DBMS_UTILITY.compile_schema(schema => 'SCOTT');

UTL_RECOMP


The UTL_RECOMP package contains two procedures used to recompile invalid objects. As the names suggest, the RECOMP_SERIAL procedure recompiles all the invalid objects one at a time, while the RECOMP_PARALLEL procedure performs the same task in parallel using the specified number of threads. Their definitions are listed below.


 PROCEDURE RECOMP_SERIAL(

   schema   IN   VARCHAR2    DEFAULT NULL,

   flags    IN   PLS_INTEGER DEFAULT 0);


PROCEDURE RECOMP_PARALLEL(

   threads  IN   PLS_INTEGER DEFAULT NULL,

   schema   IN   VARCHAR2    DEFAULT NULL,

   flags    IN   PLS_INTEGER DEFAULT 0);

The usage notes for the parameters are listed below.


schema - The schema whose invalid objects are to be recompiled. If NULL all invalid objects in the database are recompiled.

threads - The number of threads used in a parallel operation. If NULL the value of the "job_queue_processes" parameter is used. Matching the number of available CPUs is generally a good starting point for this value.

flags - Used for internal diagnostics and testing only.

The following examples show how these procedures are used.


-- Schema level.

EXEC UTL_RECOMP.recomp_serial('SCOTT');

EXEC UTL_RECOMP.recomp_parallel(4, 'SCOTT');


-- Database level.

EXEC UTL_RECOMP.recomp_serial();

EXEC UTL_RECOMP.recomp_parallel(4);


-- Using job_queue_processes value.

EXEC UTL_RECOMP.recomp_parallel();

EXEC UTL_RECOMP.recomp_parallel(NULL, 'SCOTT');

There are a number of restrictions associated with the use of this package including:


Parallel execution is perfomed using the job queue. All existing jobs are marked as disabled until the operation is complete.

The package must be run from SQL*Plus as the SYS user, or another user with SYSDBA.

The package expects the STANDARD, DBMS_STANDARD, DBMS_JOB and DBMS_RANDOM to be present and valid.

Runnig DDL operations at the same time as this package may result in deadlocks.

utlrp.sql and utlprp.sql


The utlrp.sql and utlprp.sql scripts are provided by Oracle to recompile all invalid objects in the database. They are typically run after major database changes such as upgrades or patches. They are located in the $ORACLE_HOME/rdbms/admin directory and provide a wrapper on the UTL_RECOMP package. The utlrp.sql script simply calls the utlprp.sql script with a command line parameter of "0". The utlprp.sql accepts a single integer parameter that indicates the level of parallelism as follows.


0 - The level of parallelism is derived based on the CPU_COUNT parameter.

1 - The recompilation is run serially, one object at a time.

N - The recompilation is run in parallel with "N" number of threads.

Both scripts must be run as the SYS user, or another user with SYSDBA, to work correctly.


For more information see:


DBMS_UTILITY.compile_schema

UTL_RECOMP


Posted by redkite
, |

1. SQL> Shutdown immediate

2. $ cp /oracle/maxprd1/system01.dbf to /oracle/maxprd1/maxlive/system01.dbf

3. SQL> startup mount

4. SQL> alter database rename file '/oracle/maxprd1/system01.dbf' to '/oracle/maxprd1/maxlive/system01.dbf';

5. SQL> alter database open.

6. $ rm /oracle/maxprd1/system01.dbf

'01.오라클 > 002.DB 마이그레이션' 카테고리의 다른 글

[오라클]MySQL Vs. Oracle  (0) 2013.04.19
[오라클]Characterset 변경  (0) 2013.02.20
[오라클]Full export / import  (0) 2013.02.20
[오라클]Undo Tablespace 변경  (0) 2012.12.19
[오라클]Voting Disk 이관  (0) 2012.12.19
Posted by redkite
, |

### SK DB 보안 점검

select * from dba_sys_privs where GRANTEE ='APEX_030200' AND ADMIN_OPTION='YES' order by 2

SQL> desc user_role_privs;

 Name                  Type              Description

 USERNAME                    VARCHAR2(30) --Name of the user to whom the role has been granted.

 GRANTED_ROLE                VARCHAR2(30) --Name of the role granted to the user.

 ADMIN_OPTION                VARCHAR2(3)  --Whether the user is able to grant the role to another user or role. Equal to YES or NO.

 DEFAULT_ROLE                VARCHAR2(3)  --Whether the role is enabled by default when the user connects to the database. Equal to YES or NO.

 OS_GRANTED                  VARCHAR2(3)  --Whether the role was granted by the operating system.


SELECT * FROM user_role_privs;



Privilege(권한)


Session/System Control Language(SCL)에 관한 자세한 내용은 이곳을 클릭한다.
권한이란 SQL 문을 실행하거나, 데이터베이스나 데이터베이스의 객체에 접근할 수 있는 권한을 의미한다.

이처럼 권한은
1) DBA가 사용자에게 직접 부여 할 수도 있고
2) ROLE을 생성하여 롤에 권한을 부여한 뒤 그 롤을 사용자에게 부여하는 것처럼 간접적으로 부여 하는 방법도 있다.

권한 또는 롤을 부여 받은 사용자는 데이터베이스에서 데이터 조작이 가능하게 된다.

즉, 사용자는 권한을 받아야만 DB에 access(접근), create(생성), select(검색), insert(삽입)등의 작업을 할 수 있다.

권한은 system privilege와 object privilege로 구분되며, 사용자는 DB에 접근하기 위해 시스템 권한이 필요하고, 데이터베이스의 객체를 조작하기 위해 객체 권한이 필요하게 된다.

즉, 시스템 권한은 데이터베이스 안의 모든 테이블을 검색할 수 있는 권한이며,
객체 권한은 사용자에게 하나의 특정 테이블만을 검색할 수 있게 하는 권한이다.

권한의 종류

권한의 종류
설명

시스템 권한(SYSTEM privilege)
데이터베이스 객체를 생성, 수정, 삭제 권한

객체 권한(OBJECT privilege)
object 내용을 조작(추가, 변경, 삭제, 검색)할 수 있는 권한

시스템(system) 권한

• 시스템 권한은 특정 DB 연산 또는 작업을 수행하기 위하여 필요한 권한이다.
• 이러한 작업에는 테이블, 뷰, undo segment, 프로시져의 생성, 삭제, 수정등이 있다.
• 시스템 권한은 주로 DBA가 부여한다.
• system_privilege_map 뷰를 통해 전체 시스템 권한을 확인할 수 있다.

SQL> desc system_privilege_map;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PRIVILEGE                                 NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(40)
 PROPERTY                                  NOT NULL NUMBER
 
SQL> select count(*) from system_privilege_map;
 
  COUNT(*)
----------
       206
 
SQL>

• 다음은 시스템 권한 중에서 몇개에 대해서 설명한다.


시스템 권한
설명


CREATE SESSION
DB에 연결할수 있는 권한


RESTRICTED SESSION
DB를 startup restricted로 시작할 수 있는 권한


CREATE TABLE
user소유 schema 안에서 table 또는 index를 생성할 수 있는 권한


SELECT ANY TABLE
어떤 schema에서나 모든 table, view 또는
snap shot에 대한 검색을 실행할 수 있는 권한


ALTER SYSTEM
alter system 명령을 사용하여 system 정의를 변경할 수 있는 권한


CREATE ROLE
오라클 DATABASE ROLE을 생성할 수 있는 권한


INSERT ANY TABLE
어떤 schema에서나 모든 table, view에 데이터를 입력할 수 있는 권한


DROP USER
생성한 user를 삭제시킬 수 있는 권한


CREATE USER
create user를 이용하여 user를 생성할 수 있는 권한


ALTER USER
alter user를 이용하여 생성한 user의 정의를 변경할 수 있는 권한

• create table 권한에 create index와 analyze 명령을 사용할 수 있는 권한이 포함되어 있기 때문에 index 생성과 관련한 시스템 권한이 없다.
시스템 권한 부여
다음 문자 형식을 이용하여 system privilege와 role을 부여한다.
【형식】 
     GRANT 시스템권한명 또는 롤명 TO 사용자명 또는 롤명 또는 PUBLIC
        [WITH ADMIN OPTION];
• system 권한은 주로 DBA가 다른 user가 부여한다.
GRANT 문으로 권한을 지정한다.
• TO 뒤에 권한을 받을 user를 지정한다.
• WITH ADMIN OPTION은 해당 시스템 권한을 다른 사용자나 롤에 재부여를 허용
• PUBLIC은 모든 사용자에게 권한을 주기 위한 것으로 권한을 주는 쪽은 신중해야 한다. PUBLIC으로 선언된 권한은 이 후에 새로 생성된 사용자에게도 자동으로 해당 권한이 부여되기 때문이다.
• 시스템 권한은 DB 정의를 변경할 수 있기 때문에 권한을 받은 쪽의 통제가 요구된다.
【예제】
SQL> connect / as sysdba

SQL> create user kim  ☜ 새로운 user인 kim을 만듬
  2  identified by kun114$;
 
User created.
 
SQL> GRANT CREATE table, CREATE view TO jijoe;  ☜ jijoe에게 권한을 부여함
 
Grant succeeded.
 
SQL> connect jijoe/password
Connected.
SQL> select * from USER_sys_privs; ☜ ADMIN 권한을 받았는지 확인하는 뷰
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
JIJOE                          CREATE VIEW                              NO
JIJOE                          CREATE TABLE                             NO
JIJOE                          CREATE SESSION                           NO
JIJOE                          UNLIMITED TABLESPACE                     NO
 ☜  ADM 필드가 NO이면 ADMIN 권항이 부여 되지 않았음을 나타냄 

SQL> GRANT CREATE table, CREATE view TO kim;  ☜ ADMIN 권한이 없는 상태에서 kim에게 권한을 주려고 함
GRANT CREATE table, CREATE view TO kim
*
ERROR at line 1:
ORA-01031: insufficient privileges   ☜ 권한이 없다고 알려 줌
 
 
SQL> conn system/password as sysdba
Connected.
SQL> grant create table, create view TO jijoe  
  2  WITH ADMIN OPTION;    ☜  ADMIN 옵션으로 table,view를 만들 수 있는 권한을 jijoe에게 줌
 
Grant succeeded.
 
SQL> conn jijoe/password
Connected.
SQL> select * from user_sys_privs; ☜ ADMIN 권한을 받았는지 확인하는 뷰
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
JIJOE                          CREATE VIEW                              YES
JIJOE                          CREATE TABLE                             YES
JIJOE                          CREATE SESSION                           NO
JIJOE                          UNLIMITED TABLESPACE                     NO
 ☜  ADM 필드가 YES이면 ADMIN 권한이 부여 되었음을 나타냄 

SQL> GRANT CREATE table, CREATE view TO kim; 
    ☜ ADMIN 권한을 부여 받은 jijoe가 사용자 kim에게 권한을 부여할 수 있음
 
Grant succeeded.
 
SQL> 

다음 예제는 DBA가 모든 user에게 새로운 user 생성 권한을 예이다.(절대 권장하지 않음)

【예제】
SQL> connect system/password as sysdba
Connected.
SQL> CREATE USER kim2 identified by kim2##;
 
User created.
 
SQL> GRANT create session TO kim2;
 
Grant succeeded.
 
SQL> GRANT create USER TO PUBLIC;
 
Grant succeeded.
 
SQL> connect kim2/kim2##;
Connected.
SQL> SELECT * FROM USER_SYS_PRIVS;
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
KIM2                           CREATE SESSION                           NO
PUBLIC                         CREATE USER                              NO
 
SQL> create user kim3 IDENTIFIED BY kim3###;
 
User created.
 
SQL> conn kim3/kim3###;
ERROR:
ORA-01045: user KIM3 lacks CREATE SESSION privilege; logon denied
 
 
Warning: You are no longer connected to ORACLE.

SQL> conn system/password as sysdba

SQL> GRANT connect TO kim3;
 
Grant succeeded.
 
SQL> conn kim3/kim3###;
Connected.
SQL> select * from user_sys_privs;
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
PUBLIC                         CREATE USER                              NO
 
SQL>
PUBLIC을 사용하여 CREATE USER라는 시스템 권한을 주었을 때 모든 user들이 그 권한을 부여 받게 된다. 따라서 어떠한 user로 접속해도 새로운 user를 생성할 수 있게 된다.
그러나, kim2가 CREATE USER 권한은 부여 받지 않았음을 알 수 있다.

DBA_sys_PRIVS
롤이나 사용자에게 부여된 모든 시스템 권한을 조회

session_PRIVS
Session Level의 시스템 권한을 확인

SYSTEM_PRIVILEGE_MAP
전체 시스템 권한을 확인


시스템 권한 회수
REVOKE 명령을 사용하여 부여된 시스템 권한을 회수하는 문장의 형식은 다음과 같다.
【형식】
	REVOKE 시스템권한명, 롤명 FROM 사용자명, 롤명, PUBLIC
【예제】
SQL> connect kim3/kim3###
Connected.
SQL> select * from user_sys_privs;
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
PUBLIC                         CREATE USER                              NO
 
SQL> connect kim2/kim2##
Connected.
SQL> select  * from user_sys_privs;
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
KIM2                           CREATE SESSION                           NO
PUBLIC                         CREATE USER                              NO
 
SQL> conn system/password as sysdba
Connected.
SQL> REVOKE CREATE user FROM PUBLIC;
 
Revoke succeeded.
 
SQL> conn  kim2/kim2##
Connected.
SQL> select  * from user_sys_privs;
 
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
KIM2                           CREATE SESSION                           NO
 
SQL> conn kim3/kim3###
Connected.
SQL> select  * from user_sys_privs;
 
no rows selected
 
SQL> 

SQL> conn jijoe/password Connected. SQL> select * from user_sys_privs; USERNAME PRIVILEGE ADM ------------------------------ ---------------------------------------- --- JIJOE CREATE VIEW YES JIJOE CREATE TABLE YES JIJOE CREATE SESSION NO JIJOE UNLIMITED TABLESPACE NO SQL> conn system/password as sysdba Connected. SQL> REVOKE CREATE TABLE,CREATE VIEW FROM jijoe; Revoke succeeded. SQL> conn jijoe/password Connected. SQL> select * from user_sys_privs; USERNAME PRIVILEGE ADM ------------------------------ ---------------------------------------- --- JIJOE CREATE SESSION NO JIJOE UNLIMITED TABLESPACE NO SQL>
• 만약 여러개의 권한을 부여했다면, REVOKE로 선택적으로 회수할 수 있다.
• Role에 여러 권한을 부여 했다면, REVOKE ROLE을 수행할 때, 특정 권한만 따로 회수 할 수 없다.
• 시스템 권한을 회수하면 일부 종속된 객체에 영향을 줄 수 있다. 예를 들어, A가 B로부터 table select 권한을 부여 받은 상태에서, A가 B의 table을 select해서 view를 생성하였는데, B가 A의 권한을 회수하면, A는 더이상 그 view를 사용할 수 없게 된다.
• WITH ADMIN OPTION의 사용 여부와 상관없이 시스템 권한이 회수 될 때는 제3자의 권한도 함께 회수되지 않는다. 예를 들어, A가 권한을 회수할 때 B의 권한만 회수하지 C의 권한은 회수하지는 않는다. C는 여전히 그 권한을 갖고 있게 된다.

객체(object) 권한

• Object privilege란 특정한 table view, sequence, procedure, function, package등에 대한 특정한 작업을 수행하는 권한이다. 예를 들어, 사용자 kim의 PERSONNEL table을 SELECT 할 수 있도록 하거나 SYSTEM user의 TEST procedure를 실행할 수 있는 권한처럼 특정 object에 대한 권한을 뜻한다.
• 객체에 대해 권한 부여 및 회수 방법은 SYSTEM 권한과 유사하며, 다만 대상 객체를 명시한다는 점이 다르다.
• 객체에 대한 소유자는 객체에 대한 모든 권한을 가진다.
• 객체 권한을 부여하기 위해서는 객체의 소유자이거나, WITH ADMIN OPTION으로 권한을 부여 받아야 한다.
• 객체 소유자는 객체에 대한 특정한 권한을 제공할 수 있다.

객체 권한의 종류와 범위

TABLE 권한
VIEW 권한
SEQUENCE 권한
PROCEDURE 권한
SNAPSHOT 권한

INSERT
0
0

UPDATE
0
0

DELETE
0
0

ALTER
0
0
0
0

INDEX
0
0

SELECT
0
0
0
0

EXECUTE
0

REFERENCES
0

다음은 각각의 권한이 행할 수 있는 기능이다.

alter
권한을 받은 사용자가 변경할 수 있도록 허용

audit
권한을 받은 사용자가 감사를 할 수 있도록 허용

comment
권한을 받은 사용자가 주석을 달 수 있도록 허용

delete
권한을 받은 사용자가 삭제할 수 있도록 허용

grant
권한을 받은 사용자가 부여할 수 있도록 허용

index
권한을 받은 사용자가 table에 대해 인덱스를 생성할 수 있도록 허용

insert
권한을 받은 사용자가 삽입할 수 있도록 허용

lock
권한을 받은 사용자가 locking할 수 있도록 허용

rename
권한을 받은 사용자가 이름을 변경할 수 있도록 허용

select
권한을 받은 사용자가 조회할 수 있도록 허용

update
권한을 받은 사용자가 갱신할 수 있도록 허용

references
권한을 받은 사용자가 자료를 참조할 수 있도록 허용

execute
권한을 받은 사용자가 procedure,function,package에 대해 실행할 수 있도록 허용


객체 권한 부여(GRANT)
【형식】
	GRANT 객체권한, ALL[컬럼명,...]
	ON 대상객체
	TO 사용자명, 롤명, PUBLIC
	WITH GRANT OPTION;
• 권한을 부여하려면, 객체가 자신의 schema에 있거나 WITH GRANT OPTION권한을 갖고 있어야 한다.
• 객체의 소유자는 DB내의 어떤 사용자나 role에게도 해당 객체에 대한 어떤 것이라도 부여할 수 있다.
• SYSTEM 권한과 마찬가지로 객체 권한의 GRANT도 ON절을 사용하여 대상객체를 명시한다는 점만 다르다.
• GRANT절 뒤에는 권한을 일일이 나열하는 대신에 ALL이라는 keyword를 사용하여 ON 뒤에 나오는 객체에 대해서 모든 객체권한을 다 부여할 수 있다.
• GRANT시 객체권한을 table 전체가 아닌 특정 컬럼에 대해 지정이 가능하다.
예를 들어, 사용자 KIM의 AA table에 대해 INSERT 권한을 줄때 PNAME과 PNO에 대해서만 INSERT 권한을 부여할 수 있다. 그러나,이는 INSERT,UPDATE,REFERENCES권한에 대해서만 가능하다.
• 다른 사용자에 대해 권한을 부여하려면, schema.객체명 형식을 사용한다.
【예제】
SQL> connect system/password as sysdba
SQL> create user kim identified by gun;
SQL> grant connect,resource to kim;
SQL> create user kim2 identified by gun2;
SQL> grant connect,resource to kim2;
SQL> conn kim/gun
SQL> create table aa(pno number(3),pname varchar2(10));
SQL> insert into aa values(111,'COREA');
SQL> insert into aa values(222,'CHINA');
SQL> select * from aa;
 
       PNO PNAME
---------- ----------
       111 COREA
       222 CHINA
 
SQL> select * from user_tab_privs;
 
no rows selected
 
SQL> select * from user_tab_privs_recd;
 
no rows selected
 
SQL> grant select ON aa TO kim2; ☜ aa 객체에 대한 권한을 kim2에게 부여함
 
Grant succeeded.
 
SQL> conn kim2/gun2;
SQL> select * from user_tab_privs; ☜ 사용자에게 주어진 객체권한 조회
 
GRANTEE OWNER   TABLE_NAME  GRANTOR  PRIVILEGE   GRA HIE
------- ------- ----------- -------- ----------- --- ---
KIM2    KIM     AA          KIM      SELECT      NO  NO
 
SQL> select * from user_tab_privs_recd; ☜ 부여받은 객체 권한 정보를 조회
 
OWNER      TABLE_NAME   GRANTOR   PRIVILEGE   GRA HIE
---------- ------------ --------- ----------- --- ---
KIM        AA           KIM       SELECT      NO  NO
 
SQL> select * from kim.aa; ☜ kim.aa 객체를 kim2가 조회할 수 있음
 
       PNO PNAME
---------- ----------
       111 COREA
       222 CHINA

SQL> conn kim/gun Connected. SQL> SQL> grant insert(pno,pname),select ON aa 2 TO kim2; ☜ kim.aa객체에 kim2사용자에게 insert와 select 권한을 부여함 Grant succeeded. SQL> conn kim2/gun2 Connected. SQL> select * from kim.aa; PNO PNAME ---------- ---------- 111 COREA 222 CHINA SQL> insert into kim.aa values(333,'JAPAN'); ☜ kim2가 kim.aa 객체에 insert를 실행함 1 row created. SQL> select * from kim.aa; PNO PNAME ---------- ---------- 111 COREA 222 CHINA 333 JAPAN SQL> conn kim/gun Connected. SQL> select * from aa; PNO PNAME ---------- ---------- 111 COREA 222 CHINA 333 JAPAN SQL> conn kim2/gun2; Connected. SQL> select * from user_tab_privs; GRANTEE OWNER TABLE GRANT PRIVILEGE GRA HIE -------- ----- ----- ----- ---------- --- --- KIM2 KIM AA KIM SELECT NO NO SQL> select * from user_tab_privs_recd; OWNER TABLE GRANT PRIVILEGE GRA HIE ----- ----- ----- ---------- --- --- KIM AA KIM SELECT NO NO SQL>

객체 권한 회수(REVOKE)
【형식】
	REVOKE 객체권한명
	ON 객체명
	FROM 사용자명, 롤명, PUBLIC
	[CASCADE CONSTRAINTS;
• REVOKE 명령을 사용하여 객체권한을 회수한다.
• 권한 부여자는 자신이 권한을 부여했던 사용자에게만 권한을 회수할 수 있다.
• PUBLIC으로 부여된 객체권한은 SYSTEM 권한과 달리 각각 회수할 수도 있다.
• CASCADE CONSTRAINTS 옵션은 REFERENCES권한을 회수할 때 사용한다.
여기서 references권한이란 어느 table에 대해서 foreign key를 생성할 수 있는 권한을 의미한다. 만약 이 권한을 다른 사용자에게 주었다가 다시 회수하면 그 권한을 이용해 만든 foreign key에 문제가 발생할 수 있다. 그래서 references권한을 회수해 오면서 그 권한과 관련된참조무결성제약을 함께 삭제하기 위하여 CASCADE CONSTRAINTS 옵션을 사용한다.
【예제】
SQL>  conn kim/gun
Connected.
SQL> select * from user_tab_privs;  ☜ kim사용자가 부여한 객체 내용을 확인함
 
GRANTEE  OWNER TABLE GRANT PRIVILEGE  GRA HIE
-------- ----- ----- ----- ---------- --- ---
KIM2     KIM   AA    KIM   SELECT     NO  NO
 
SQL> select * from user_tab_privs_recd;  ☜ kim이 받은 객체를 확인함
 
no rows selected
 
SQL> REVOKE select ON aa
  2  FROM kim2;   ☜ kim2에게 부여된 aa객체의 select 권한을 회수함
 
Revoke succeeded.
 
SQL> select * from user_tab_privs;  ☜ kim이 어떤 객체도 권한부여한 것이 없음(아직도 insert(pno,pname) 객체 권한은 남아 있음)
 
no rows selected
 
SQL> conn kim2/gun2
Connected.
SQL> insert into kim.aa values(444,'Honkong');  ☜ kim이 kim2에게 aa객체에 insert권한은 부여되어 있음
 
1 row created.
 
SQL> select * from kim.aa;    ☜ kim이 kim2로부터 aa객체의 select 권한이 회수된 상태임
select * from kim.aa
                  *
ERROR at line 1:
ORA-01031: insufficient privileges
 
 
SQL> conn kim/gun
Connected.
SQL> select * from aa;  ☜ kim2가 kim의 aa객체에 insert 객체 권한이 부여된 상태임을 알 수 있음
 
       PNO PNAME
---------- ----------
       111 COREA
       222 CHINA
       333 JAPAN
       444 Honkong
 
SQL> select * from user_col_privs;  ☜ 객체의 컬럼 권한을 확인함 
 
GRANTEE  OWNER TABLE COLUMN_NAME                    GRANT PRIVILEGE  GRA
-------- ----- ----- ------------------------------ ----- ---------- ---
KIM2     KIM   AA    PNAME                          KIM   INSERT     NO
KIM2     KIM   AA    PNO                            KIM   INSERT     NO
 
SQL> conn kim2/gun2 
Connected.
SQL> select * from user_col_privs;
 
GRANTEE  OWNER TABLE COLUMN_NAME                    GRANT PRIVILEGE  GRA
-------- ----- ----- ------------------------------ ----- ---------- ---
KIM2     KIM   AA    PNAME                          KIM   INSERT     NO
KIM2     KIM   AA    PNO                            KIM   INSERT     NO
 
SQL> 

객체 권한 조회

데이터베이스 내의 모든 개체 권한을 보여주는 DBA_TAB_PRIVS와 컬럼에 지정된 모든 개체 권한은 DBA_COL_PRIVS에 표시된다.

모든 사용자를 위한 객체 권한 뷰


data dictionary view
설명


ALL_TAB_PRIVS
사용자 또는 public으로 부여된 객체 권한 뷰


ALL_TAB_PRIVS_MADE
각 사용자 권한과 사용자 소유의 객체 권한 뷰


ALL_TAB_PRIVS_RECD
사용자 또는 public으로 주어진 객체에 대한 객체 권한 뷰


TABLE_PRIVILEGES
객체 권한 소유자, 부여자, 피부여자이거나 public으로 부여된 객체 권한 뷰


ALL_COL_PRIVS
사용자 또는 public으로 부여된 컬럼 객체 권한 뷰


ALL_COL_PRIVS_MADE
각 사용자 권한과 사용자 소유의 컬럼 객체 권한 뷰


ALL_COL_PRIVS_RECD
사용자 또는 public으로 주어진 객체에 대한 컬럼 객체 권한 뷰


COLUMN_PRIVILEGES
객체 권한 소유자, 부여자, 피부여자이거나 public으로 부여된 컬럼 객체 권한 뷰

일반 사용자 객체 권한 뷰


data dictionary view
설명


USER_TAB_PRIVS
객체 권한 소유자, 부여자, 피부여자의 객체 권한 뷰


USER_TAB_PRIVS_MADE
사용자가 소유자인 객체 권한 뷰


USER_TAB_PRIVS_RECD
객체 권한 피부여자를 위한 뷰


USER_COL_PRIVS
객체 권한 소유자, 부여자,피부여자의 컬럼에 권한 뷰


USER_COL_PRIVS_MADE
사용자가 소유한 컬럼에 권한 뷰


USER_COL_PRIVS_RECD
객체 권한 피부여자를 위한 컬럼의 뷰


Posted by redkite
, |

오라클 COMMAND 창에서 

sql> show parameter undo; 

를 쳐보면 

undo_management 
undo_retention 
undo_tablespace 의 속성들에 대한 정보가 나오게 된다. 

그 중 undo_retention 은 delete, update 후에 ROLLBACK이 아닌 COMMIT을 하였을때 부터 

속성값의 초 까지는 오라클에서 임시로 저장을 하게끔 되어있다. 

DEFAULT 속성값은 '900' 으로 900/60초 = 15분 

COMMIT 후 15분 안에는 데이터를 복구 할 수 있게 된다. 

그 시간을 늘리거나 줄이려면 

'alter system set undo_retention = 1500 ; '          --1500초(25분) 

이렇게 늘릴수가 있다. 

지금까지는 복구를 위한 셋팅 방법이었으며, 이제는 복구 방법을 알아보자. 

복구를 하는 방법은 

DELETE FROM TEST WHERE USER_ID = 'ITDI'; 

COMMIT; 

위와 같은 방법으로 USER_ID = 'ITDI' 의 데이터를 TEST 테이블에서 삭제를 하고 COMMIT을 하였을 경우, 

SELECT * 
  FROM TEST 
 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '15' MINUTE) 
WHERE USER_ID = 'ITDI' ; 

이렇게 하면 삭제를 한지 15분안의 데이터를 찾아서 조회를 할수 있다. 

복구하는 방법은 CTAS를 써서 임시테이블에 넣어서 차차 복구를 하여도 되고 

다이렉트로 

INSERT INTO TEST 
SELECT * 
  FROM TEST 
 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '15' MINUTE) 
WHERE USER_ID = 'ITDI' ; 

이렇게 처리를 하여도 된다. 

일단 서버를 셋팅을 하게되고 중요한 운영DB일 경우에는 이와같은 방법으로 

데이타의 삭제를 예방할 수 있다. 

DMP 백업이나 ARCHIVE 백업등의 처리 또한 백업의 종류이기는 하나, 

위와 같은 방법이 백업복구의 대처 능력이 다른 복구작업보다 더 좋다고 생각한다.

Posted by redkite
, |

As the listener.log file grows, the DBA will want to either remove or rename this log file. If you have ever tried to remove or rename the listener.log file on Windows while the TNS listener process was running you will quickly notice that Windows holds a lock on this file and returns an error: 

C:\> del C:\oracle\ora92\network\log\listener.log 
C:\oracle\ora92\network\log\listener.log 
The process cannot access the file because it is being used by another process.Most DBAs simply stop the TNS listener process, rename (or remove) the file, then restart the TNS listener process. This can, however, cause potention connection errors for users that are attempting to connect while the listener process is down. 
Even under UNIX, problems exist when attempting to rename the listener.log file while the TNS listener process is running. Just like under Windows, the Oracle TNS listener process holds an open handle to the file. Under UNIX, you CAN remove the file, but Oracle will not re-create the file when it attempts to write to it again. The TNS listener will need to be stopped and restarted in order for it to create the new listener.log file. 

Well, here is a solution for renaming (or removing) the listener.log file without having to stop and start the TNS listener process under either Windows or UNIX: 


Windows 
C:\> cd \oracle\ora92\network\log 
C:\oracle\ora92\network\log> lsnrctl set log_status off 
C:\oracle\ora92\network\log> rename listener.log listener.old 
C:\oracle\ora92\network\log> lsnrctl set log_status on 



UNIX 
% cd /u01/app/oracle/product/9.2.0/network/log 
% lsnrctl set log_status off 
% mv listener.log listener.old 
% lsnrctl set log_status on

Posted by redkite
, |

한 데이터베이스에서 네트워크상의 다른 데이터베이스에 접속하기 위한 설정을 해주는 오라클 객체 입니다. 
DB Link 설정을 하면 한 DB에서 다른 DB의 내용을 볼 수 있게 되는 것이죠. 

쉽게 말하자면 'A' DB에서 'B' DB로 DB Link 를 걸고자 한다면 우선 'A' DB의 TNSNAMES.ORA파일에 'B' DB 접속정보를 추가해 줍니다. 

물론 그 전에 두 DB 간에 1521(기본 포트)가 열려 있어야 합니다. 
접속이 가능한지는 한 DB에서 다른 DB로 > telnet IP PORT 로 접속 테스트를 해주시면 됩니다. 
ex> telnet 192.168.0.1 1521 

실제 DB Link를 걸기 위해서는 'B' DB의 서비스 네임과 link걸 table의 user/passwd를 알아야 합니다. 
그리고 'A' DB에서 DB Link를 걸기 위해선 권한이 필요합니다. 

'A' DB 의 System 계정으로 들어가서 

 GRANT CREATE PUBLIC DATABASE LINK, DROP PUBLIC DATABASE LINK TO A DB_ID; 

 'A' DB에 권한을 주고, 아래와 같이 DB Link를 생성합니다. 

CREATE DATABASE LINK TEST_LINK CONNECT TO B DB_ID IDENTIFIED BY PASSWORD USING 'B DB' 

      TEST_LINK  -> Link 이름 
      B DB_ID -> B DB 접속 아이디 
      PASSWORD  -> B DB 접속 패스워드 
    'B DB'  -> B DB 의 TNSNAMES.ORA에 등록된 Name 

  
마지막으로 아래의 명령어로 DB Link 가 걸렸는지 확인해 줍니다. 

SELECT * FROM Table@TEST_LINK 

  

* 모든 DB Link 를 확인하는 SQL 
 select * from all_db_links; 

* DB Link 삭제 
drop database link TEST_LINK 

  

  

CREATE  DATABASE LINK 원하는 링크이름 

 CONNECT TO 계정 IDENTIFIED BY 비번 
 USING '연결할 DB의 TNS'; 


이래저래 안걸리면 직접넣기 

CREATE DATABASE LINK 링크이름 
 CONNECT TO 아이디 IDENTIFIED BY 비번 
 USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=호스트명)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=SID)))';  

Posted by redkite
, |
============================================================================== 
옵티마이저 종류 

 - 공식기반 옵티마이저 : 오라클 6.x대 버젼까지 쓰던 옵티마이저로써, 공식에 의해 
                                실행. 
 - 비용기반 옵티마이저 : 오라클 7.x대 버젼부터 ~ 현재까지 쓰는 것으로써, 유리한 
    처리방식을 선택하여, 실행 
                                테이블의 데이터크기, 상황에 따라서 처리방식이 달라진다. 
=============================================================================== 

비용기반 옵티마이저 환경설정 

    - 환경설정 : 기본설정은 공식기반하고 같다. 하지만 중요한것은 룰베이스는 공식에의해 
  적절하게 작성하면 되지만, cost베이스는 반드시해야할 것이 있다. 
  ANALYZE TABLE에 의해 해당되는 테이블에 대한 통계정보를 반드시 만들어야 
                한다. 상황에 따라 처리방식이 달라지게 때문에 그러한 이유때문에 그때마다 
                통계를 작성해야한다. 밑의 설정의 3번. 

    1) SESSION-LEVEL : ALTER SESSION SET OPTIMIZER_MODE = CHOOSE; 
    2) INSTANCE-LEVEL : OPTIMIZER_MODE = CHOOSE 
    3) ANALYZE TABLE emp [ COMPUTE STATISTICS ]; 
    [ ESTIMATE STATISTICS n [ percent | rows ]; 
    [ DELETE STATISTICS ]; 
 1번이나 2번중 아무거나 설정해도 상관없음. 

============================================================================== 

실행계획 

    : 분석하고자 하는 테이블에 index도 있다면 index도 반드시 통계를 작성해야한다. 

 CREATE INDEX I_emp_deptno ON big_emp(deptno); 
 CREATE unique INDEX I_emp_empno ON big_emp(empno); 

 ANALYZE TABLE big_emp COMPUTE STATISTICS; 
 ANALYZE INDEX I_emp_deptno COMPUTE STATISTICS; 
 ANALYZE INDEX I_emp_empno COMPUTE STATISTICS; 

 SELECT ename 
 FROM big_emp 
 WHERE deptno = 20 
 AND empno BETWEEN 100 AND 200 
 ORDER BY ename; 

 Execution Plan 
 ------------------------------------------------------------------------ 
 0 SELECT STATEMENT Optimizer=CHOOSE 
 1 0 SORT (ORDER BY) 
 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' 
 3 2 INDEX (RANGE SCAN) OF 'I_EMP_EMPNO' (NON-UNIQUE) 
    실행통계를 보면 Rule base에서 deptno = 20가 우선순위면에서 높아서 deptno를 기준으로 
    조회를 하는 반면 Cost base에선 데이터양에 따라 AND empno BETWEEN 100 AND 200 적게 조회 
    되어 INDEX (RANGE SCAN) OF 'I_EMP_EMPNO' (NON-UNIQUE) scan을 하게 된다. 
============================================================================== 

1) Full-Table Scan 

    Cost = 전체 블록수 / DB_FILE_MULTIBLOCK_READ_COUNT 

 (1) 전체 블록수는 ANALYZE TABLE 명령어 수행 후 USER_TABLES의 BLOCKS 컬럼의 값 
 (2) DB_FILE_MULTIBLOCK_READ_COUNT는 INIT<DB명>.ora 파일에 정의(기본값 : 8) 

    Full-Table Scan의 경우 한 블럭당 검색을 하려면 너무 늦기 때문에 .ora파일에 설정되어 
    있는 기본값 8개씩 검색을 한다. 

    ANALYZE TABLE big_emp COMPUTE STATISTICS; 
 SELECT blocks FROM user_tables 
 WHERE table_name = ‘BIG_EMP’; 
 Blocks                                        370 
------------- COST = ------------ = 46 
 370                                                8 
============================================================================== 

2) INDEX SCAN 
    Cost = (선택도 * Cluster-Factor) 

  1.선택도(SELECTIVITY)는 해당 행이 검색될 수 있는 비율을 의미한다.(조건에 의해 달라짐) 
  2. CLUSTER-FACTOR는 해당 테이블의 행이 몇 개의 블록에 저장되어 있는지를 나타내는 비율 
      ANALYZE TABLE 명령어 수행 후 User_tables에 NUM_ROWS/BLOCKS-EMPTY_BLOCKS 
      컬럼의 값 

 1) ANALYZE TABLE big_emp COMPUTE STATISTICS; 
 2) ANALYZE INDEX I_emp_deptno COMPUTE STATISTICS; 
 3) 선택도= 1/6 
  예): deptno(부서코드)가 6가지 종류가 있을때, where deptno = '3'이라고 했다면, 
      결국 6개중의 하나를 선택했으므로 1/6이된다. 
 Cluster-Factor= 80(800개의 행, 블록당 10개의 행)이면 


선택도(SelectVity) 
  : 내가 어떤 조건들을 부여했을때 데이터가 선택될수 있는 확률 

  예제) Selectivity 는 1에 가까울수록 실행속도가 빠르다. 

  1) Unique-Key/Primary-Key의 경우 
    SELECT * FROM emp WHERE empno = 200; 
 => Selectivity = 1 (좋은 선택도) 
      이유 : Unique-Key 거나 Primary-Key는 유일한 값으로 하나밖에 나올수 없는 값이기 때문에 
            Selectivity = 1 

  2) 2) Non Unique-Key의 경우 
    SELECT * FROM emp WHERE ename = ‘SMITH’; 
 => Selectivity = 1 / distinct-keys => 1/ 4 = 0.07 (좋은 선택도) 
      이유 : emp테이블에 enme이 전부 4명이 있다면.. 그 확률상 
            1/4이 되어서 Selectivity = 0.07이 된다. 

  3) 값을 가진 비동등 조건식의 경우 
  SELECT * FROM emp WHERE empno < 200; 
 => Selectivity = (범위값 ? 최소값) / (최대값 ? 최소값) 
 = (200 ? 1) / (29999 ? 1) = 199 / 29998 = 0.007 
      이유 : 데이터가 29999건이 들어있는 테이블이라 가정한다.. 

 SELECT * FROM emp WHERE empno BETWEEN 100 AND 200; 
 => Selectivity = (최대조건값 ? 최소조건값) / (최대값 ? 최소값) 
 = (200 ? 100) / (29999 ? 1) = 100 / 29998 = 0.003 

    4) 바인드 변수를 가진 비동등 조건식의 경우 
 SELECT * FROM emp WHERE empno < :a ; 
 => Selectivity = 25 % (나쁜 선택도) 
 이유 : 바인드변수를 사용했다면 29999건이 있다고 가정한다면 바인드 변수의 
              값이 무엇이 나올지 알수 없어서 오라클 서버가 가정치(추정치)를 선택하는데 
              Defalut값이 25%가중치를 선택한다. 

 SELECT * FROM emp WHERE empno BETWEEN :a AND :b ; 
 => Selectivity = 50 % (나쁜 선택도) 

============================================================================== 
 비용계산 COST = ( 1/6 * 80 ) = (0.17 * 80) = 14 
    결국 이 조건은 14번의 access로 원하는 결과를 얻을 수 있다. 


Posted by redkite
, |

1. DELETE 

------------------------------------- 

  - DML(Data Manuplation Language) 
  - 사용 : DELETE FROM 테이블명 WHERE 조건; 

  - 데이터의 일부 또는 전부를 삭제 할 수 있음 
  - 삭제할 데이터들은 디스크에서 메모리로 로딩(loading)한 후 작업 
  - Disk I/O가 많이 발생하므로 메모리(Data buffer cache)에 있는 데이터를 삭제하기 전에 
    삭제할 데이터에 해당하는 Redo data, Undo Data를 생성 
  - COMMIT하기 전 ROLLBACK이 가능 
  - 삭제할 데이터를 해당 블록 내에서 하나씩 찾아서 삭제하기 때문에 시간이 오래 걸림 
  - 모두 삭제하였을 때도 사용된 블럭의 EXTENT 및 HWM을 그대로 유지  
  - 삭제(delete)하는 테이블의 데이터를 참조(reference)하는 테이블의 데이터에서 
    row단위로 체크해서 참조하는 테이블에 row가 없으면 삭제 가능 
  - 삭제한 row의 수를 반환함 
  - delete로 삭제된 데이터는 FLASHBACK QUERY로 복구 가능 

  - 통계정보(Analyze)를 변경하지 않음 

  

------------------------------------- 

2. TRUNCATE 
------------------------------------- 

  - DDL(Data Definition Language) 
  - 사용 : TRUNCATE TABLE 테이블명; 

  - 데이터의 일부 삭제는 불가, 전부 삭제됨 
  - DDL(Data Definition Language) 이므로 데이터를 메모리로 로딩(Loading)하지 않음 
  - Undo, Redo log를 생성하지 않음 

    (테이블이나 인덱스가 차지하고 있던 저장공간 관리영역에 대한 적은 량의 redo log는 생성함) 
  - Undo, Redo log를 생성하지 않기 때문에 ROLLBACK 불가, 복구 불가 
  - 타 테이블에서 참조하고 있으면 Truncate 불가 
  - 모두 삭제되기 때문에 사용된 EXTENT 및 HWM을 초기화 
  - 참조(reference) 제약이 ENABLE인 경우 ORA-02266 오류 발생 
  - 실제 해당 데이터를 일일이 찾아서 지우지 않고, 

      데이터 딕셔너리(Data Dictionary)에 삭제 표시 및 
      빈 공간 표시만을 하기 때문에 빠른 시간 내에 시스템 부하없이 데이터를 삭제 가능 
  - 삭제한 row의 수를 반환하지 않음 
  - Truncate한 Table 하나만을 특정 시점으로 복구 시 Archive Log Mode로 운영 중인 경우에 

      Hot Backup 또는 Cold Backup을 이용한 별도 데이터베이스에서 Incomplete Recovery를 

      한 후 해당 테이블을 exp/imp해야 복구 가능 
  - truncate table로 삭제된 데이터는 FLASHBACK QUERY로도 복구 불가 

    (ORA-01466: unable to read data - table definition has changed) 

  - 통계정보(Analyze)를 변경함

Posted by redkite
, |

Listener에 접속할 수 있는 Client 를 제한하는 방법입니다. 

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o /> 

① 환경설정 

$ORACLE_HOME/network/admin/protocol.ora 에 설정 (없을 경우 생성함) 

  

② 방법 1 : 특정 IP만 접속, 나머지 IP는 모두 거절 

tcp.validnode_checking = yes 
tcp.invited_nodes=( 192.168.18.7 ) 

이 경우는 오직 192.168.18.7 Node의 사용자만 접속을 할 수 있으며, 
그 외의 Node에서는 접속이 거절됩니다. (ora-12537 발생) 
여기서 조심할 사항은 반드시 자기 자신의 IP를 Invited_Nodes에 등록해줘야 합니다. 

  

③ 방법 2 : 특정 IP만 거절, 나머지 IP는 모두 접속 

tcp.validnode_checking = yes 
tcp.excluded_nodes=( 192.168.18.7 ) 

이 경우는 192.168.18.7 만 접속이 거절되며, 그 외의 다른 Machine에서는 
접속이 정상적입니다. 환경설정 후 리스너 재시작 필요합니다. 

※ 여러 IP를 등록할 때는 , 로 계속 붙여서 쓰면 됩니다. 

tcp.validnode_checking = yes 
tcp.invited_nodes = (192.168.18.7, 192.168.18.8, 192.168.18.9) 

Posted by redkite
, |
GETTING IP ADDRESS OF ORACLE CLIENT 
=================================== 

PURPOSE 
------- 
Oracle의 SQL을 이용하여 
client host의 IP address를 알아내는 방법을 안내합니다. 

Explanation 
----------- 

Programmer 고객들로부터 가장 자주 문의되는 것 중에 하나가 
source code에서 client host의 IP address를 알아내는 것입니다. 

그런데, Oracle software에서는 Oracle Server 8.1.x, 
즉 Oracle Server 8i부터 가능합니다. 

Oracle 8까지는 Oracle Server나 Net8를 통하여 
IP를 알아내는 것이 불가능하기 때문에 
Oracle 외적인 방법(Network programming)을 구하시는 등 
Oracle과 관련이 없는 방법을 찾아야 하였으나 
8i부터는 sys_context function으로 가능하여 졌습니다. 

SQL> select sys_context('USERENV', 'IP_ADDRESS') as ip from dual; 

sys_context function에 대한 모든 설명은 
각 Oracle Server Release 별 SQL Reference를 보시기 바라며 
여기서는 예를 들기위해 sample source code를 하나 작성하여 보았습니다. 

주의: 
sample source code는 고객의 편의를 위해 교육용 목적으로 작성된 것으로 
여기에 담겨진 개념을 실제 적용하고자 할 때 고객의 면밀한 검토가 필요하며 
sample source code의 관한 문의나 그 사용 등에 대해서는 
지원이 되지 않습니다. 


Example 
------- 

다음의 sample source code에 있는 trigger는 system user로 compile되며 
그 후 각 user가 database에 logon/logoff할 때 
특정 directory/file에 시각, client IP, oracle username, logon/off를 
기록하여 줍니다. 

prompt$ su - [oracle user] 
prompt$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora 
또는 
prompt$ vi $ORACLE_BASE/admin/$ORACLE_SID/pfile/init$ORACLE_SID.ora 
... 
# utl_file_dir parameter에 Oracle server가 write permission이 있는 
directory를 설정 
utl_file_dir=/tmp 
:wq 
# instance를 restart 
prompt$ svrmgrl 
SVRMGR> connect internal 
SVRMGR> shutdown 
SVRMGR> startup 
SVRMGR> exit 
# trigger 작성 
prompt$ cd $HOME 
prompt$ vi logonoff_trig.sql 
create or replace trigger logon_trigger after logon on database 
declare 
hFile utl_file.file_type; 
begin 
hFile := utl_file.fopen('/tmp', 'connection.log', 'a'); 
utl_file.putf(hFile, '%s %s %s LOGON', to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), sys_context('USERENV', 'IP_ADDRESS'), sys_context('USERENV', 'SESSION_USER')); 
utl_file.fclose(hFile); 
exception 
when others then 
if utl_file.is_open(hFile) then 
utl_file.fclose(hFile); 
end if; 
end; 

show errors 

create or replace trigger logout_trigger before logoff on database 
declare 
hFile utl_file.file_type; 
begin 
hFile := utl_file.fopen('/tmp', 'connection.log', 'a'); 
utl_file.putf(hFile, '%s %s %s LOGOFF', to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), sys_context('USERENV', 'IP_ADDRESS'), sys_context('USERENV', 'SESSION_USER')); 
utl_file.fclose(hFile); 
exception 
when others then 
if utl_file.is_open(hFile) then 
utl_file.fclose(hFile); 
end if; 
end; 

show errors 
:wq 
prompt$ sqlplus system/manager 
SQL> @logonoff_trig 
SQL> exit 
prompt$ sqlplus system/manager 
SQL> exit 
prompt$ sqlplus username/password 
SQL> exit 
prompt$ cat /tmp/connection.log 
2002-04-02 20:29:39 152.69.41.15 SYSTEM LOGOFF 
2002-04-02 20:29:58 152.69.41.15 SYSTEM LOGON 
2002-04-02 20:29:59 152.69.41.15 SYSTEM LOGOFF 
2002-04-02 20:29:58 152.69.41.15 USERNAME LOGON 
2002-04-02 20:29:59 152.69.41.15 USERNAME LOGOFF 


Reference Documents 
------------------- 
Oracle Server Documentation 
SQL Reference


Posted by redkite
, |

테이블설계시고려해야할점을오라클기준으로나열해봤습니다. 

1.코드성필드는문자열타입으로정의하는게좋습니다.(CHAR,VARCHAR2) 

2.문자열타입인CHAR타입과VARCHAR2타입은반드시구분해서정의해야합니다. 
똑같은문자열타입이지만용도도조금다르고내부메카니즘도다릅니다. CHAR타입인경우는입력시무조건정의한자리수만큼공간을확보합니다. 예를들어testchar(10)필드에'a'라는문자를입력하면한글자만들어가는게아니라a에스페이스9자리가 딸려들어갑니다.데이터구조상으로볼때미리공간을확보하기때문에해당필드에UPDATE가걸릴때이미확보된 공간내에서I/O가일어나기에속도가빠릅니다.이론적으로조회속도도VARCHAR보다좋습니다만조회시 스페이스가붙어나온다는것과Where조건에서Trim을해야한다는단점이있습니다. VARCHAR타입은저장시입력된데이터의길이만큼저장합니다.리소스절약이나데이터조회시는편하지만 I/O측면에서볼때는CHAR타입보다떨어집니다. CHAR타입은길이가딱정해진필트에대해서정의하는게좋고...(예,남녀구분,정상,반품구분등등구분자타입) VARCHAR타입은길이가유동적인필드에적합합니다.(명칭류..) 

3.숫자형필드는NOTNULL로지정하는게좋습니다. 
숫자형필드는수치연산이나SUM()을낼때널값이들어가면연산오류나원하는결과가안나오는수가있음으로 입력시사람이입력을안하더라도디폴트값0을넣어주는게정신건강상좋습니다. 

4.날짜형태의필드는DATE타입으로지정하는게좋습니다. 
CHAR타입으로선언해서엉뚱한데이터가들어가는경우을미연에방지할수있고날짜계산등에DATE타입이 매우편리합니다.

5.조회시주로사용되는필드는NOTNULL로지정하는게좋습니다. 
조회조건에들어가는필드가널값인경우는데이터가조회가안되는걸미연에방지할수있습니다. 

6.특정필드에중요한제약조건이있다면테이블설계시해당필드에제약조건을걸어둡니다. 
DB단에서제약조건을걸어두면설령프로그램에데이터를잘못입력해도DB단에서오류를막아줄수 있음으로중요한제약조건이있다면해당필드에제약조건을걸어둡니다.(예,숫자필드에0이상만입력가능한 제약조건이라던지,특정값만들어오는제약조건이라던지,시스템날짜이하로는입력이안되는제약조건등등..) 

Posted by redkite
, |

한글을 지원하는 캐릭터셋 
1.KO16KSC5601 
2.KO16MSWIN949 
3.UTF8 
4.AL32UTF8 

A. 작업 전 만약을 위해 DB전체를 백업 받아둔다. character set 을 잘못 변경하면 DB를 open 할수 없을 수 있다. 
B. 오라클 캐릭터셋 확인쿼리 
  SELECT parameter,value FROM nls_database_parameters WHERE parameter like '%CHAR%'; 
-------------------------------------- 
C. 아래는 OTN에서 발췌한 내용 
8i(AMERICAN_AMERICA.US7ASCII)는 version 8.1.6 이상이라고 가정하겠습니다. 아래의 내용 중의 일부분은 Oracle database release 8.1.6 이상에서만 적용될 수 있습니다. 
기본 작업 절차 
-------------- 
(1) CLOB data에 대한 unloading/exporting. 
(2) 8i(AMERICAN_AMERICA.US7ASCII)에서 "ALTER DATABASE CHARACTER SET" command set을 통한 8i(AMERICAN_AMERICA.KO16KSC5601)로의 변환. 
(3) 8i(AMERICAN_AMERICA.KO16KSC5601)에서 NLS_LANG 환경변수 변경(KOREAN_KOREA.KO16KSC5601)을 통한 8i(KOREAN_KOREA.KO16KSC5601)로의 변환. 
(4) 8i(KOREAN_KOREA.KO16KSC5601)에서 exporting 후 9i(KOREAN_KOREA.KO16KSC5601)에서 importing. 
(5) CLOB data에 대한 loading/importing. 
과정(2)의 세부 절차 
------------------ 
$ sqlplus /nolog 
SQL> conn sys/pw as sysdba 
SQL> shutdown immediate 
SQL> startup mount 
SQL> alter system enable restricted session; 
SQL> alter system set JOB_QUEUE_PROCESSES=0; 
SQL> alter system set AQ_TM_PROCESSES=0; 
SQL> alter database open; 
SQL> alter database character set KO16KSC5601; 
SQL> alter database national character set KO16KSC5601; 
SQL> shutdown immediate 
SQL> startup open 
  

ERROR at line 1: 
ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists 
## 에러가 발생할 경우 아래 스크립트로 실행한다. 
SQL> alter database  character set internal_use ko16ksc5601; 
  
CF) DB내의 CLOB 찾기 
CLOB 또는 NCHAR Datatype의 컬럼들을 export 받고 
CLOB, NCHAR이 포함된 Table을 Drop하고 
Alter database character set ... 하고 
다시 Import하라고 되어 있는데 별 효용없는것 같음. 
sys, system으로 접속하여 
SELECT * 
FROM dba_lobs 
Partitioning했다면 DBA_PART_LOBS까지 참조 

'01.오라클 > 002.DB 마이그레이션' 카테고리의 다른 글

[오라클]MySQL Vs. Oracle  (0) 2013.04.19
[오라클]system tablespace rename  (0) 2013.02.23
[오라클]Full export / import  (0) 2013.02.20
[오라클]Undo Tablespace 변경  (0) 2012.12.19
[오라클]Voting Disk 이관  (0) 2012.12.19
Posted by redkite
, |

## export

형식 :  EXP KEYWORD=값 또는 KEYWORD=(값1,값2,...,값N)

예    :  EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
           또는 T1이 분할된 테이블인 경우 TABLES=(T1:P1,T1:P2)

 

예 ) exp scott/tiger file=emp.dmp log=emp.log tables=emp direct=y
예 ) exp system/oracle file=full.dmp full=y indexes=n triggers=n
예 ) exp system/oracle file=scott.dmp owner=scott rows=n

 

option

수많은 exp 옵션들... 다 외울순 없다..

exp help=y

하게 되면 친절히 설명해주니 기억이 나지 않을시 참고 하도록 하자


scott/tiger                           : db 유저/password
full                                       : 해당 db 전체 데이터 추출 여부(기본값 N)
buffer                                   : 작업 단위의 크기 설정
owner                                  :  db 유저별 오브젝트 추출 설정
file                                       : 추출한 데이터를 저장할 파일 이름 설정
tables                                  : 데이터를 추출할 대상 테이블 설정
compress                            :  익스텐트 통합 여부를 지정(기본값 Y)
grants                                  : 오브젝트 권한 설정에 대한 정보 추출 여부(기본값 Y)
indexes                                : 인덱스 스크립트 추출 여부(기본값 Y)
direct                                   : 직접 경로로 export 수행 여부(기본값 N)
triggers                                  : 트리거 정보 추출 여부(기본값 Y)
log                                       : 로그를 저장할 파일 지정
rows                                     : 테이블의 데이터 추출 여부(기본값 Y)
consistent                             : 대상 테이블의 읽기 일관성 지정(기본값 N)
constraints                            : 제약 조건의 추출 여부(기본값 Y)
parfile                                 :  파라메터 파일을 export시 적용
INCTYPE                               : 증분 엑스포트 유형
RECORD                               : 증분 엑스포트 추적(기본값 Y)

OBJECT_CONSISTENT            : 객체 엑스포트 동안 읽기 전용으로 설정된 트랜잭션(N)
FEEDBACK                            : 매 x행마다 진행 상황 표시(0)
FILESIZE                             : 각 덤프 파일의 최대 크기
FLASHBACK_SCN                   : 세션 스냅샷을 되돌리는 설정에 사용된 SCN
FLASHBACK_TIME                  : 지정된 시간에 가장 가까운 SCN을 가져오는 데 사용된 시간
QUERY                                 : 테이블의 부분 집합을 엑스포트하는 데 사용된 select 절
RESUMABLE                          : 공간 관련 오류가 발생하면 일시 중지됨(N)
RESUMABLE_NAME                : 재개 가능한 명령문을 식별하는 데 사용된 텍스트 문자열
RESUMABLE_TIMEOUT            : RESUMABLE 대기 시간
TTS_FULL_CHECK                   : TTS에 대한 전체 또는 부분 종속성 검사 수행
TABLESPACES                     : 엑스포트할 테이블스페이스 목록
TRANSPORT_TABLESPACE : 이동 가능한 테이블스페이스 메타 데이터 엑스포트(N)
TEMPLATE                             : iAS 모드 엑스포트를 호출하는 템플리트 이름

 

** compress 옵션을 Y로 설정 하여 사용하면 여러개의 익스텐트가 하나의 큰 익스텐트로 통합된다
   실제 운영에서는 익스텐트를 통합하는것은 좋지 않으므로 반드시 compress 옵션을 N로 설정 한다.
** direct 옵션을 사용하면 SGA를 사용하지 않고 export/import 하게 되며 
   추출 및 적재 작업시 보다 빠른 속도를 보장 받는다.
** comsistent 옵션을 Y로 설정하면 export를 수행한 시점의 데이터를 추출한다.
   export 중 변경된 데이터는 언두 데이터를 이용해서 이전 값을 추출한다.
   따라서 'snap shot too old' 에러가 발생하기 쉽다.


## export 작업시 주의 사항

** full, ower 및 tables 옵션은 동시 사용 불가
** direct=Y인 경우 consistent=y로 설정 불가
** full=Y로 expor를 수행하기 위해서는 exp_full_database 권한 필요

 

----- 추출 파일의 크기를 확인하는 SQL

SQL> select sum(bytes)/1024/1024
     from dba_segments
     where segment_name='TEST';

 

export 작업을 수행 하면 실제 테이블의 크기보다 작게 생성된다.
위 SQL을 수행하여 나온 크기만큼 디스크의 크기를 확보하면 export 작업을 수행하는데 충분하다.
또한 추출 파일에는 해당 테이블의 인덱스를 생성할 수 있는 정의만 저장하므로 별도의 디스크공간은 필요하지 않다.
하지만 import 시에는 실제 인덱스를 생성하므로 인덱스 테이블스페이스에 여유 공간을 확보해야한다.


## import

-- import 순서 : 테이블 생성 > 데이터 적재 > B*트리 인덱스 생성 > 제약조건 > 트리거 및 비트맵 인덱스 생성

 

예 ) imp scott/tiger file=emp.dmp log=emp.log tables=emp
예 ) system/manager file=full.dmp log=full.log full=y
예 ) system/manager file=scott.dmp fromuser=scott touser=mike

 

option

scott/tiger                         : db 유저 / password
full                                     : 전체 db에 대해 import 여부(기본값 N)
buffer                                 : 작업 단위의 크기 지정
fromuser                       : export한 테이블의 소유자 지정
touser                                : import되는 테이블의 소유자 지정
tables                                : import 대상 테이블 지정
ignore                                : import 대상 테이블이 존재할 경우 에러 발생 여부(기본값 N)
grants                                 : 권한 적재 여부 지정 (기본값 Y)
indexes                             : index 생성 여부(기본값 Y)
commit                               : import 수행중 커밋 수행여부, 
                                           Y로 지정할 경우 buffer 옵션 단위로 커밋 수행(기본값 N)
rows                                   : 테이블의 데이터 적재 여부(기본값 Y)
log                                     : 로그를 저장할 파일 지정
constrainsts                      : 제약 조건 적재 여부(기본값 Y)
parfile                                : 파라메터 파일을 지정하여 import 작업시 적용

SHOW                                 : 파일 목차만 목록 (기본값 N)
RECORDLENGTH IO               : 레코드의 길이
INCTYPE                              : 증분 임포트 유형
DESTROY                             : 테이블스페이스 데이터 파일 겹쳐쓰기(기본값 N)
INDEXFILE                          : 지정된 파일에 테이블/인덱스 정보 쓰기
SKIP_UNUSABLE_INDEXES     : 사용되지 않은 인덱스들의 유지를 건너뜁니다 (기본값 N)
FEEDBACK                           : 매 x행마다 진행 상황 표시(기본값 0)
TOID_NOVALIDATE                : 지정된 유형 ID 검증 건너뛰기
FILESIZE                            : 각 덤프 파일의 최대 크기
STATISTICS                          : 미리 계산된 통계 임포트(항상)
RESUMABLE                         : 공간 관련 오류가 발생하면 일시 중지됨(기본값 N)
RESUMABLE_NAME               : 재개 가능한 명령문을 식별하는 데 사용되는 텍스트 문자열
RESUMABLE_TIMEOUT          : RESUMABLE 대기 시간
COMPILE                              : 프로시저, 패키지 및 함수 컴파일(기본값 Y)
STREAMS_CONFIGURATION   : 일반 스트림 메타 데이터 임포트(기본값 Y)
STREAMS_INSTANTIATION      : 스트림 인스턴스화 메타 데이터 임포트(기본값 N)

 

아래의 키워드만이 이동가능한 테이블스페이스에 적용할 수 있다.

TRANSPORT_TABLESPACE  : 이동가능한 테이블스페이스 메타데이터을 임포트합니다 (기본값 N)
TABLESPACES                     : 데이터베이스안에 테이블스페이스가 이동되었습니다
DATAFILES                            : 데이터베이스안에 데이터 파일들이 이동되었습니다
TTS_OWNERS                          : 이동가능한 테이블스페이스 설정에 데이터를 소우하고 있는 사용자

 

## import 작업시 주의 사항

** full 옵션과 tables 옵션은 동시 사용 불가
** full=y 및 touser 옵션을 사용하기 위해서는 imp_fyll_database 권한 필요
** 적은 양의 데이터 import 경우를 제외하곤 commit 옵션을 Y로 설정 권장.
** export 시와 동일한 tablespace가 존재하지 않을 경우 유저 default tablespace로 import 된다
   system 유저로 import 하게 되면 system tablespace에 일반 유저 세그먼트가 생성 될수 있으므로
   반드시 export시 tablespace와 동일한 이름의 tablespace를 생성한 후 작업을 수행해야한다.

 

------------------------- exp/imp 실습 --------------------------

실습 준비 사항

SQL> create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST1.DBF' size 1m;

SQL> alter tablespace test add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST2.DBF' size 1m;

SQL> alter tablespace test add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST3.DBF' size 1m;

SQL> create user orcl identified by orcl
  2  default tablespace test;

SQL> grant connect, resource, select any table to orcl;

SQL> grant exp_full_database, imp_full_database to orcl;            // exp, imp database 사용시

SQL> create table orcl.test as select * from scott.emp;


------------------------- exp/imp database --------------------------

## exp 백업의 이름을 잘 정해야 한다. 해당 백업 파일을 언제 누가 보든 쉽게 이해할수있도록 룰을 잘 정해야한다.
## exp의 경우 datapump와 다르게 디렉토리 지정이 없다.
## exp 할 대상 경로로 이동해 실행하거나, 
## file=[ 경로명 ]\test.dmp , log=[ 경로명 ]\test.log 와 같이 직접 지정해야한다.


D:\test>exp orcl/orcl full=y log=test.log file=test.dmp

엑스포트가 경고 없이 정상적으로 종료되었습니다.

D:\test>dir

2009-04-15  오후 01:12        82,259,968 test.dmp
2009-04-15  오후 01:12            61,816 test.log

D:\test>imp orcl/orcl full=y file=testfull.dmp
.
.
IMP-00015: 객체가 이미 존재하므로 다음 명령이 실패했습니다
 "CREATE UNDO TABLESPACE "UNDOTBS1" BLOCKSIZE 8192 DATAFILE  'D:\ORACLE\PRODU"
 "CT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF' SIZE 62914560       AUTOEXTEND ON NEX"
 "T 5242880  MAXSIZE 32767M EXTENT MANAGEMENT LOCAL "
.
.

########## 완료시 경고성 완료가 될수 있다. 이유? 당연히 DB가 멀쩡히 있기 때문이다.
########## 작업중 err를 발생할 수도 있다.. 걱정마라 system 관련 parameter 또는 동적 뷰다.
########## system 관련 데이터까지 모두 날릴순 없지 않은가..
########## 그럼 어떨때 export/import database를 쓸까??
########## 마이그레이션 작업할때 쓴다!!!

 

D:\test>imp orcl/orcl full=y file=testfull.dmp ignore=y

엑스포트 파일은 직접 경로를 거쳐 EXPORT:V10.02.01 에 의해 생성되었습니다
KO16MSWIN949 문자집합과 AL16UTF16 NCHAR 문자 집합에 임포트가 완성되었습니다
. SYSTEM 객체를 SYSTEM(으)로 임포트하는 중입니다
. OLAPSYS 객체를 OLAPSYS(으)로 임포트하는 중입니다
.
.


-------------------------- exp/imp transport_tablespace --------------------------

같은 환경을 가진 두개 이상의 분산 DB 환경에서 어떤 DB가 가진 여러개의 데이터 파일을 다른 DB로 이동 시키는 기능.

 

------- 주의사항
## transport_tablespace를 사용하려면 해당 tablespace를 read only 시켜야 한다.
## tablespace내 하나의 특정 데이터 파일만 이동 할수 없다.
## 같은 환경을 가진 OS에서만 가능함.
## 오라클 8i 이상 사용 가능.
## DB_BLOCK_SIZE 파라메터의 값이 같아야 함.
## 같은 언어타입을 사용해야함.
## VARRAY 타입과 중첩 테이블 컬럼이 있는 테이블은 사용할수 없음.
## bit-map-index는 사용할수 없음.

## LOB 타입을 가진 테이블 또는 분할 테이블은 사용할수 있음.


SQL> conn orcl/orcl
연결되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

SQL> conn / as sysdba
연결되었습니다.


SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                                  ONLINE
UNDOTBS1                               ONLINE
SYSAUX                                  ONLINE
TEMP                                      ONLINE
USERS                                     ONLINE
EXAMPLE                                ONLINE
TEST                                       ONLINE

7 개의 행이 선택되었습니다.

 

SQL> alter tablespace test read only;         // export transport tablespace 하려면 
테이블스페이스가 변경되었습니다.              // tablespace를 read only로 변경해야한다

SQL> exit

-------------------- export transport tablespace 시작
D:\test>exp '/ as sysdba' file=aaa.dmp transport_tablespace=y tablespaces=test
.
.
엑스포트가 경고 없이 정상적으로 종료되었습니다.

 

D:\test>sqlplus / as sysdba

 

SQL> drop tablespace test including contents;

테이블스페이스가 삭제되었습니다.

 

SQL> select * from orcl.test;                   // tablespace가 삭제 되어서 table을 찾을수 없다.
select * from orcl.test
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

 

SQL> exit

------------------------- aaa.dmp 파일을 이용한 tablespace import
D:\test>imp '/ as sysdba' file=aaa.dmp transport_tablespace=y tablespaces=test datafiles=D:\ORACLE\P
임포트가 경고 없이 정상적으로 종료되었습니다.

 

D:\test>sqlplus orcl/orcl

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

SQL> select tablespace_name, status from dba_tablespaces;          

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
UNDOTBS1                       ONLINE
SYSAUX                         ONLINE
TEMP                           ONLINE
USERS                          ONLINE
EXAMPLE                        ONLINE
TEST                           READ ONLY

7 개의 행이 선택되었습니다.

 

SQL> alter tablespace test read write;               // import 완료 했으므로 다시 online으로 변경

테이블스페이스가 변경되었습니다.


------------------------------------- exp/imp table--------------------------------------

예 ) exp orcl/orcl file=test.dmp log=test.log tables=test
예 ) exp orcl/orcl file=test.dmp log=test.log tables=scott.emp
예 ) exp orcl/orcl file=test.dmp log=test.log tables=(scott.emp, hr.employees, scott.dept)


SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

D:\test>exp orcl/orcl file=test.dmp log=test.log tables=ss
.
.
엑스포트가 경고 없이 정상적으로 종료되었습니다.


####### case 1) table을 drop 한 경우 #######

SQL> drop table test;

 

SQL> select count(*) from test;
select count(*) from test
                     *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

 

D:\test>imp orcl/orcl file=table.dmp tables=test
임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14


####### case 2) table을 delete 한 경우 #######

SQL> delete test;

14 행이 삭제되었습니다.

 

SQL> select * from test;

선택된 레코드가 없습니다.

 

SQL> commit;

커밋이 완료되었습니다.

 

D:\test>imp orcl/orcl file=table.dmp tables=test
.
.
 "CREATE TABLE "TEST" ("EMPNO" NUMBER(4, 0), "ENAME" VARCHAR2(10), "JOB" VARC"
 "HAR2(9), "MGR" NUMBER(4, 0), "HIREDATE" DATE, "SAL" NUMBER(7, 2), "COMM" NU"
 "MBER(7, 2), "DEPTNO" NUMBER(2, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRA"
 "NS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFA"
 "ULT)                   LOGGING NOCOMPRESS"
경고와 함께 임포트가 정상 종료되었습니다.

 

// imp table을 할때 create table 구문이 들어가 있다.
// 즉, table의 row는 없더라도 같은 이름의 table이 있다면 import 되지 않는다.
// 이러한 경우 ignore=y 옵션을 사용한다.

D:\test>imp orcl/orcl file=table.dmp tables=test ignore=y

임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14


####### case 2) data가 들어있는 table에 ignore 옵션을 사용할 경우 #######
SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

D:\test>imp orcl/orcl file=table.dmp tables=test ignore=y

임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        28

 

// row수가 14개 더 늘어난걸 볼수있다.
// ignore 옵션은 해당 테이블에 중복 데이터가 있으면 해당 데이터를 덮어 쓰는게 아니다.

 

----------------------------------- exp/imp owner ---------------------------------------

D:\test>exp '/ as sysdba' file=user.dmp log=user.log owner=orcl

엑스포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> drop user orcl cascade;                    // 해당 유저와 유저의 데이터까지 모두 삭제.

사용자가 삭제되었습니다.

 

SQL> create user orcl identified by orcl
  2  default tablespace test;

사용자가 생성되었습니다.

 

SQL> grant connect, resource to orcl;

권한이 부여되었습니다.

 

D:\test>imp '/ as sysdba' file=user.dmp fromuser=orcl touser=orcl

경고와 함께 임포트가 정상 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

------------------------------ exp/imp query ------------------------------------

## export시 쿼리 문을 사용하여 해당 table내 원하는 데이터만 추출할수 있다.
   - 테이블 레벨의 export 명령어에서만 가능하다.
   - Direct 옵션과 함께 사용될 수 없다.
   - Nested 테이블을 갖는 테이블에는 적용할 수 없다.
   - Partition 테이블에 대한 export에도 적용가능하다.
   - Import 명령에는 적용되지 않는다.

 

D:\test>exp orcl/orcl file=dump.emp log=dump.log tables=orcl.test query='where empno=7788'

엑스포트가 경고 없이 정상적으로 종료되었습니다.

 

------------------------------------ 참고 사항 ---------------------------------------------
## UNIX reserved characters( ", ', ,< .. 등)를 사용하는 경우에는 escape ('\') 을 반드시 사용해야 한다.

 

----- win
예 ) exp orcl/orcl file=dump.emp log=dump.log tables=orcl.test query=\"where ename like 'SCOT%'\"
----- UNIX
예 ) exp orcl/orcl file=dump.emp log=dump.log tables=orcl.test query=\"where ename like \'SCOT%\'\"

 

## command line에서 query 내에 '," 을사용하지 않는 다면 '나 " 으로 query option을 사용할수 있다
   query=\'where deptno = 20\'
   query=\"where deptno = 20\"
   query=\'where deptno \< 2\' 
   (이 경우  single 이나  double quotes 을 둘다 사용할수 있다.)

 

## command line에서 export option을 사용할때는 반드시 escape가 있어야 하나 
   parfile을 사용할때는 eacape이 불필요하다.
 
  
parfile을 사용하는 경우에는 다음과 같이 단순하게  사용이 가능하다.
query='where deptno = 20'
query="where deptno = 20"
query='where deptno < 20'


---------------------------------------------------------------------------------------------------


########### case 1) ########### 
SQL> drop table test;

 

D:\test>imp orcl/orcl file=dump.emp tables=test

임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
         1


########### case 2) ########### 
SQL> delete from test where empno=7788;

 

SQL> commit;

 

SQL> select count(*) from test;

  COUNT(*)
----------
        13

 

D:\test>imp orcl/orcl file=table.dmp tables=test ignore=y

임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14


// 실제로 imp된 7788사원은 해당 테이블의 가장 마지막 로우에 import 된다.


## 그렇다면 table 단위로 emp 하고 query로 뽑아서 import 할수 있을까?
   -> 정답은 안된다. 궁금하면 해보시라.
   LRM-00101: 알 수 없는 'query' 매개변수 이름. 이런 메세지가 기다리고 있을것이다.

 

---------------------------------- exp/imp parfile 방식 -----------------------------------

## parfile 안에 해당 exp/imp 설정을 작성한후 parfile을 이용해서 exp/imp를 할수있다.

 

########### exp case 1
file=full.dmp
log=full.log
full=y
direct=y
.
.

########### exp case 2
file=emp.dmp
log=emp.log
tables=scott.emp
direct=y
.
.

########### exp case 3
file=scott.dmp
log=scott.log
owner=scott
direct=y
.
.
########### exp case 4
file=query.dmp
log=query.log
tables=scott.emp
query="where ename like 'SCOT%'"
direct=y
.
.

---------------------------
// 윈도우 이기 때문에 노트 패드로 pa.par 파일을 작성 한뒤 실습 내용임


D:\test>more pa.par
file=table.dmp
log=table.log
tables=orcl.test
direct=y

 

D:\test>exp test/test parfile=pa.par

엑스포트가 경고 없이 정상적으로 종료되었습니다.

 

D:\test>more impa.par
file=table.dmp
tables=test

 

D:\test>imp orcl/orcl parfile=impa.par

임포트가 경고 없이 정상적으로 종료되었습니다.

 

SQL> select count(*) from test;

  COUNT(*)
----------
        14

 

--------------------------------------- DIALOG 방식 -----------------------------------

D:\test>exp

Export: Release 10.2.0.1.0 - Production on 수 4월 15 15:54:52 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


사용자명: test
암호:

다음에 접속됨: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
배열 인출 버퍼 크기 입력: 4096 > 409

엑스포트 파일: EXPDAT.DMP > 111

(1)E(전체 데이터베이스), (2)U(사용자), 또는 (3)T(테이블): (2)U > 1

권한부여 엑스포트 (yes/no): yes > yes

테이블 데이터 엑스포트 (yes/no): yes > yes

확장 영역 압축 (yes/no): yes > yes

KO16MSWIN949 문자 설정과 AL16UTF16 NCHAR 문자 설정에서 엑스포트가 종료되었습니다

전체 데이터베이스를 엑스포트하려고 합니다 ...
테이블 정의 엑스포트 중
프로파일 엑스포트 중
사용자 정의 엑스포트 중
.
.
.

Posted by redkite
, |

최근 전자신문 미래기술연구센터와 한국정보화진흥원이 공동으로 학계 업계 등의 전문가 52명을 대상으로 조사한 `2013 개인정보보호 트렌드 전망` 연구 결과에 따르면 DB 암호화를 비롯한 개인정보 암호화가 개인정보보호 분야 이슈로 선정됐을 만큼 개인정보보호법 시행과 일련의 정보 유출 사고를 계기로 많은 조직에서 DB 암호화에 대한 관심이 뜨겁다.

실제로 기존 공공 기관 및 은행권을 중심으로 이뤄 지던 암호화가 올해에는 물류 업체, 백화점, 대형 할인 마트 등 전 산업군으로 확산되면서 지난해 500억∼600억원 규모로 전년 대비 2배 이상 성장한 DB 암호화 시장이 올해는 전년 대비 30∼40% 성장할 것으로 전망되고 있다.

이처럼 법 제정 이후로 성능 및 비용 문제로 DB암호화 적용을 보류해 온 업체들까지도 도입을 고려하고 있어 암호화 시장이 크게 성장한 것은 사실이지만, 그에 따른 우려의 목소리 또한 높다. 암호화의 효용성 논란과, 시스템 성능 저하 문제 때문이다. 그 중 성능 이슈는 DB 암호화 적용 시 가장 우려가 되는 부분으로, 특히 대용량 데이터 처리를 수행하는 배치에서 더욱 심하게 나타난다.

그러나 최근 대용량 데이터를 암호가 걸린 상태로도 자유롭게 연산해 데이터 처리 속도는 높이면서도 외부 유출 가능성은 줄일 수 있는 기술이 개발되었다. 기존에는 암호화된 정보를 검색하거나 통계 처리를 하려면 이를 다시 해제해 원래 정보를 복구한 후에 연산하고, 또다시 암호화해서 저장해야 하므로 데이터 처리 속도가 느려 지고 이 과정에서 데이터가 노출되는 위험이 있었다. 그런데 이번에 국내 연구진이 개발한 '완전 동형 암호화(fully homomorphic encryption)' 방식은 암호화된 정보의 해제 과정을 생략하고 암호화된 상태 그대로 연산이 가능해 이목을 집중 시킨다.

일반적으로 DB를 암호화하면 컬럼 길이가 증가하고 저장 공간과 I/O의 증가, 넓은 범위 액세스나 Full Table Scan에 영향을 미친다. 또한 암호화 할 대상이 많아 지면 저장 공간 및 I/O 문제가 심화되고, 메모리 사용량이 증가하며 High Resource Query의 증가로 시스템 전체의 성능이 저하된다. 사소한 코딩 실수도 심각한 성능 문제로 비화될 수 있으며, API 방식이나 Plug-In 방식 모두 대량의 데이터 처리 시 암복호화 부하가 발생하기도 한다. 또한 암호화된 값은 암호화 전의 대소 관계를 유지할 수 없으므로 Range Scan 문제가 발생하는 등 여러 가지 성능 이슈가 대두된다.

DB 암호화에 따른 성능 이슈.JPG

<="" v:imagedata="" src="http://www.dator.co.kr/file:///C:\Users\jiho\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg">

이러한 DB 암호화를 통한 성능 이슈들을 방지하기 위해서는 먼저 전사적인 통합 설계가 선행되어야 한다. 암호화 대상 항목의 중복이 많을수록 SQL만으로 개선이 불가능한 성능 문제가 자주 나타나므로 적절한 통합 설계로 암복호화의 불필요한 수행 여지를 최소화 한 후 SQL의 최적화가 필요하다. 데이터 품질이 높고 튜닝이 잘 된 DB라면 암호화로 인한 시스템 성능 저하를 크게 줄일 수 있다.

그 이후에 현 운영 시스템의 다양한 환경적인 요소를 분석하여 적절한 DB 암호화 설계 방식을 선택해야 한다. DB 암호화 설계 방식으로는 컬럼 유지 후 암호화를 하는 ▲암호화 후 View 적용 방식과 데이터를 통합한 후에 암호화를 하는 ▲데이터 집중 후 암호화 방식 2가지가 있다.

그림2.JPG

그림4.JPG

<="" v:imagedata="" src="http://www.dator.co.kr/file:///C:\Users\jiho\AppData\Local\Temp\msohtmlclip1\01\clip_image003.jpg">

현 시스템에 최적화된 DB 암호화를 위해서는 먼저 현재 사용하고 있는 DB와 서버 등의 환경이나 버전 등을 파악하고 있어야 한다 또한 DB 내부에 어떠한 데이터들이 저장되어 있는지, 데이터들 중에서 암호화를 적용해야 하는 개인 정보들은 어떤 것들이 있는지, 또한 개인 정보들은 어떠한 포맷으로 저장되어 있는지 등을 알아야 한다.

.

이처럼 DB 암호화를 효율적으로 실행하기 위해서는 여러 가지 고려해야 할 사항들이 수반된다. 그러나 아직도 일선 실무자들과 이야기를 나누다 보면 DB 암호화에 대해 정확히 모르고 있거나, 무턱대고 솔루션을 구입하는 것으로 개인정보보호를 위한 노력을 다했다고 생각하는 사람들이 더러 있는데 이는 위험한 발상이다.

솔루션 도입을 고려하기 전에 먼저 DB 암호화에 대한 올바른 이해가 선행되어야 하며, 암호화 작업에만 급급해 모든 정보를 일괄적으로 암호화하는 것은 자칫 조직 효율성을 떨어뜨릴 수 있으므로 각 산업의 특성에 맞게 선별적으로 암호화 정책을 수립하고 그에 적합한 암호화 방식을 선택해야 한다. 이 때 현 시스템 현황을 상세히 파악하고 있는 관리자가 중심이 되어 자사 환경에 맞는 DB 암호화 방식을 택하고 그에 따른 솔루션 구입을 고려해야 불필요한 비용을 최소화할 수 있다.

더불어 수년간 발생한 주요 개인 정보 유출 사건을 분석한 결과 70%의 공격이 방화벽 내부에서 이루어졌고, 이중 90%의 공격이 정당한 권한을 가진 내부 직원에 의해서 발생했다는 것을 고려한다면, DBA는 물론, 개발자 및 과도한 권한이 설정된 내부 직원으로부터 주요 정보에 대한 무분별한 접근을 효과적으로 통제할 수 있는 대안을 추가로 마련해야 할 것이다.

Posted by redkite
, |

NLS_LANG =   [언어]_[영역].[캐릭터셋]
             <language>_<Territory>.<client characterset>
    ex) AMERICAN_ARERICA.KO16KSC5601, AMERICAN_AMRRICA.UTF8
  ● <Territory> - 영역정보, 달력 설정 방법, 통화기호(달라), 숫자그룹
                   날짜 포맷(한국 - "05/08/12 오후 07:28:03", 체코 - "10.08.05 19:28:03")
                   Language 값만 설정하면, Language 값을 따른다. ( AMERICAN ==> AMERICA )
  ● <language> - 캐릭터셋, 정렬방식, 날짜 표기에 사용되는 기호(년/월/일, YYYY/MM/DD) 
                  Default 값은 AMERICAN 이다.
                  실제 날짜 표기(TO_CHAR,TO_DATE 실행시 - 월요일, MON 으로 표시를 좌우하는
                  NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다. [하단.  테스트 1 참조 ]
  ● <client characterset>
◇ 기본적으로 Server characterset 과 동일하게 설정된다.
    - 클라이언트에서 캐릭터셋만 설정하면, 디폴트로 AMERICAN_AMERICA 로 Territory_language 값이 설정된다.
    ◇ Client Characterset 을 Server 와 다르게 설정 상태에서,
      SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
      을 실행 하여도, 항상 CharacterSet 은 항상 서버 CharacterSet 값을 가져온다.
    ◇ client characterset을 서버와 다르게 하는 경우는 크게
      1. 다른 캐릭터셋 DB로 데이타 이전시(EXPORT/IMPORT)
         △  EXPORT/IMPORT 시에는 반드시 서버의 Character Set 동일하게 설정 후 Export/Import 한다.
         △  다른 캐릭터셋의 DB(데이타가 깨지지 않고, 지원되는 경우, SubSet Characterset 일경우)로 IMPORT 시에는
           Import 대상의 DB 캐릭터셋으로 환경 설정 후, Export/Import 한다.
      2. Server(UTF8) - Client(KO16KSC5601)
         △ 다국어 지원되는 데이타베이스에다 한글 입출력 하기 위해서는
            입력시 - 내가 입력 하는 데이타의 캐릭터셋이 한글임을 알리기 위해서,
            출력시 - Unicode 의 Data를 한글로 표현해 달라고 하기 위해서
            지금까지 DB 가 UTF8 이면, Client 도 UTF8 로 설정하면 되는 줄 알았는데. 아니네요 ㅡ_ㅡ;
     ◇ NLS_LANG 지정 방법
     1. SESSION LEVEL
      - 가장 우선 된다.
      - select * from nls_session_parameters 를 통해서 확인 가능
      - 변경 방법1.
      -- 확인
      SQL> select * from nls_session_parameters
           where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
                  PARAMETER                      VALUE
          ------------------------------ ----------------------------------------
          NLS_LANGUAGE                   AMERICAN
          NLS_TERRITORY                  AMERICA
          NLS_DATE_FORMAT                DD-MON-RR
          NLS_DATE_LANGUAGE              AMERICAN
          NLS_SORT                       BINARY
      SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
      NLS SET
      --------------------------------------------------------------------------------
      AMERICAN_AMERICA.US7ASCII
        -- 변경 
        SQL> ALTER SESSION SET NLS_LANGUAGE='KOREAN';
        Session altered.
        -- 변경 확인
        SQL>  select * from nls_session_parameters
        where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
          PARAMETER                      VALUE
          ------------------------------ ----------------------------------------
          NLS_LANGUAGE                   KOREAN
          NLS_TERRITORY                  AMERICA
          NLS_DATE_FORMAT                DD-MON-RR
          NLS_DATE_LANGUAGE              KOREAN
          NLS_SORT                       BINARY
        SQL> SELECT SYS_CONTEXT('USERENV','LANGUAGE') "NLS SET" from dual;
        NLS SET
        ---------------------------------------------------------------------------------------
        KOREAN_AMERICA.US7ASCII
      - 변경 방법2.
        UNIX, WINDOWS 에서 NLS_LANG 값을 변경한다.
     ◇ UNIX - export NLS_LANG=American_America.US7ASCII 설정
     ◇ Windows - SET NLS_LANG=American_America.US7ASCII 설정
     ◇ NLS_LANG 잘못 지정시
             NLS_LANG 을 잘못 지정시 sqlplus 실행시 오류 발생 [ I 가 하나 빠짐 ]
             export NLS_LANG=American_America.US7ASCI
             sqlplus scott/tiger
             SQL*Plus: Release 8.1.7.0.0 - Production on Thu Jun 4 18:00:25 2009
             (c) Copyright 2000 Oracle Corporation.  All rights reserved.
             ERROR:
             ORA-12705: invalid or unknown NLS parameter value specified
      -
   2. INSTANCE LEVEL
    - SELECT * FROM NLS_INSTANCE_PARAMETERS ; 를 통해서 확인 가능
    - SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME LIKE '%nls%'; 를 통해서 확인 가능
      [ NLS_INSTANCE_PARAMETER 에서 값을 가져온다. ]
   3. DB LEVEL
    - SELECT * FROM NLS_DATABASE_PARAMETERS ; 를 통해서 확인 가능
    - SELECT NAME, VALUE$ FORM SYS.PROPS$ WHERE NAME LIKE '%NLS%' ; 를 통해서 확인 가능
      [ NLS_DATABASE_PARAMETERS 에서 값을 가져온다. ]
    - SELECT * FROM V$NLS_PARAMETERS 를 통해서 확인 가능      
      [ NLS_DATABASE_PARAMETERS 에서 값을 가져온다. ]   
    -      
[테스트 1]
-- NLS_LANGUAGE 을 변경하고, DATE TYPE 의 데이타를 TO_CHAR 함수를 통해서 조회한다.
-- NLA_LANGUAGE, 엄밀히 말해서 NLS_DATE_LANGUAGE 값이 적용되는 것은
-- 요일 정보가  월요일, MON 으로 표기 되는 경우는 TO_CHAR,TO_DATE 사용 시에만 적용됩니다.
-- 현재 NLS_LANGUAGE 및 NLS_DATE_LANGUAGE 체크  
select * from nls_session_parameters
where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
--  NLS_LANGUAGE        AMERICAN
--  NLS_TERRITORY        AMERICA
--  NLS_DATE_FORMAT        DD-MON-RR
--  NLS_DATE_LANGUAGE    AMERICAN
--  NLS_SORT            BINARY
--  Client NLS_LANG Setting 값 없이 Database 에 Login 하면,
--  DB Creation 시의 Default 값이, 즉 NLS_LANGUAGE[AMERICAN],NLS_TERRITORY[AMERICA] 값을 가지게 된다.
--  또한 NLS_DATE_LANGUAGE[AMERICAN] 값은 특별히 지정하지 않는 경우 ,
--  NLS_LANGUAGE[AMERICAN] 값을 상속한다.
-- 데이타 조회(변경 없음)
SELECT HIREDATE FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980/12/17 00:00:00
-- TO_CHAR 를 사용해서 데이타 조회, DEC !!
SELECT TO_CHAR(HIREDATE,'YYYYMONDD') FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980DEC17
-- NLS_LANGUAGE 값을 KOREAN 으로 변경
ALTER SESSION SET NLS_LANGUAGE='KOREAN';
select * from nls_session_parameters
where PARAMETER in  ('NLS_LANGUAGE','NLS_TERRITORY','NLS_DATE_FORMAT','NLS_DATE_LANGUAGE','NLS_SORT');
--NLS_LANGUAGE        KOREAN
--NLS_TERRITORY        AMERICA
--NLS_DATE_FORMAT   DD-MON-RR
--NLS_DATE_LANGUAGE    KOREAN
--NLS_SORT            BINARY
===> NLS_LANGUAGE 값이 KOREAN 으로 변경되면, NLS_DATE_LANGUAGE 값도 KOREAN 으로 변경된다.
-- 데이타 조회(변경 없음)
SELECT HIREDATE FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 1980/12/17 00:00:00
-- TO_CHAR 를 사용해서 데이타 조회, 12월
SELECT TO_CHAR(HIREDATE,'YYYYMONDD') FROM SCOTT.EMP WHERE  EMPNO = 7369 ;
-- 198012월17

Posted by redkite
, |

Closed 백업(=Cold 백업)

  - Closed 백업은 데이터베이스가 Shutdown된 상태에서 백업을 하는 방법을 의미합니다.

  - ARCHIVE LOG MODE와 NOARCHIVE LOG MODE 둘 다 가능합니다.

  - 모든 DATA FILE, CONTROL FILE, REDOLOG FILE이 대상입니다.(정상적인 종료(normal, transactional, immediate)는 REDO LOG FILE을 반드시 백업할 필요는 없으나 복구할 때 간단하게 하기 위하여 백업을 해 두는 것이 좋습니다.)

  - 초기화 파라미터 파일은 변경되었을 경우에는 백업해 놓습니다.

  - 개념적으로 단순하여, 백업 및 복구방법이 용이 합니다.

  - NOARCHIVE LOG MODE일 경우에는 백업받은 시험 이후의 데이터는 보장하지 않으므로 장애가 발생하였을 경우는 변경된 사항은 수동으로 입력해 주어야 합니다.

1. 데이터파일, 컨트롤 파일, redo 로그 파일의 위치와 이름을 확인한다.
 
-- sqlplus를 실행합니다.
C:\> SQLPLUS /NOLOG

-- SYSDBA권한으로 접속합니다.
SQL> CONN / AS SYSDBA

-- Controlfile의 위치 및 이름을 확인합니다.
SQL> SELECT name FROM V$CONTROLFILE;




-- 데이터 파일들의 위치 및 이름을 확인합니다.
SQL> SELECT name,status FROM V$DATAFILE;




--Redo Log 파일들의 위치 및 이름을 확인 합니다.
SQL> SELECT * FROM V$LOGFILE;


    

2. 데이터베이스를 shutdown 합니다.
 
  
    

3. 대상 파일들을 전부 백업(copy)합니다.
 
  
    

4. 데이터베이스를 오픈 합니다.
 
  

Posted by redkite
, |

COLD BACKUP(오프라인 백업)

  - COLD BACKUP이란 오라클 SHUTDOWN후 DATAFILE, REDO LOG FILE, CONTROL FILE, PARAMETER FILE등을 OS의 복사명령으로 백업을 수행하는 방법을 말한다.

  - 백업받을 파일들의 목록은 V$DATAFILE, V$LOGFILE, V$CONTROLFILE에서 찾을 수 있다.

  - COLD BACKUP을 위해서 데이타베이스를 SHUTDOWN 할 때에는 NORMAL, IMMEDIATE 옵션을 사용해야 하며 ABORT 를 사용해서는 안 된다. ABORT 를 사용한 경우에는 SHUTDOWN 후에 다시 STARTUP 하고 NORMAL 로 SHUTDOWN 하도록 한다.

  - SHUTDOWN ABORT 옵션을 쓸 경우 Checkpoint 정보가 일치하지 않아 복구가 수행되지 않을 수 있으므로 이 옵션을 사용하지 말아야 한다.

  - SHUTDOWN 하지 않고 OPEN 된 상태에서 백업을 받으면 백업받은 내용을 나중에 사용할 수가 없으므로 유의해야 한다.

  - 콘트롤 화일과 데이타 화일 및 로그 화일의 위치를 확인하여 이들을 tar, cpio 등의 명령을 이용하여 백업 받도록 한다.

  - NT 에서는 COPY 명령이나 탐색기를 이용해서 백업을 받으면 된다.

  - 장점 : 읽기 일관성이 보장됨, 가장 간편하다.

  - 단점 : 데이터베이스 SHUTDOWN이 필요하므로 백업받는 동안 데이터베이스를 사용할 수 없으며, 백업이 수행된 시점까지만 복구가 가능하다

파일확인 방법

  오라클은 반드시 SHUTDOWN된 상태이어야 하며, 아래에서 확인한 세 종류의 파일들을 OS명령어(ex cp)로 백업받으면 된다. 필요에 따라서 파라미터(init.ora) 파일까지 받아두는 것이 좋다.

 
-- Oracle 8.1.7 sqlplus에서 system/manager로 접속

-- 콘트롤 파일 확인 
SQL> SELECT name FROM V$CONTROLFILE;

NAME
------------------------------------------
C:\ORACLE\ORADATA\ORACLE\CONTROL01.CTL
C:\ORACLE\ORADATA\ORACLE\CONTROL02.CTL
C:\ORACLE\ORADATA\ORACLE\CONTROL03.CTL


-- 데이타 파일 확인 
SQL> SELECT name FROM V$DATAFILE;

NAME
--------------------------------------------------
C:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF
C:\ORACLE\ORADATA\ORACLE\INDX01.DBF
C:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF
C:\ORACLE\ORADATA\ORACLE\USERS01.DBF
C:\ORACLE\ORADATA\ORACLE\STORM.DBF
C:\ORACLE\ORADATA\ORACLE\STORMIDX.DBF
C:\ORACLE\ORADATA\ORACLE\TEST.DBF


-- 로그 파일 확인
SQL>SELECT member FROM V$LOGFILE; 

MEMBER
------------------------------------
C:\ORACLE\ORADATA\ORACLE\REDO03.LOG
C:\ORACLE\ORADATA\ORACLE\REDO02.LOG
C:\ORACLE\ORADATA\ORACLE\REDO01.LOG 
    

오프라인 복구 예제

  COLD BACKUP 백업에 대한 복구는 장애가 발생한 시점까지가 아니라, 가장 최근의 백업시점 까지만 복구가 가능 하며, 백업 시점에서 현 시점까지의 데이터는 모두 잃어 버리게 된다.

동일한 디스크에 위치한 데이터파일 복구

  1. DB를 SHUTDOWN ABORT로 닫는다.

  2. 백업해두었던 DATAFILE, REDO LOG FILE, CONTROL FILE, PARAMETER FILE(init.ora) 들을 현재의 DB 데이터파일들이 위치한 곳으로 이동 시킨다(copy 작업).

  3. STARTUP MOUNT를 수행 한다.

  4. ALTER DATABASE OPEN RESETLOS 수행

상이한 디스크에 위치한 데이터파일 복구

  만일 디스크가 교체될 수 없는 경우, 파일들을 다른 디스크로 이동시켜 복구한다.

  1. DB를 SHUTDOWN ABORT로 닫는다.

  2. 백업해두었던 DATAFILE, REDO LOG FILE, CONTROL FILE, PARAMETER FILE(init.ora), PASSWORD FILD(orapwSID) 들을 다른 디스크로 이동

  3. PARAMETER FILE에서 CONTROL_FILES 파라미터를 수정한다.

  4. STARTUP MOUNT EXCLUSIVE 수행

  5. 새로운 디스크에 위치한 데이터파일들의 위치를 control파일에 갱신

 
ALTER DATABASE RENAME 
FILE '/u01/oracle/data/data01.dbf' 
TO '/u02/oracle/data/data01.dbf'
    

  6. DB백업(형식적인 절차)

  7. ALTER DATABASE OPEN RESETLOGS 수행

Posted by redkite
, |

SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE, R_CONSTRAINT_NAME, SEARCH_CONDITION
FROM USER_CONSTRAINTS;
-----------------------------------
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, VALIDATED, DEFERRABLE, DEFERRED
FROM USER_CONSTRAINTS;
-----------------------------------
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
FROM USER_CONS_COLUMNS;
-----------------------------------
SELECT A.TABLE_NAME, B.COLUMN_NAME, A.CONSTRAINT_NAME,
A.CONSTRAINT_TYPE, A.R_CONSTRAINT_NAME, A.SEARCH_CONDITION
FROM USER_CONSTRAINTS A, USER_CONS_COLUMNS B
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME;
-----------------------------------
SELECT T.TABLE_NAME, T.CONSTRAINT_NAME, C.COLUMN_NAME,
T.DEFERRABLE, T.DEFERRED, T.VALIDATED
FROM DBA_CONSTRAINTS T, DBA_CONS_COLUMNS C
WHERE T.CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND T.OWNER LIKE '%&OWNER%'
AND T.TABLE_NAME LIKE '%&TABLE_NAME%';
-----------------------------------
SELECT OBJECT_NAME, OBJECT_TYPE, OBJECT_ID, DATA_OBJECT_ID, CREATED, TIMESTAMP, LAST_DDL_TIME
FROM USER_OBJECTS
ORDER BY OBJECT_TYPE;
----------------------------------
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
-----------------------------------
SELECT *
FROM USER_SEQUENCES;
-----------------------------------
SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM USER_SYNONYMS;
-----------------------------------
SELECT TABLESPACE_NAME, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,
PCT_INCREASE, MIN_EXTLEN, STATUS, CONTENTS, ALLOCATION_TYPE
FROM DBA_TABLESPACES;
----------------------------------
롤백세그먼트의 일반적인 정보
SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME,
INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, STATUS
FROM DBA_ROLLBACK_SEGS;
----------------------------------
현재 인스턴트가 사용하고 있는 롤백세그먼트에 대한 통계 검색
SELECT N.NAME, S.EXTENTS, S.RSSIZE, S.OPTSIZE, S.HWMSIZE, S.XACTS, S.STATUS
FROM V$ROLLNAME N, V$ROLLSTAT S
WHERE N.USN = S.USN;
----------------------------------
롤백세그먼트에 대한 경합
SELECT N.NAME, ROUND(100*S.WAITS/S.GETS)
FROM V$ROLLNAME N, V$ROLLSTAT S
WHERE N.USN = S.USN;
----------------------------------
블록킹 트랜잭션
SELECT S.SID, S.SERIAL#, T.START_TIME, T.XIDUSN, S.USERNAME
FROM V$SESSION S, V$TRANSACTION T, V$ROLLSTAT R
WHERE S.SADDR = T.SES_ADDR
AND T.XIDUSN = R.USN
AND ((R.CUREXT = T.START_UEXT-1)
OR ((R.CUREXT = R.EXTENTS-1) AND T.START_UEXT = 0));
----------------------------------
인덱스에 대한 유효성 확인
SELECT BLOCKS, BTREE_SPACE, USED_SPACE, PCT_USED, LF_ROWS, DEL_LF_ROWS
FROM INDEX_STATS;
----------------------------------
SELECT USERNAME, USER_ID, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE, PROFILE
FROM DBA_USERS;
----------------------------------
SELECT TABLESPACE_NAME, BYTES, MAX_BYTES, BLOCKS, MAX_BLOCKS
FROM USER_TS_QUOTAS;
-----------------------------------
SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES,
AUTOEXTENSIBLE, INCREMENT_BY, MAXBYTES
FROM DBA_DATA_FILES;
-----------------------------------
SELECT FILE#, STATUS, RFILE#, BYTES, BLOCKS, CREATE_BYTES, BLOCK_SIZE, NAME
FROM V$DATAFILE;
-----------------------------------
SELECT FILE#, STATUS
FROM V$BACKUP;
-----------------------------------
SELECT *
FROM DBA_FREE_SPACE
ORDER BY BLOCK_ID;
-----------------------------------
SELECT A.TABLESPACE_NAME, A.BYTES, A.STATUS, B.STATUS, B.ENABLED, B.NAME
FROM DBA_DATA_FILES A, V$DATAFILE B
WHERE A.FILE_ID = B.FILE# AND A.TABLESPACE_NAME LIKE '%&TABLESPACE_NAME%';
-----------------------------------
SELECT TABLESPACE_NAME, EXTENTS_COALESCED, TOTAL_BYTES, BYTES_COALESCED
FROM DBA_FREE_SPACE_COALESCED;
-----------------------------------
SELECT A.TABLESPACE_NAME "TABLESPACE",
B.FILE_NAME "FILE",
B.BYTES "TOTAL SIZE",
C.BYTES "SIZE LEFT"
FROM DBA_TABLESPACES A, DBA_DATA_FILES B, DBA_FREE_SPACE C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME AND
A.TABLESPACE_NAME = C.TABLESPACE_NAME AND
A.TABLESPACE_NAME LIKE '%&TABLESPACE_NAME%';
-----------------------------------
SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS, INITIAL_EXTENT, NEXT_EXTENT
FROM USER_SEGMENTS;
-----------------------------------
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS, INDEX_TYPE, TABLESPACE_NAME
FROM USER_INDEXES;
-----------------------------------
SELECT LINE, POSITION, TEXT
FROM USER_ERRORS
ORDER BY SEQUENCE;
-----------------------------------
SELECT *
FROM USER_SOURCE;
-----------------------------------
SELECT SEGMENT_NAME, PARTITION_NAME, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS
FROM USER_EXTENTS
ORDER BY SEGMENT_NAME, EXTENT_ID;
-----------------------------------
SELECT TABLESPACE_NAME, SEGMENT_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS
FROM DBA_EXTENTS
ORDER BY EXTENT_ID;
-----------------------------------
SELECT OPERATION, OPTIONS, OBJECT_NAME, ID, PARENT_ID, POSITION
FROM PLAN_TABLE
ORDER BY ID;
-----------------------------------
SELECT NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN
FROM USER_TABLES;
-----------------------------------
SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY
FROM USER_TAB_COLUMNS;
-----------------------------------
SELECT TABLE_NAME, TABLE_TYPE_NAME, PARENT_TABLE_NAME, PARENT_TABLE_COLUMN
FROM USER_NESTED_TABLES;
-----------------------------------
SELECT *
FROM DBA_PROFILES;
-----------------------------------
SELECT *
FROM USER_RESOURCE_LIMITS;
-----------------------------------
SELECT *
FROM USER_PASSWORD_LIMITS;
-----------------------------------
SELECT *
FROM V$OPTION;
-----------------------------------
SELECT *
FROM V$PARAMETER;
-----------------------------------
SELECT DISTINCT OBJECT_TYPE
FROM DBA_OBJECTS;
-----------------------------------
SELECT OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_TYPE, CREATED
FROM DBA_OBJECTS
WHERE OWNER LIKE '%&OWNER%'
AND OBJECT_TYPE LIKE '%&OBJECT_TYPE%'
ORDER BY OBJECT_NAME;
-----------------------------------
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE TABLE_NAME LIKE '%&TABLE_NAME%'
ORDER BY OWNER, TABLE_NAME;
-----------------------------------
SELECT VIEW_NAME, TEXT
FROM DBA_VIEWS
WHERE VIEW_NAME LIKE '%&VIEW_NAME%';
-----------------------------------
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE LIKE '%&ROLE%';
-----------------------------------
SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM DBA_SYNONYMS
ORDER BY 2, 1, 3;
-----------------------------------
<클러스터>
클러스터의 일반적인 정보(블록파라미터..)
SELECT * FROM DBA_CLUSTERS
WHERE OWNER LIKE '%&OWNER%';
클러스터 테이블 및 클러스터 키 조회
SELECT OWNER, CLUSTER_NAME, CLU_COLUMN_NAME, TABLE_NAME
FROM DBA_CLU_COLUMNS
WHERE OWNER LIKE '%&OWNER%';
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE
FROM DBA_TAB_COLUMNS
WHERE OWNER LIKE '%&OWNER%';
-----------------------------------
IOT 조회
SELECT T.TABLE_NAME AS "IOT", O.TABLE_NAME AS "OVERFLOW",
I.INDEX_NAME AS "INDEX", O.TABLESPACE_NAME AS "OVERFLOW TBS",
I.TABLESPACE_NAME AS "INDEX TBS", I.PCT_THRESHOLD
FROM DBA_TABLES T, DBA_TABLES O, DBA_INDEXES I
WHERE T.OWNER = O.OWNER
AND T.TABLE_NAME = O.IOT_NAME
AND T.OWNER = I.OWNER
AND T.TABLE_NAME = I.TABLE_NAME
AND T.OWNER LIKE '%&OWNER%';
-----------------------------------
SELECT USERNAME, TIMESTAMP, ACTION_NAME
FROM DBA_AUDIT_TRAIL;
-----------------------------------
SELECT USERID, OBJ$NAME, SES$ACTIONS, TIMESTAMP#
FROM SYS.AUD$
WHERE OBJ$NAME LIKE '%&OBJECT_NAME%';
-----------------------------------
SELECT SESSIONID, STATEMENT, TIMESTAMP#, USERID, TERMINAL, ACTION#,
OBJ$CREATOR, OBJ$NAME, SES$ACTIONS, COMMENT$TEXT, SPARE1
FROM SYS.AUD$;

Posted by redkite
, |

Oracle FAQ's

V$% views return data from memory structures. Data is lost when the instance is restarted.
DBA_% tables return data from the database's data dictionary (SYSTEM tablespace). Data persists across instance restarts.

v$ view는 memory structure data를 보여주며, dba_ table(?)은 system tablespace 상의 data dictoinary data를 보여줍니다. 10g에서 awr 관련 view들이 만들어져서 dba_hist view 등에서 memory structure statistic data를 system tablespace에 저장해서 보여주기도 하죠.
다음의 HP's oracle blog에는 좀더 자세한 내용이 실려 있습니다..
HP's Oracle Blog

V$ & DBA_
Static Data Dictionary Views and Dynamic Performance Views are the core of database administration. They are of crucial importance. Whoever wants to learn Oracle database administration has to get familiar with these views.
The Data Dictionary tables contain meta data on objects, privileges, roles, users etc.
Whenever you issue DML statements Oracle consults its data dictionary to make sure a table is there, it has the right columns and you have privileges on it. And whenever you issue DDL statements Oracle updates its data dictionary.
All information needed by an instance on its database is kept in the data dictionary. Except some storage related information which is in the datafile headers and some information in controlfile and spfile which is needed at instance startup.
At runtime the oracle instance stores information about itself, about its CPU, memory or I/O performance, wait statistics and everything else which is going on at the instance in dynamic performance tables. Dynamic performance tables are non persistent. You can’t see past instance startup. After shutdown or instance crash all information contained in dynamic performance tables is lost. *1)
Through static dictionary views users can get at information kept in data dictionary tables.
And through dynamic performance views users can look at non persistent runtime information contained in dynamic performance tables.
But why are those views that important, you might ask? All information necessary for database administration can be found in those static dictionary views. And basically all information necessary for instance diagnostic and tuning can be obtained through those dynamic performance views at runtime.
Of course, GUI tools like Enterprise Manager or SQL Developer offer the same information
in a more user friendly manner. But all those GUI tools rely on static dictionary views and dynamic performance views.
As a DBA you will likely get into situations where there is no GUI tools available. At times you will be alone with your SQL*Plus skills. Your mastery of data dictionary and performance views will make all the difference!

Posted by redkite
, |

offline drop 명령어는 control file에서 datafile을 제거 후에
재생성 하는 것과 같은 이치입니다. 단지 차이는 데이터파일 명이 MISSING 인지
기존 파일명을 그대로 가지는지만 다르겠습니다.
- 컨트롤파일 재생성시
SQL> select name from v$datafile;
NAME


/u01/ora9i/oradata/PROD/system01.dbf
/u01/ora9i/oradata/PROD/undotbs01.dbf
/u01/ora9i/oradata/PROD/users01.dbf
/u01/ora9i/oradata/PROD/users02.dbf
/u01/ora9i/product/9.2.0/dbs/MISSING00005
/u01/ora9i/oradata/PROD/example01.dbf

일반 데이터가 들어가는 테이블스페이스의 데이터파일은 offline되었으므로
DB는 open이 가능합니다.하지만 해당 데이터파일을 복구하기 위해서는 백업과
archive가 필요합니다. offine drop된 데이터파일의 데이터를
읽으려고 할 경우에는 당연히 아래와 같은 메세지가 나고 해당 데이터는
복구 불능입니다. 일부를 추출하는 것도 여러 자료를 찾아보고
어떻게든 해보려고 했는데 안되네요.
테스트 해보기에는 block corruption 에러가 났을 경우에 수행하는
event를 적용했는데 역시 복구불능이었습니다.
dbms_repair로도 안되었습니다.
....
SQL> exec dbms_repair.admin_tables ( table_name => 'REPAIR_TABLE', -

table_type => dbms_repair.repair_table, -
action => dbms_repair.create_action, tablespace => 'EXAMPLE');

BEGIN dbms_repair.admin_tables ( table_name => 'REPAIR_TABLE', table_type => dbms_repair.repair_table, action => dbms_repair.create_action, tablespace => 'EXAMPLE'); END;
*
ERROR at line 1:
ORA-06550: line 1, column 83:
PLS-00201: identifier 'DBMS_REPAIR.REPAIR_TABLE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

SQL> select count(*) from hr.kkk;
select count(*) from hr.kkk
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/u01/ora9i/oradata/PROD/users03.dbf'



recovery 수행

SQL> !cp /u01/ora9i/oradata/PROD_KKK/users03.dbf /u01/ora9i/oradata/PROD/users03.dbf
SQL> recover datafile '/u01/ora9i/oradata/PROD/users03.dbf';
ORA-00279: change 67160 generated at 02/05/2007 23:56:37 needed for thread 1
ORA-00289: suggestion : /u01/ora9i/oradata/PROD/archive/1_9.dbf
ORA-00280: change 67160 for thread 1 is in sequence #9

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 67297 generated at 02/06/2007 00:41:03 needed for thread 1
ORA-00289: suggestion : /u01/ora9i/oradata/PROD/archive/1_10.dbf
ORA-00280: change 67297 for thread 1 is in sequence #10
ORA-00278: log file '/u01/ora9i/oradata/PROD/archive/1_9.dbf' no longer needed for this recovery

ORA-00279: change 67299 generated at 02/06/2007 00:41:04 needed for thread 1
ORA-00289: suggestion : /u01/ora9i/oradata/PROD/archive/1_11.dbf
ORA-00280: change 67299 for thread 1 is in sequence #11
ORA-00278: log file '/u01/ora9i/oradata/PROD/archive/1_10.dbf' no longer needed for this recovery

Log applied.
Media recovery complete.
SQL> alter database datafile '/u01/ora9i/oradata/PROD/users03.dbf' online;
Database altered.
SQL> select name, status from v$datafile;
NAME STATUS


-------
/u01/ora9i/oradata/PROD/system01.dbf SYSTEM
/u01/ora9i/oradata/PROD/undotbs01.dbf ONLINE
/u01/ora9i/oradata/PROD/users01.dbf ONLINE
/u01/ora9i/oradata/PROD/users02.dbf ONLINE
/u01/ora9i/oradata/PROD/users03.dbf ONLINE
/u01/ora9i/oradata/PROD/example01.dbf ONLINE
6 rows selected.

SQL> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS


---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
EXAMPLE ONLINE
SQL> select * from v$recover_file;
no rows selected
SQL> select count(*) from hr.kkk;
COUNT(*)
438272
Posted by redkite
, |

ORA-00031: session marked for kill 의 해결책

 

 

[TroubleShootings]

테이블이 락이 걸려서 TOAD의 사용이 막힌 경우 테이블의 락을 풀어줘야 하는데, 보통은 SYSTEM 계정으로 접근하여 아래와 같은 쿼리를 입력하면 테이블의 락이 해제된다.
 
ALTER SYSTEM KILL SESSION '16,4558';
 (* ALTER SYSTEM KILL SESSION 'SID_no,SERIAL_no';)
 

하지만, 테이블 락을 해제 쿼리를 입력하여도 ORA-00031 : session marked for kill 의 메시지가 나오는 경우 직접적으로 아래의 쿼리를 이용하여 oracle계정으로 시스템에 접근하여 프로세스를 kill하는 방법이 있다.
 (kill을 하여도 락이 해제가 되지 않고, 앞서 session marked for kill이라는 메시지만 출력 되는 이유는 rollback을 하는 프로세스가 동작하여 kill을 해도 mark만 하고 rollback 중인 상태이므로 현재 락은 걸린 상태라고 볼 수 있을 것 같다.)
 

select vs.sid, vs.username, vs.osuser, vs.process fg_pid,
vp.spid bg_pid
from v$session vs, v$process vp
where vs.paddr = vp.addr;
위의 쿼리를 실행하여, PID(ProcessID)를 확인 후 오라클 계정으로 시스템에 접근하여, kill명령어를 이용하여 해당 프로세스를 종료한다.
 
$ kill -9 pid
 
물론 앞서 메시지가 나오고 방금 kill이 안되는 경우에도 어느정도 시간을 갖고 기다리면 rollback segment의 수치가 점점 작아져 결국 테이블 락이 해제가 된다.
 

 

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함