P.S: 처리하고 난 후 비밀번호 생각하느라 이것저것 해본걸 생각하면 좀 억울한 생각마저 든다. 역시 아는만큼 보이는 것 같다.
'데이터베이스'에 해당되는 글 9건
- 2012/01/05 MySql root 계정 비밀번호 초기화 방법(mysql root 패스워드가 기억이 안날때)
- 2011/08/11 MSSQL 서버 2008 - 트랜잭션 로그 줄이기 (2)
- 2011/04/07 SQL Server Identity Column 초기화 하기 (4)
- 2010/01/28 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
- 2008/08/07 Oracle 10g XE(Express Edition)의 프로세스 및 세션 늘리는 방법 (1)
- 2008/07/24 오라클 사용자 생성 및 권한주기
- 2008/06/23 tablespace 늘리기
- 2008/06/22 Oracle exp / imp 실제 적용예
- 2008/05/15 Oracle의 character set을 확인하는 방법
P.S: 처리하고 난 후 비밀번호 생각하느라 이것저것 해본걸 생각하면 좀 억울한 생각마저 든다. 역시 아는만큼 보이는 것 같다.
트랜잭션 로그를 줄이는 방법을 검색해보면 대략 다음의 두가지 방법을 찾을 수 있다.
1. 데이터베이스 복구모델을 simple로 변경하는 방법
2. 트랜잭션 로그를 백업하고 로그파일 크기를 줄이는 방법
2번 방법에 대해서는 다음과 같이 수행한다.
2.1 로그파일 백업
backup log DatabaseName to disk='YourPath\YourFilename.trn'
2.2 로그파일 크기 줄임
dbcc shrinkfile('logfilename', 1024)
※ DatabaseName, logfilename 은 해당 DB 정보를 확인
※ YourPath, YourFilename 은 백업할 위치 및 파일명을 입력
그런데 이 방법을 사용하게 되면 한번에 잘될때도 있지만 사용이 빈번한 DB의 경우 한번에 줄어들지 않고 여러번 반복해야 원하는 크기로 줄일 수 있다.
다른 포스트와 다르게 참고 URL을 상단에 둔 이유가 바로 여기에 있다.
Otto R. Radke 라는 분의 블로그 인데 소개글이 재밌다.
Developer & designer. Americano drinker, tennis player. Goal: be simple, passionate & resourceful.
------------------------------------------------------------------------------
-- Otto R. Radke - http://ottoradke.com
-- Info: T-SQL script to shrink a database's transaction log. Just set the
-- database name below and run the script and it will shrink the
-- transaction log.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
-- Update the line below with the name of the database who's transaction
-- log you want to shrink.
------------------------------------------------------------------------------
USE YourDatabaseName
------------------------------------------------------------------------------
-- Don't change anything below this line.
------------------------------------------------------------------------------
GO
-- Declare variables
DECLARE @SqlStatement as nvarchar(max)
DECLARE @LogFileLogicalName as sysname
-- Alter the database to simple recovery
SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY SIMPLE'
EXEC ( @SqlStatement )
-- Make sure it has been altered
SELECT [name], [recovery_model_desc] FROM sys.databases WHERE [name] = DB_NAME()
-- Set the log file name variable
SELECT @LogFileLogicalName = [Name] FROM sys.database_files WHERE type = 1
-- Shrink the logfile
DBCC Shrinkfile(@LogFileLogicalName, 1)
-- Alter the database back to FULL
SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY FULL'
EXEC ( @SqlStatement )
-- Make sure it has been changed back to full
SET @SqlStatement = 'SELECT [name], [recovery_model_desc] FROM ' + DB_NAME() + '.sys.databases WHERE [name] = ''' + DB_NAME() + ''''
EXEC ( @SqlStatement )
------------------------------------------------------------------------------
실행해 보면 1M의 크기로 로그파일을 줄여준다. 너무 고마워서 해당 블로그에 답글도 쓰고 이렇게 국내에도 소개한다. 물론 검색을 잘하면 걸리기야 하겠지만.. ^^;
가장 쉬운방법. 하지만 테이블내에 있는 값들보다 작은 값을 설정하지 않도록 주의한다. 만약 작은 값이 설정되면 primary key violation(주키 위반)이 발생하기 때문이다.
구문: DBCC CHECKIDENT (<table name>,RESEED,<new value>)
예) DBCC CHECKIDENT ('TB_MB_MEMBER',RESEED,0)
Tip. 만약 DB 소유자가 아니고 권한만 있는 경우
USE <db name>
GO
2. Drop and Add the column
이 방법은 첫번째보다 조금 더 안정적인데 이유는 새로운 시드(seed)값을 자동으로 할당해 주기 때문이다. 그러나 많은 작업을 해야하고 컬럼의 순서가 변경된다.
당연한 얘기이겠지만 만약 코드에서 컬럼순서로 접근(access)하고 있었다면 컬럼순서를 재조정해야만 한다.
3. Drop and Create the table
이 방법은 두가지 문제 즉, 안정적으로 새로운 값을 설정하는 것과 컬럼의 순서를 유지하는 것이 해결된다. 그러나 이 방법 또한 많은 작업을 해야한다.
동일한 구조를 갖는 새로운 임시 테이블 생성 -> 모든 데이터를 임시 테이블로 복사 -> 이전 테이블 삭제(DROP) -> 임시 테이블 이름 변경
참고 사이트:
`Server_name` char(64) NOT NULL,
`Host` char(64) NOT NULL,
`Db` char(64) NOT NULL,
`Username` char(64) NOT NULL,
`Password` char(64) NOT NULL,
`Port` int(4) DEFAULT NULL,
`Socket` char(64) DEFAULT NULL,
`Wrapper` char(64) NOT NULL,
`Owner` char(64) NOT NULL,
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';
TNS-12519: TNS:no appropriate service handler found
위와 같은 에러가 발생하는 원인은 여러가지 일수 있으나 연결할 프로세스 또는 세션이 부족한 경우에도 발생한다.
다음과 같이 SQLPLUS에 접속하여 정보를 확인하고 프로세스나 세션이 임계치(limit)에 근접할경우 프로세스와 세션을 늘려준다.
만약 초기 설정하고 아무것도 변경하지 않은 경우 프로세스는 40, 세션은 49로 되어 있으며 여기에서는 100으로 설정할 계획이다.
변경순서
1. 프로세스 및 세션의 임계치를 확인한다.
2. 프로세스 및 세션의 임계치를 늘려준다.
3. 데이터베이스를 재시작한다.
1. 프로세스 및 세션의 임계치 확인
$> sqlplus / as sysdba
SQL> select * from v$resource_limit;
2. 프로세스 및 세션의 임계치 변경
프로세스 및 세션에 대한 설정값은
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/dbs/spfileXE.ora
에 정보가 있다. (/usr/lib/oracle/xe/app/oracle는 설치경로)
위의 파일을 직접 수정하는 방법도 있으나 아래와 같이 SQL 로 처리할 수 있다.
ALTER SYSTEM SET <parameter>=<value> SCOPE=SPFILE ;
예)
SQL> ALTER SYSTEM SET processes=100 SCOPE=SPFILE ;
SQL> ALTER SYSTEM SET sessions=100 SCOPE=SPFILE ;
3. 데이터베이스 재시작
SQL> shutdown immediate
SQL> startup
아래는 변경전후 파일내용이다.
변경전.
XE.__java_pool_size=4194304
XE.__large_pool_size=12582912
XE.__shared_pool_size=763363328
XE.__streams_pool_size=0
*.aq_tm_processes=0
*.audit_file_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/adump'
*.background_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/usr/lib/oracle/xe/oradata/XE/control.dbf'
*.core_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/cdump'
*.db_name='XE'
*.DB_RECOVERY_FILE_DEST_SIZE=10G
*.DB_RECOVERY_FILE_DEST='/usr/lib/oracle/xe/app/oracle/flash_recovery_area'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=XEXDB)'
*.job_queue_processes=0
*.open_cursors=300
*.os_authent_prefix=''
*.pga_aggregate_target=268435456
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=40
*.sga_target=805306368
*.shared_servers=4
*.undo_management='AUTO'
*.undo_tablespace='UNDO'
*.user_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/udump'
변경후.
XE.__java_pool_size=4194304
XE.__large_pool_size=12582912
XE.__shared_pool_size=763363328
XE.__streams_pool_size=0
*.aq_tm_processes=0
*.audit_file_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/adump'
*.background_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/usr/lib/oracle/xe/oradata/XE/control.dbf'
*.core_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/cdump'
*.db_name='XE'
*.DB_RECOVERY_FILE_DEST_SIZE=10G
*.DB_RECOVERY_FILE_DEST='/usr/lib/oracle/xe/app/oracle/flash_recovery_area'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=XEXDB)'
*.job_queue_processes=0
*.open_cursors=300
*.os_authent_prefix=''
*.pga_aggregate_target=268435456
*.processes=100
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=100
*.sga_target=805306368
*.shared_servers=4
*.undo_management='AUTO'
*.undo_tablespace='UNDO'
*.user_dump_dest='/usr/lib/oracle/xe/app/oracle/admin/XE/udump'
1. 계정의 테이블 스페이스 생성
create tablespace [tablespace_name]
datafile '/home/oracle/oradata/DANBEE/[file_name].dbf' size 500m;
예)
CREATE TABLESPACE ADMIN DATAFILE 'D:\ORACLE\ORADATA\XE\ADMIN.dbf' SIZE 500M ;
2. 오라클 유저 만들기
CREATE USER [user_name]
IDENTIFIED BY [password]
DEFAULT TABLESPACE [tablespace_name]
TEMPORARY TABLESPACE TEMP;
예)
CREATE USER nextree IDENTIFIED BY nextree DEFAULT TABLESPACE NEXTREE TEMPORARY TABLESPACE TEMP;
3. 생성한 USER에 권한주기
GRANT connect, resource, dba TO [user_name];
예)
grant connect, dba, resource to 유저명; (모든 권한 주기)
GRANT CREATE SESSION TO 유저명 // 데이터베이스에 접근할 수 있는 권한
GRANT CREATE DATABASE LINK TO 유저명
GRANT CREATE MATERIALIZED VIEW TO 유저명
GRANT CREATE PROCEDURE TO 유저명
GRANT CREATE PUBLIC SYNONYM TO 유저명
GRANT CREATE ROLE TO 유저명
GRANT CREATE SEQUENCE TO 유저명
GRANT CREATE SYNONYM TO 유저명
GRANT CREATE TABLE TO 유저명 // 테이블을 생성할 수 있는 권한
GRANT DROP ANY TABLE TO 유저명 // 테이블을 제거할 수 있는 권한
GRANT CREATE TRIGGER TO 유저명
GRANT CREATE TYPE TO 유저명
GRANT CREATE VIEW TO 유저명
GRANT
CREATE SESSION
,CREATE TABLE
,CREATE SEQUENCE
,CREATE VIEW
TO 유저명;
4. 생성한 USER로 ORACLE에 접속하기
sqlplus nextree/nextree[@db_sid]
5. 계정 삭제하기
drop user 사용자계정 cascade;
-- 테이블 스페이스 크기 확장해주는 쿼리문
alter database
datafile 'D:\oracle\oradata\XE\ADMIN.DBF' resize 900M;
--테이블 스페이스 정보 보는 쿼리문
SELECT file_name, tablespace_name, bytes, status FROM DBA_DATA_FILES;
--테이블 명시적 인덱스 생성
--1번째 방법
CREATE INDEX MSID_IDX1 ON TEST(MSID)
--2번째 방법
create index test1_test on test1(test)
tablespace users
storage
(
initial 10k
next 10k
pctincrease 0)
pctfree 10
--테이블 정보 보는 쿼리
select * from user_constraints-- where table_name = upper('test1');
--ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다 해결 방법
select a.sid, a.serial#
from v$session a, v$lock b, dba_objects c
where a.sid=b.sid and
b.id1=c.object_id and
b.type='TM' and
c.object_name='CAR_INFO';
alter system kill session '12, 27846';
-- CAR_INFO에는 있는 값을 DASH_BOARD에 넣기
INSERT INTO DASH_BOARD(CAR_LICEN_NUM)
SELECT CAR_LICEN_NUM FROM CAR_INFO
MINUS
SELECT CAR_LICEN_NUM FROM DASH_BOARD
SYSTEM 계정 패스워드 변경하기
사용자계정 : /as sysdba
alter user system identified by "암호";
일반 스트링은 관계없지만 특수문자가 있을경우 반드시 "" 따옴표로 감싸준다.
SQLPLUS접속,
1. tablespace 정보 얻기
2. tablespace 이름 조회
3. tablespace이름으로 포함된 filename 찾기
4. tablespace 늘리기
alter tablespace 테이블스페이스명 add datafile '(새)파일명포함경로' size 용량M
- 기존파일 resize
alter datafile datafile '파일명포함경로' resize 변환용량 M
TOPIC 1. SCOTT의 데이타를 LARRY로 옮기는 방법
scott의 데이타를 larry 로 옮기려면 export/import 를 이용해야 한다.
larry가 만들어져 있지 않다면 다음과 같이 만든다.
$ sqlplus system/manager
SQL> create user larry
identified by lion
default tablespace users
temporary tablespace temp
quota unlimited on users;
default tablespace, temporary tablespace 는 시스템에 따라 알맞게 설정한다.
다음과 같이 larry에게 권한을 부여한다.
sql> grant connect, resource to larry
sql> revoke unlimited tablespace from larry
물론 users 테이블스페이스는 이미 존재한다고 가정한다.
scott로 export를 받고 larry로 import한다.
$ exp scott/tiger file=scott.dmp
$ imp larry/lion file=scott.dmp fromuser=scott touser=larry
만약 scott 가 dba 권한을 갖고 있었다면 다음과 같이 import를 해야 한다.
Using imp:
To import the full database exported in the example above.
imp SYSTEM/password FULL=y FIlE=dba.dmp
To import just the dept and emp tables from the scott schema
imp SYSTEM/password FIlE=dba.dmp FROMUSER=scott TABLES=(dept,emp)
To import tables and change the owner
imp SYSTEM/password FROMUSER=blake TOUSER=scott FILE=blake.dmp TABLES=(unit,manager)
To import just the scott schema exported in the example above
imp <user>/<password> FIlE=scott.dmp
$ imp system/manager file=scott.dmp fromuser=scott touser=larry
만약 import 도중 연속된 저장 공간이 부족해서 에러가 발생한다면 익스포트를
받을 때 compress=n 옵션을 사용하며, import 시 롤백 세그먼트 문제가 발생
한다면 import 시 commit=y 옵션을 사용하면 쉽게 해결이 가능하다.
---
-- 테이블삭제
drop table SC_AUTHORITY cascade constraints;
drop table SC_BRANCH cascade constraints;
drop table SC_BRANCHDESCRIPTION cascade constraints;
drop table SC_BRANCHPHOTO cascade constraints;
drop table SC_BUSINESSDATEMASTER cascade constraints;
drop table SC_COMMONCODE cascade constraints;
drop table SC_CONNECTION_HISTORY cascade constraints;
drop table SC_FAVORITE cascade constraints;
drop table SC_LARGECOMMONCODE cascade constraints;
drop table SC_MANAGEMENTSALESYSTEM cascade constraints;
drop table SC_MENU cascade constraints;
drop table SC_PAYMENTMETHODACCOUNT cascade constraints;
drop table SC_PAYMENTMETHODMAPPING cascade constraints;
drop table SC_POSTCODE cascade constraints;
drop table SC_ROLE cascade constraints;
drop table SC_SALEACCOUNT cascade constraints;
drop table SC_STORE cascade constraints;
drop table SC_USER cascade constraints;
drop table SC_USER_ROLE cascade constraints;
drop table SC_USER_SESSION cascade constraints;
drop table SC_USE_LOG cascade constraints;
-- 테이블덤프 추가(import)
imp shresort_fo/shcenter FILE=shresort-20080621.dmp TABLES=SC_AUTHORITY,SC_BRANCH,SC_BRANCHDESCRIPTION,SC_BRANCHPHOTO,SC_BUSINESSDATEMASTER,SC_COMMONCODE,SC_CONNECTION_HISTORY,SC_FAVORITE,SC_LARGECOMMONCODE,SC_MANAGEMENTSALESYSTEM,SC_MENU,SC_PAYMENTMETHODACCOUNT,SC_PAYMENTMETHODMAPPING,SC_POSTCODE,SC_ROLE,SC_SALEACCOUNT,SC_STORE,SC_USER,SC_USER_ROLE,SC_USER_SESSION,SC_USE_LOG
-- 테이블스페이스 기본 설정값 확인
select username, default_tablespace, temporary_tablespace from dba_users where username = 'SHRESORT_FO'
-- 테이블스페이스 변경
alter table SC_AUTHORITY move tablespace SHRESORT_FO;
alter table SC_BRANCH move tablespace SHRESORT_FO;
alter table SC_BRANCHDESCRIPTION move tablespace SHRESORT_FO;
alter table SC_BRANCHPHOTO move tablespace SHRESORT_FO;
alter table SC_BUSINESSDATEMASTER move tablespace SHRESORT_FO;
alter table SC_COMMONCODE move tablespace SHRESORT_FO;
alter table SC_CONNECTION_HISTORY move tablespace SHRESORT_FO;
alter table SC_FAVORITE move tablespace SHRESORT_FO;
alter table SC_LARGECOMMONCODE move tablespace SHRESORT_FO;
alter table SC_MANAGEMENTSALESYSTEM move tablespace SHRESORT_FO;
alter table SC_MENU move tablespace SHRESORT_FO;
alter table SC_PAYMENTMETHODACCOUNT move tablespace SHRESORT_FO;
alter table SC_PAYMENTMETHODMAPPING move tablespace SHRESORT_FO;
alter table SC_POSTCODE move tablespace SHRESORT_FO;
alter table SC_ROLE move tablespace SHRESORT_FO;
alter table SC_SALEACCOUNT move tablespace SHRESORT_FO;
alter table SC_STORE move tablespace SHRESORT_FO;
alter table SC_USER move tablespace SHRESORT_FO;
alter table SC_USER_ROLE move tablespace SHRESORT_FO;
alter table SC_USER_SESSION move tablespace SHRESORT_FO;
alter table SC_USE_LOG move tablespace SHRESORT_FO;
SELECT value$
FROM sys.props$
WHERE name = 'NLS_CHARACTERSET'

