Windows 오라클 Hot backup 자동 백업, 삭제 배치파일 만들기
 
 
작성자: 강명호 (myungho@empal.com   www.mhkang.info)
작성일: 2007년 2월 22
 
 
2 Win오라클 Hot backup 자동 백업,삭제 
 
Windows 환경에서 오라클 백업 솔루션 없이 오라클을 사용하시거나
RMAN을 사용하는 것이 부담스러운 분들을 위해서 만들어봤습니다.
부족하지만 여러분께 도움이 되길 바랍니다.
그리고 써보시고 문제점이나 불편한점, 좋은점 있으시면 리플달아주세요~
 
 
파일 설명
hot1.bat - %BACKUP_PATH%\1 디렉토리의 파일이 삭제되고 hotbackup1.sql이 수행된다.
hot2.bat - %BACKUP_PATH%\2 디렉토리의 파일이 삭제되고 hotbackup2.sql이 수행된다.
hot3.bat - %BACKUP_PATH%\3 디렉토리의 파일이 삭제되고 hotbackup3.sql이 수행된다.
 
hotbackup1,2,3.sql - hot backup 수행
 
 
장점
배치파일이 수행될 때 백업될 디렉토리의 파일이 먼저 삭제되고 백업이 이루어지기 때문에 더 이상 Disk가 꽉 차는 현상(Disk Full)을 막을 수 있다.
hot1.bat, hot2.bat, hot3.bat를 수행할 경우 항상 3벌의 Backup Set을 보유한다.
(hot1.bat, hot2.bat만 수행할 경우 2벌의 Backup Set을 보유한다.)
 
 
단점? 고려사항?
Database files Size가 클 경우 로컬 디스크에 3벌의 백업을 보유할 수 없기 때문에 hot1.bat, hot2.bat 만 수행하던지 hot1.bat 만 수행하도록 한다.
혹은 hot1.bat 만 수행하고 충분한 Disk 공간이 있는 원격지로 FTP 전송한다.
 
 
 
 
1. 배치파일 만들기
시작 --> 실행 --> notepad  실행하여 각각 배치파일의 내용을 붙여넣기 한 다음 설정된 파일 이름으로 변경한다.
(
저장경로 E:\BACKUP\HOT\)
* BACKUP_PATH Hot Backup 받을 공간이 충분한 영역으로 설정하세요
 
hot1.bat
set oracle_sid=ORCL
SET BACKUP_PATH=E:\BACKUP\HOT
for %%i in (%BACKUP_PATH%\1\*) do DEL %%i%
D:\oracle\ora90\bin\sqlplus /nolog @E:\BACKUP\HOT\hotbackup1.sql
 
 
hot2.bat
set oracle_sid=ORCL
SET BACKUP_PATH=E:\BACKUP\HOT
for %%i in (%BACKUP_PATH%\2\*) do DEL %%i%
D:\oracle\ora90\bin\sqlplus /nolog @E:\BACKUP\HOT\hotbackup2.sql
 
hot3.bat
set oracle_sid=ORCL
SET BACKUP_PATH=E:\BACKUP\HOT
for %%i in (%BACKUP_PATH%\3\*) do DEL %%i%
D:\oracle\ora90\bin\sqlplus /nolog @E:\BACKUP\HOT\hotbackup3.sql
 
 
 
2. Hot backup sql문 만들기
* Tablespace, Datafile 경로는 여러분의 환경에 맞게 수정하세요
tablespace, datafile명은 http://blog.empas.com/myungho/5577095  참조하세요
 
hotbackup1.sql
connect sys/manager as SYSDBA
set echo on
spool E:\BACKUP\HOT\1\hotbackup_1.log
alter system switch logfile;
alter tablespace SYSTEM begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF E:\BACKUP\HOT\1\SYSTEM01.DBF
alter tablespace SYSTEM end backup;
alter tablespace MHKANG begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\MHKANG.DBF E:\BACKUP\HOT\1\MHKANG.DBF
alter tablespace MHKANG end backup;
alter tablespace UNDOTBS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF E:\BACKUP\HOT\1\UNDOTBS01.DBF
alter tablespace UNDOTBS end backup;
alter tablespace USERS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\USER01.DBF E:\BACKUP\HOT\1\USER01.DBF
alter tablespace USERS end backup;
alter database backup controlfile to trace;
alter database backup controlfile to 'E:\BACKUP\HOT\1\control1.bak' reuse;
alter system switch logfile;
spool off
exit;
 
 
hotbackup2.sql
connect sys/manager as SYSDBA
set echo on
spool E:\BACKUP\HOT\2\hotbackup_2.log
alter system switch logfile;
alter tablespace SYSTEM begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF E:\BACKUP\HOT\2\SYSTEM01.DBF
alter tablespace SYSTEM end backup;
alter tablespace MHKANG begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\MHKANG.DBF E:\BACKUP\HOT\2\MHKANG.DBF
alter tablespace MHKANG end backup;
alter tablespace UNDOTBS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF E:\BACKUP\HOT\2\UNDOTBS01.DBF
alter tablespace UNDOTBS end backup;
alter tablespace USERS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\USER01.DBF E:\BACKUP\HOT\2\USER01.DBF
alter tablespace USERS end backup;
alter database backup controlfile to trace;
alter database backup controlfile to 'E:\BACKUP\HOT\2\control2.bak' reuse;
alter system switch logfile;
spool off
exit;
 
 
hotbackup3.sql
connect sys/manager as SYSDBA
set echo on
spool E:\BACKUP\HOT\3\hotbackup_3.log
alter system switch logfile;
alter tablespace SYSTEM begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF E:\BACKUP\HOT\3\SYSTEM01.DBF
alter tablespace SYSTEM end backup;
alter tablespace MHKANG begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\MHKANG.DBF E:\BACKUP\HOT\3\MHKANG.DBF
alter tablespace MHKANG end backup;
alter tablespace UNDOTBS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF E:\BACKUP\HOT\3\UNDOTBS01.DBF
alter tablespace UNDOTBS end backup;
alter tablespace USERS begin backup;
host D:\oracle\ora92\bin\ocopy.exe D:\ORACLE\ORADATA\ORCL\USER01.DBF E:\BACKUP\HOT\3\USER01.DBF
alter tablespace USERS end backup;
alter database backup controlfile to trace;
alter database backup controlfile to 'E:\BACKUP\HOT\3\control3.bak' reuse;
alter system switch logfile;
spool off
exit;
 
 
 
 
3. 작업 예약 설정하기

매주 일요일 새벽 1 Hot backup 받는 작업 예약하기
C:\> at 01:00 /every:Su D:\ORA_BACKUP\hot1.bat
 
매주 화요일 새벽 1 Hot backup 받는 작업 예약하기
C:\> at 01:00 /every:T D:\ORA_BACKUP\hot2.bat
 
매주 목요일 새벽 1 Hot backup 받는 작업 예약하기
C:\> at 01:00 /every:Th D:\ORA_BACKUP\hot3.bat
 
 
 
AT 명령 변수 설명
 /every: date ,... :
이 매개 변수를 사용하여 매주 금요일이나 매월 8일처럼
지정된 요일이나 날짜에 작업을 실행하도록 예약합니다.
하나 이상의 요일(다음 약자 사용: M,T,W,Th,F,S,Su)이나
하나 이상의 날짜(숫자 1 - 31 사용) date를 지정합니다.
쉼표를 사용하여 여러 날짜 항목을 구분해야 합니다.
이 매개 변수를 생략하면 현재 날짜에 작업이 실행되도록 예약됩니다.
2009/03/19 14:47 2009/03/19 14:47

No. 21525

10G: TRANSPORTABLE TABLESPACES ACROSS DIFFERENT PLATFORMS

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



Purpose
-------
이 자료에서는 서로 다른 Platform 으로 Tablespaces 를 transport 하는 방법에 대해
설명하고자 한다.



Explanation
-----------
10g 에서는 서로 다른 platform 으로 tablespace 를 transport 할 수 있으며
transport 가능한 platform 정보는 다음과 같다.


SQL> select * from v$transportable_platform;

PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ------------------------------ --------------
1 Solaris[tm] OE (32-bit) Big
2 Solaris[tm] OE (64-bit) Big
7 Microsoft Windows NT Little
10 Linux IA (32-bit) Little
6 AIX-Based Systems (64-bit) Big
3 HP-UX (64-bit) Big
5 HP Tru64 UNIX Little
4 HP-UX IA (64-bit) Big
11 Linux IA (64-bit) Little
15 HP Open VMS Little
8 Microsoft Windows IA (64-bit) Little
9 IBM zSeries Based Linux Big
13 Linux 64-bit for AMD Little
16 Apple Mac OS Big
12 Microsoft Windows 64-bit for AMD Little


10g 이전 version 까지는 동일한 platform 에 대해서만 지원하였으며 10g 에서는
서로 다른 platform 에서도 tablespace 이동이 가능하도록 지원하고 있다.

Transportable Tablespaces 가 사용되어지는 사례는 다음과 같다.

1. 다른 platform 으로 database 를 migration 하고자 할때
2. 서로 다른 platform 의 DW 환경에서 Distribute data 를 data marts 로 이동을 원할 경우
3. Publish structured data 를 기존과 다른 platforms 으로 통합하고자 할 경우 등 입니다.

Transportable Tablespaces 를 위단 Step 은 다음과 같습니다.

1. Tablespace 를 READ ONLY 상태로 변경한다.

SQL> alter tablespace REPOSIT read only;
Tablespace altered.


2. Metadata 를 다음 과 같이 export 한다.

$ exp userid=\'/ as sysdba\' transport_tablespace=y
tablespaces=reposit
file=tts.dmp log=exp_tts.log
statistics=none

Export: Release 10.1.0.1.0 - Beta on Mon Nov 24 11:49:49 2003
...

Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
For tablespace REPOSIT ...
. exporting cluster definitions
. exporting table definitions
. . exporting table MTG_COL_DEP_CHG
. . exporting table MTG_DATABASES
....
. . exporting table SYBASE11_SYSUSERS
. exporting referential integrity constraints
. exporting triggers
. end transportable tablespace metadata export
Export terminated successfully without warnings.


3. 이동하고자 하는 target database platform 의 ENDIAN_FORMAT 정보를 확인한다.
Case 1 의 경우는 query 결과 ENDIAN_FORMAT 이 같은 상태로 conversion 필요 없이
Tablespaces 이동이 가능하고 Case 2 의 경우에는 ENDIAN_FORMAT 이 다른 경우로
ENDIAN_FORMAT conversion 을 위해 RMAN 을 이용하여 아래와 같이 추가적인 작업이 필요하다.

Case 1
------
The source platform is Sun SPARC Solaris: endianness Big
The target platform is HP-UX (64-bit): endianness Big

SQL> select PLATFORM_ID , PLATFORM_NAME from v$database;

PLATFORM_ID PLATFORM_NAME
----------- ------------------------------
3 HP-UX (64-bit)


No conversion needed.


Case 2
------
The source platform is Microsoft WIndows NT: endianness Little
The target platform is HP-UX (64-bit): endianness Big

다음과 같이 endian format 이 다른 상태에서 작업시 다음과 같이 에러가 발생한다.

. importing SYS's objects into SYS
IMP-00017: following statement failed with ORACLE error 1565:
"BEGIN sys.dbms_plugts.beginImpTablespace('TBS_TTS',37,'SYS',1,0,8192,2,57"
"54175,1,2147483645,8,128,8,0,1,0,8,462754339,1,1,5754124,NULL,0,0,NULL,NULL"
"); END;"
IMP-00003: ORACLE error 1565 encountered
ORA-01565: error in identifying file '/database/db101b2/V101B2/datafile/reposit01.dbf'
ORA-27047: unable to read the header block of file
HP-UX Error: 2: No such file or directory
Additional information: 2
ORA-06512: at "SYS.DBMS_PLUGTS", line 1540
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully

결국, Tablespace import 를 하기전에 RMAN 을 통해 files convert 작업이 필요하다.

$ rman target=/

Recovery Manager: Release 10.1.0.1.0 - 64bit Beta
connected to target database: V101B2 (DBID=3287908659)

RMAN> convert tablespace 'REPOSIT'
2> to platform="Linux IA (32-bit)"
3> db_file_name_convert='/database/db101b2/V101B2/datafile/reposit01.dbf',
4> '/tmp/reposit01.dbf';

Starting backup at 24-NOV-03
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=8 devtype=DISK
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00006 name=/database/db101b2/V101B2/datafile/reposit01.dbf
converted datafile=/tmp/reposit01.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Finished backup at 24-NOV-03

Convert 된 files 은 /tmp 디렉토리에 존재하게 되고 이를 target server 에 copy 한다.


4. Datafile 과 export dump file 을 ftp 를 이용하여 move 한다.

$ftp tts.dmp
+
/database/db101b2/V101B2/datafile/reposit01.dbf (no conversion)
or
/tmp/reposit01.dbf (converted file if conversion had been required)


5. Metadata 를 import 한다.

$ imp userid=\'/ as sysdba\' TRANSPORT_TABLESPACE=Y
datafiles=/database/db101b2/V101B2/datafile/reposit01.dbf
(or /tmp/reposit01.dbf )
file=tts.dmp log=imp_tts.log

Import: Release 10.1.0.1.0 - Beta on Mon Nov 24 03:37:20 2003

Export file created by EXPORT:V10.01.00 via conventional path
About to import transportable tablespace(s) metadata...
...
. importing SYS's objects into SYS
. importing OMWB's objects into OMWB
. . importing table "MTG_COL_DEP_CHG"
...
. . importing table "SYBASE11_SYSUSERS"
Import terminated successfully without warnings.


6. Import 가 성공적으로 끝나면 tablespace 를 READ WRITE 상태로 변경한다.

SQL> alter tablespace reposit read write;
Tablespace altered.



Example
-------
none

2009/03/19 14:43 2009/03/19 14:43
오라클 한글깨짐 문제 처리법입니다.
원인은 오라클의 서버와 클라이언트간의 NLS_LANG설정문제 때문입니다.
이것을 일치시켜 주어야 하는데.
 
Step by Step.
시작 -> 실행
regedit으로 레지스트리 편집기를 열고, " HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ "의 하위 폴더에보면 자신의 오라클베이스폴더가 있습니다. 그것을 클릭해보면 NLS_LANG키가 있는데. 키값을 KOREAN_KOREA.KO16MSWIN949 KOREAN_KOREA.KO16KSC5601 로 바꿔줍니다.
레지스트리편집기를 끈후 다시 시작 -> 실행
cmd로 커맨드입력창을 하나 띄웁니다.
sqlplus /nolog
conn /as sysdba;
update props$ set VALUE$='KO16MSWIN949' where name='NLS_CHARACTERSET';
commit;
shutdown immediate;(데이터베이스를 언마운트 하는작업이라 시간이 걸립니다.)
startup;
 
예를 들어, 다음의 query를 수행한 결과가 다음과 같다면
select name, value$ from sys.props$;
NAME                         VALUE$
--------------------  ----------------
NLS_LANGUAGE         AMERICAN
NLS_TERRITORY         AMERICA
NLS_CHARACTERSET  KO16MSWIN949
 
NLS_LANGUAGE의 값을 AMERICAN -> AMERICAN_AMERICA.KO16MSWIN949
설정하여 사용해야 합니다.
2009/03/18 13:15 2009/03/18 13:15
SQL 2000에서 백업을 이용한 백업파일(*.bak)은 기본적으로 SQL2005에서 복원할 수 없다. 따라서 SQL2000이 설치된 서버에서 SQL2005를 다시 설치하는 업그레이드를 이용하던가, 혹은 SQL2000의 mdf, ldf 파일을 보관한 후 SQL2005를 새로 설치한 후 attach db하는 방법을 사용해야 한다.
참고사이트: http://www.microsoft.com/sql/solutions/upgrade/default.mspx
 
예제
RESTORE FILELISTONLY
    FROM DISK = 'D:\Northwind.bak'
RESTORE DATABASE Northwind
FROM DISK = 'D:\Northwind.bak'
WITH MOVE 'Northwind' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Northwind_data.mdf',
MOVE 'Northwind_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Northwind_data.ldf',
stats = 10
exec sp_helpdb Northwind
exec sp_dbcmptlevel 'Northwind', '90' -- Compatibility Level 이 80이므로 MSSQL 2005는 90이다
이와같이 하면 MSSQL 2000의 가장 유명한 샘플인 Northwind와 pubs를 2005로 옮겨와서 쓸 수 있다.
2008/08/06 11:08 2008/08/06 11:08
오라클 10g http://1270.0.01:8080/apex 포터및 접근권한 변경

1.포터번호 변경
SQL>EXEC DBMS_XDB.SETHTTPPORT(원하는포트번호);

2.접근권한 변경
SQL>EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);
2007/11/09 13:02 2007/11/09 13:02

DBA의 역할과 책임


  DBA의 역할
 

시스템과 조직에 따라 DBA의 임무에 차이가 있을 수 있지만 일반적으로 대부분의 DBA는 다음과 같은 작업들을 책임지고 수행해야 하는 임무를 가집니다.

■ 설치와 환경설정
  • 소프트웨어 설치
  • 환경 설정 
  
■ 보안 관리

■ 운영
  • 백업과 복원
  • 사용자 관리
  • 기타 일상적인 운영 업무
  
■ 서비스 레벨 유지
  • 성능 최적화 및 성능 모니터링
  • 용량 계획 (Capacity Planning)
  
■ 시스템 가동 시간 관리
  • 시스템 정지 시간의 계획과 일정 관리
  
■ 문서화 작업

■ 작업 절차 계획 및 규격화
  • 운영 유지보수 계획 수립
  • 재난 복구 계획 수립

■ 설계 및 개발 지원
  • 데이터 모델링
  • 데이터베이스 설계
  • 저장 프로시저 개발
  • 응용 프로그램 개발
  
■ 개발 환경 관리
  • 개발 시스템 환경 별도 제공 및 개발 시스템 관리
  
■ 긴급 상황 해결/장애 복구

■ SQL Server 관리에 필요한 지식 숙지

  DBA 작업의 기본적인 원칙
 

DBA가 시스템 유지를 위하여 일반적으로 수행하는 모든 작업들에 대하여 기본적으로 다음과 같은 원칙에 의거하여 작업할 것을 권고합니다.

 

■ 작업 표준화 체계 수립
표준화는 관리에 있어서 매우 중요한 요소입니다. 자신의 시스템에 가장 적합한 표준화체계를 수립하고, 전체 시스템에 대하여 표준화된 관리 체계를 적용하여 관리해야 합니다.
다중의 DB 서버를 관리하는 경우에는 표준화가 특히 중요합니다.

■ 문서화
DB 관리와 같이 중요한 작업은 사람의 기억에 의한 주먹구구식의 작업이 되어서는 안됩니다. 어떤 경우라도 항상 정확하고 일관된 작업이 가능하도록 문서화가 필요합니다. 기록 가능한 모든 작업들에 대해서 문서화하고, 변경이 발생하면 지속적으로 업데이트하는 관리가 필요합니다.

 • 작업 매뉴얼 : 작업 수행 절차에 대한 정보 (설치, 장애 복구, 백업과 복원 전략, 
   주기적으로 수행하는 작업 등에 대한 작업 절차 및 참고 사항이 이에 포함될 수 있으며, 
   일반적이고 중요한 정보는 운영 매뉴얼에 기록하여 모든 DBA가 참조할 수 있도록 합니다.)
 • 시스템 환경에 대한 정보 : 서버의 하드웨어, 소프트웨어, 네트워크 등에 대한 정보
   담당자 및 관계자에 대한 정보 : 시스템과 관련된 내/외부 조직에 포함되는 모든 사람과 
   하드웨어/소프트웨어 제품 및 서비스 공급업체 및 담당자에 대한 정보
 • 장애 기록 일지 : 발생된 문제와 문제 해결에 관한 모든 절차에 대한 기록 (장애 기록에
   대한 내용은 활용 및 검색이 용이하도록 웹 기반으로 만들어, 유사한 문제의 재발 시
   에 신속하게 처리할 수 있도록 합니다.)

■ 스크립트화
반복적, 주기적으로 수행하는 모든 작업들은 엔터프라이즈 관리자를 사용하는 대신, 스크립트를 작성하여 수행하는 것을 원칙으로 합니다. 스크립트를 사용하면 오류 발생 가능성을 최소화할 수 있으며 반복적인 작업을 효율적으로 수행할 수 있습니다.
스크립트는 보안을 위하여 안전한 디렉터리에 중앙 집중적으로 관리하는 것이 바람직하며, 스크립트 작성 시에는 응용 프로그램과 마찬가지로 주석을 기술하여 쉽게 이해하고 활용할 수 있도록 합니다. 만약 주석만으로 불충분한 경우에는 문서를 작성하여 관리합니다.

■ 자동화
주기적으로 수행해야 하는 작업들은 가능한 한 자동화하여 DBA의 업무 효율성을 제고할 것을 권고합니다. 예를 들어 DB 서버 성능 데이터의 수집, 디스크 공간의 확인, 백업, 블로킹 가능성 여부 점검, 데이터 타입 오버플로우 감지 등의 작업들은 자동화가 가능합니다.
단순히 수행을 자동화하는 차원을 넘어서, SQL Server에서 제공하는 다양한 기능들을 활용하면 자동으로 경고 메일의 발송, 문자 메시지의 발신, 문제 해결을 위한 작업의 수행 등이 가능하기 때문에, DBA가 지속적으로 시스템을 모니터링하지 않더라도 시스템에 발생한 문제를 조기에 감지하는 것이 가능합니다.
DBA가 주기적으로 수행되는 작업에 할애하는 시간은 가능한 한 최소화하고, 주기적인 관리 작업을 통하여 확보한 지식을 기반으로 응용 프로그램과 서버의 성능을 향상시키기 위한 전략을 모색하는데 많은 시간을 할애하는 것이 바람직합니다.

■ 신중한 변경 관리 및 롤백 전략 수립
운영중인 시스템에 어떤 변경작업을 수행하는 경우에는 가능한 한 충분한 사전 테스트를 거친 후에 작업해야 하며, 롤백 전략을 수립한 다음에 작업하는 것을 원칙으로 합니다. 또한 한번에 여러 가지 변경 작업을 수행하지 말고, 하나의 변경 작업을 수행하고 그 변경 작업이 미친 영향을 관찰하는 것이 바람직합니다.
모든 변경 작업에 대해서 롤백 전략을 수립하는 것이 원칙이며, 롤백에 필요한 사항들을 문서로 기록하고 롤백에 필요한 스크립트 등을 작성하고 테스트하여 검증합니다. 특히 대용량 데이터베이스의 경우에는 문제 발생 시 복구에 소요되는 시간이 길기 때문에 충분한 사전 테스트와 롤백 전략 수립이 매우 중요합니다.

  DBA가 주기적으로 수행해야 하는 작업
 

시스템에 따라 차이가 있을 수 있지만, DBA는 시스템 유지를 위하여 일반적으로 수행해야 하는 작업들에 대하여 이해하고 있어야 하며, 다음과 같은 작업들을 주기적으로 수행해야 합니다.

 

■ 일 단위로 수행해야 하는 작업
표준화는 관리에 있어서 매우 중요한 요소입니다. 자신의 시스템에 가장 적합한 표준화체계를 수립하고, 전체 시스템에 대하여 표준화된 관리 체계를 적용하여 관리해야 합니다.
다중의 DB 서버를 관리하는 경우에는 표준화가 특히 중요합니다.

 • 시작되어야 할 서비스들이 제대로 시작되어 있는지 확인합니다.
 • Windows NT 또는 Windows 2000의 이벤트 뷰어를 사용하여 오류 발생 여부를 점검
   합니다.
 • SQL Server 오류 로그에 오류 메시지가 기록되어 있는지 점검합니다. 자세한 내용은
   [SQL Server 오류 로그 보기]를 참조하십시오.
 • 데이터베이스 파일과 로그 파일의 확장에 대비하여 디스크에 충분한 여유 공간이 있
   는지 확인합니다.
 • 데이터베이스 파일과 로그 파일의 크기와 실제로 사용되는 공간을 모니터링하며, 공
   간 부족으로 자동 확장이 예상되는 경우에는 미리 파일을 확장하여 충분한 공간을 확
   보합니다.
 • SQL Server 작업(Job)의 성공/실패 여부를 점검합니다.
 • 매일 데이터베이스 전체 백업 또는 차등 백업을 수행하기로 되어 있는 경우라면, 데이
   터베이스 전체 백업을 수행합니다. 자동화되어 있는 경우에는 백업이 성공적으로 수
   행되었는지 점검합니다. 데이터베이스 전체/차등 백업 주기는 시스템 여건과 복원 전
   략에 따라 달라집니다.
 • SQL Server 트랜잭션 로그를 백업 받습니다. 자동화되어 있는 경우에는 백업이 성공
   적으로 수행되었는지 점검합니다. 백업 주기는 시스템 여건에 따라 분 단위, 시간 단
   위, 일 단위로 달라질 수 있으며, 트랜잭션 백업 주기에 따라 트랜잭션 로그 파일의 적
   정 크기가 달라집니다. 참고로 복원이 불필요한 테스트 DB에 대해서는 복구 모델을
   단순으로 설정하면 트랜잭션 로그에 대한 주기적인 관리를 줄일 수 있습니다.
 • Master, model, msdb, 배포(distribution) 데이터베이스도 변경 사항이 있으면 주기적
   으로 백업해야 합니다. 시스템 카탈로그의 변경이 이루어진 후에는 master 데이터베
   이스의 전체 백업을 수행합니다. 경고, 작업(Job), 운영자, 로그 전달(log-shipping), 
   복제, DTS 패키지 등에 변경이 발생한 다음에는 msdb를 백업해야 합니다. Model 데이
   터베이스에 변경작업을 수행한 다음에는 model을 백업해야 합니다.
 • 시스템 모니터를 사용하여 성능 카운터를 모니터링함으로써, 적절한 성능이 유지되고
   있는지 점검합니다. 최소한 시스템 모니터에서 프로세서, 메모리, 디스크(I/O), 네트워
   크에 대한 카운터들은 필수로 점검해야 합니다. 문제 발생 시 또는 추가적인 분석이
   필요한 경우에는 관련 성능 카운터들을 추가로 분석합니다.
 • 복구 모델이 전체 복구가 아니라면, 최소 로깅 작업(Minimal-logged operation)을 수행
   한 다음에는 차등 백업을 수행합니다.
   블로킹, 교착상태(Deadlock)의 발생 여부를 점검합니다.
 • 오래 수행되는 쿼리 또는 리소스를 과다하게 사용하는 쿼리가 있는지 점검합니다.
   문제가 발생하면 문제 해결을 위한 활동을 수행하며, 문제 분석 및 해결 과정에 대한
   내용을 가능한 한 상세하게 문서화합니다.
 • 통계 자동 갱신(Auto update statistics) 옵션이 비활성화되어 있는 데이터베이스의 테
   이블들에 대해서는 주기적으로 (예:매일, 매주) UPDATE STATISTICS 작업을 수행합니다.

■ 주간 단위로 수행해야 하는 작업

 • 모든 시스템 데이터베이스와 운영중인 사용자 데이터베이스에 대한 전체/차등 데이
   터베이스 백업을 수행합니다.
 • 통계 자동 갱신(Auto update statistics) 옵션이 비활성화되어 있는 데이터베이스의 
   테이블들에 대해서 UPDATE STATISTICS를 매일 또는 매주 수행합니다.
 • 인덱스의 조각화를 제거합니다. CREATE INDEX WITH DROP_EXISTING 또는 DBCC 
   DBREINDEX를 수행하여 인덱스를 재구성함으로써 물리적, 논리적 조각화를 제거할 수 
   있으며, DBCC INDEXDEFRAG를 사용하면 논리적인 조각화를 제거할 수 있습니다. 자세한 
   내용은 온라인 설명서를 참조하십시오.
 • 대형 일괄 처리의 작업 등으로 인하여 로그 파일이 과다하게 확장된 경우에는 로그 
   파일의 사용되지 않는 여분의 공간을 제거합니다.

■ 월간 단위로 수행해야 하는 작업

 • 전체 운영 체제를 백업합니다.
 • 최소 월 1회 모든 시스템 데이터베이스와 운영 데이터베이스에 대하여 전체 백업을
   수행해야 합니다.
 • DBCC CHECKDB를 수행하여 데이터베이스의 무결성을 점검합니다. DBCC
   CHECKDB를 수행하면 서비스나 다른 작업에 영향을 미칠 수 있으므로, 테스트 장비
   에 모든 시스템 데이터베이스와 운영 데이터베이스를 복원하고, 복원된 모든 시스템
   데이터베이스와 운영 데이터베이스를 대상으로 DBCC CHECKDB를 수행하여 무결
   성을 점검하는 것이 바람직합니다.
 • Sqldiag.exe를 수행하고 결과를 저장합니다.
 • 성능 데이터를 수집하여 시스템이 충족시켜야 하는 기준과 비교하여, 성능 향상 및 향
   후의 용량 계획에 활용합니다.

[참고] 정확한 점검을 위해서는 모든 유지 관리 활동 작업에 대하여 로그를 저장하는 것 이 필요합니다. 데이터베이스 유지 관리 계획 마법사와 SQL Server 작업(Job)에서는 자동으로 작업 결과를 저장하도록 설정 가능합니다.
2007/01/02 10:19 2007/01/02 10:19
### 솔라리스 - 오라클 8.1.6 설치하기 ###


Intel 이나 Sparc이나 설치에는 아무이상이 없습니다.

* 오라클 설치환경

- OS : 솔라리스 2.8 SPARC 버전
- RDBMS : 오라클 8.1.6 Enterprise
- System : Netra T1
- HDD : 18GB(최소운영용량 3GB)

* 환경설정 ( %,$ : 일반유저 Prompt, # : Root유저 Prompt )

설치환경의 오라클유저에게 설정해야 할 사항
- 관리자툴을 이용하여 사용자(oracle)와 그룹(dba)를 등록한다.
등록된 유저의 기본쉘은 csh로 설정한다.
# admintool
- 오라클 유저의 홈을 만들어서 셀환경을 설정하여 준다.
% mkdir -P /oracle/product/8.1.6
% vi .cshrc
.cshrc안의 내용에는 뒤쪽 참고 1의 내용 그대로를 입력하여 저장하면 된다.
- Root 유저를 이용하여 /oracle 디렉토리의 소유권을 변경한다.
# chown -R oracle:dba /oracle
- /etc/system 의 내용을 참고 4와 동일하게 변경한다.
- 이제까지 변경한 내용이 적용될 수 있도록 시스템을 Reboot한다.
- Reboot된 시스템의 환경을 확인하여 /etc/system의 설정이 적용되었는지 확인한다.
# sysdef
- Root유저를 이용하여 그래픽 모드를 변경하여 준다.
# xhost + cdm-svr(ip)
- oracle유저를 이용하여 화면모드를 설정한다.(cdm-svr은 hostname)
% setenv DISPLAY cdm-svr:0.0
- oracle유저를 이용하여 /cdrom/cdrom0에 있는 오라클을 실행한다
% ./runInstaller


* Oracle Universal Installer
작업의 진행상황은 각 안내문의 타이틀앞의 두개의 원을 확인하면 알 수 있다.
작업의 진행율에 따라 계기일식의 모양이 일어나기 때문에 완료가 되면 두개의 원이
완전히 겹치게 된다.

1. Welcome
오라클의 runInstaller를 실행하면 환영인사말이 나온다.
Next를 선택한다.

2. File Locations
Source는 products파일이 위치한 Full Path이다. 기본으로 설정되어 있으니 그대로 적용하면
된다. Destination은 서버측의 오라클 홈디렉토리의 Full Path를 적용한다.
설치자가 임의대로 사용하고자 하는 위치를 설정해 주면 된다.

예)/oracle/product/8.1.6
Next를 선택한다.

3. UNIX Group Name
유닉스 그룹명을 지정하는 부분이다.이전에 DB그룹명으로 등록된 이름을 적용하면 된다.

예) dba
Next를 선택한다.

4. orainstRoot.sh 실행하기
/tmp/OraInstall/orainstRoot.sh의 스크립트를 실행한다.
이때 root 유저를 사용하여 다른 터미널창에서 실행하기 바란다.

예) ./tmp/OraInstall/orainstRoot.sh
실행후 Retry를 선택한다.

5. Availcable Products
- Oracle8i 8.1.6.0.0
오라클 8.1.6 DB 서버설치
- Oracle8i Client 8.1.6.0.0
오라클 8.1.6 DB 클라이언트 설치
- Oracle8i Management Infrastructure 8.1.6.0.0
오라클 8.1.6 기본 클라이언트와 서버관리툴 설치
Oracle8i 8.1.6.0.0을 클릭한 후 Next를 선택한다.

6. Installation Types
인스톨 유형을 선택하는 부분이다.
- Typical(966MB)
가장 일반적인 인스톨 형태로 필요한 모든 툴을 설치한다.
- Minimal(798MB)
최소한의 기본적인 툴만을 인스톨한다.
- Custom
사용자가 직접 필요한 툴을 선택하여 인스톨을 결정한다.
우리는 여기서 Custom을 선택한다.
이유는 DB에서 한글을 사용하기 위해서이다. 위의 Typical과 minimal은 컴퓨터가 기본으로
선택되어 있는 양식을 그대로 설치하기 때문에 언어선택부분이 기본 영문으로 설정되어 있기
때문에 닥스오픈에서 한글내용을 검색하면 ????로 출력이 된다.
Custom을 선택하여 Korean을 추가선택 할 것이다.
Custom을 클릭한 후 Next를 선택한다.

7. Available Product Components
Oracle8i의 패키지를 추가하거나 제외시킬 수가 있다.
여기서 우리는 먼저 Product Languages..을 선택하여 Language Selection의 작업창에서 Available Languages에서 Korean을 찾아서 더블클릭을 하면 Selected Language부분에 추가가
될 것이다. OK를 선택한다.
그리고 나서 오라클 패키지에 대한 설치를 추가할 것과 제외할 것을 선정하여 선택한 다음
Next를 선택한다. 추가/제외를 모를경우 Next를 선택해도 무방하다.

8. Component Location
선택할 수 있는 Component인 Java Runtime Environment 1.1.8.10을 선택하여 설치할 수 있다.
그러나 그냥 Next를 선택한다.

9. Privileged Operating System Groups
데이터베이스의 관리자 그룹명과 운영그룹을 설정하는 부분이다.
이전작업에서 우리는 dba를 선택한적이 있다.
이곳에서도 역시 두 곳 모두 dba를 입력하여 준다.

10. Create Database
데이터베이스 생성에 대한 질문이다.
Yes를 클릭한 후 Next를 선택한다.

11. Database Identification
Global Database Name과 SID를 입력하는 부분이다.
작업환경에 맞게 입력하길 바란다. 본 문서에서는 ORA8로 입력하였다.
입력후 Next를 선택한다.

12. Database File Location
Directory for Database Files의 저장위치를 설정한다.
여기에서는 /oracle/data로 설정하였다.
입력후 Next를 선택한다.

13. Summary
이제까지 수행한 작업에 대한 확인절차이다.
꼭 필히 확인해야할 부분은 Product Language를 확인하여 English와 Korean이 있는지 확인을
하기 바란다.
확인이 끝났다면 Install을 선택한다.

14. Install
이제부터 선택된 패키지와 설정된 내용으로 설치가 시작된다.

15. Setup Privileges
Step8에서 /oracle/product/8.1.6/root.sh을 root 유저가 실행한다.
실행한 다음질문에 Yes 또는 default로 설정된 내용은 엔터를 입력하면서 수행한다.
완료가 되었다면 실행명령형 대화상자의 OK를 선택한다.

16. Net8 Configuration Assistant
Perform typical configuration을 클릭한 후 Next를 선택한다.

17. Oracle Database Configuration Assistant
데이터베이스에 사용될 응용프로그램의 주요 유형 선택이다.
- OLTP(온라인 트랜잭션 프로세싱)
- 데이터 웨어하우징
- 다목적
여기서 우리는 다목적을 클릭하고 다음을 선택한다.

18. 동시 접속 사용자
동시에 접속할 수 있는 사용자(Process)의 대략적인 수를 입력한다.
입력후 다음을 선택한다.

19. 데이터베이스가 기본으로 실행될 모드
- 전용서버모드(dedicate)
- 공유서버모드
전용서버모드를 클릭한 후 다음을 선택한다.

20. 데이터베이스용으로 구성할 옵션
SQL Plus Help를 선택하여 도움말을 설치한다. 다음을 선택한다.

21. 데이터베이스 정보변경
검토후 적절한 정보로 변경한다.
꼭 문자집합변경(charecterset)은 KO16KSC5601로 문자집합과 국가별 문자집합이
변경되었는지 확인하여야 한다.
초기화 파일명을 변경하고자 하면 관리가 가능한 적절한 디렉토리명으로 변경한다.
변경이 완료되었다면 다음을 선택한다.

22. 제어파일 매개변수 변경
제어파일에 대한 변경이다.
관리가 용이한 적절한 디렉토리명과 기타사항을 변경/수정한 후 다음을 선택한다.
그대로 진행하여도 무관하지만 디렉토리명이 길어지면 관리하기에 불편하다.

23. 시스템/도구/사용자/롤백/인덱스/임시
시스템 Size 200
도구 Size 8
사용자 Size 8
롤백 Size 256 Minimum 256 Initial 256 Net 256
인덱스 Size 54
임시 Size 128
정보를 확인후 적절하게 변경한다.
변경이 완료되었다면 다음을 선택한다.

24. Redo 로그 파일 매개변수
리두 로그파일 매개변수정보 변경사항이다.
변경후 다음을 선택한다.

25. 로그 매개변수
정보를 검토후 적절하게 변경한다. 아카이브로그사용은 사용하지 않는다.
변경후 다음을 선택한다.

26. SGA 매개변수
정보를 검토후 적절하게 변경한다. 변경후 다음을 선택한다.

27. 추적 파일 디렉토리
추적파일디렉토리에 대한 경로를 검토후 적절히 변경한다.
변경후 다음을 선택한다.

28. 데이터베이스 생성
- 지금 데이터베이스 생성
- 쉘 스크립트에 정보 저장
지금 데이터베이스생성을 클릭후 완료를 선택한다.

29. 데이터베이스 생성 작업 진행
다음의 작업이 순서대로 진행된다.
- Oracle 인스턴스 생성과 시작
- 데이터베이스 파일 생성
- 데이터 딕셔너리 뷰 생성
- PL/SQL 지원 추가
- 데이터베이스 생성 완료

30. End of Installation
오라클 8i의 설치가 완료되었습니다.
Exit를 선택하여 설치화면을 빠져 나오면 설치작업은 종료가 된다.


--- 참고사항 ----

* 솔라리스 Hostname IP 변경후 오라클 재설정
$Oracle_Home/network/admin/Listener.ora 파일내용에 HostName를 변경하면 된다.
$Oracle_Home : .cshrc에 설정된 오라클 홈디렉토리를 말한다.

* 오라클 DataBase 올리기
오라클 유저를 이용하여 작업을 수행한다.
% svrmgrl 오라클 서버매니저 실행
svrmgrl> connect internal 일반적인 접속방법(권장)
connect system/manager system 관리자로 접속하는 방법
connect scott/tiger scott 일반유저로 접속하는 방법(아이디/비밀번호)
svrmgrl> startup 오라클 Database 시작
svrmgrl> exit 오라클 서버매니저 나오기
% lsnrctl start 리스너 시작하기(오라클 연결 데몬)

* 오라클 DataBase 내리기
svrmgrl> connect internal
svrmgrl> shutdown 모든 시스템 사항을 무시하고 Database가 내려짐
shutdown immediate Process가 모두 내려진 다음에 Database가 내려짐
(권장)
shutdown abort Process는 남겨두고 Database가 내려짐
ctrl + D 모든 시스템 사항을 무시하고 Database가 내려짐
svrmgrl> exit 오라클 서버매니저 나오기
% lsnrctl stop 리스너 종료하기(오라클 연결 데몬)



참고 1. $ORACLE_HOME/.cshrc

#@(#)cshrc 1.11 89/11/29 SMI
umask 022
set path=(/bin /usr/oracle/product/8.1.6/bin /usr/bin /usr/ucb /usr/css/bin /opt/SUNWspro/bin /etc .)

setenv TERM vt100
setenv ORACLE_TERM vt100
setenv ORACLE_HOME /usr/oracle/product/8.1.6
setenv ORACLE_SID TTT
setenv ORACLE_OWNER oracle
setenv LANG ko
setenv NLS_LANG KOREAN_KOREA.KO16KSC5601
setenv EDITOR vi
setenv LD_LIBRARY_PATH $ORACLE_HOME/lib:/opt/SUNWspro/lib:/usr/lib:/opt/SUNWspro/SC5.0/lib:/usr/ccs/lib
set path=(/sbin /usr/bin /openwin/bin /opt/SUNWspro/SC5.0/bin $ORACLE_HOME/bin /usr/ccs/bin .)


* 변경된 쉘 정보 반영하기
# source .cshrc
# env 현재 적용된 환경정보 확인

참고 2. /etc/passwd

oracle:x:1001:11::/oracle/product/8.1.6:/bin/csh

참고 3. /etc/group

root::0:root,oracle
dba::11:root,adm,daemon,oracle

참고 4. /etc/system

forceload:sys/shmsys
forceload:sys/semsys
forceload:sys/msgsys

// 오라클 Shared memory 설정
set shmsys:shminfo_shmmax=251658240
set shmsys:shminfo_shmmin=50
set shmsys:shminfo_shmmni=256
set shmsys:shminfo_shmseg=256

// 오라클 세마포어 설정
set semsys:seminfo_semume=128
set semsys:seminfo_semmap=128
set semsys:seminfo_semopm=64
set semsys:seminfo_semmni=2048
set semsys:seminfo_semmni=2048
set semsys:seminfo_semmns=2048
set semsys:seminfo_semmnu=2048
set semsys:seminfo_semmsl=400 // 세마포어 실수량(Process 수)

// for/background 작업용 프로토콜 Msg 매개변수 설정 (IPC)
set msgsys:msginfo_msgmap=512
set msgsys:msginfo_msgmax=8192
set msgsys:msginfo_msgmnb=65536
set msgsys:msginfo_msgmni=256
set msgsys:msginfo_msgssz=8
set msgsys:msginfo_msgtql=512
set msgsys:msginfo_msgseg=8192

set maxusers=1000 // 최대유저수 정의
set max_nprocs=10000 // ps -ef 명령시 프로세스 출력수
set rlim_fd_max=1500 // 한 개의 프로세스가 관장하는 파일수
set rlim_fd_cur=128
set pt_cnt = 128 // /dev/ptXXXXX 가상터미널 수(Telnet)

감사합니다.
2005/07/05 15:15 2005/07/05 15:15
mysql을 설치하여 사용하다보면, 서버부하가 없음에도 불구하고 "Warning...too many connections...."라는 메시지와 함께 MySQL 이 죽는 경우가 있습니다.

원인은 Mysql의 실행환경변수 설정에 있습니다 .

우선 Mysql설치홈의 bin디렉토리에서 "./mysqladmin -u -p variables"라고 해보시면 다음과 유사한 결과를 얻으실수 있습니다.


max_connections | 1000

wait_timeout | 300



와 같은 것을 볼수 있습니다 .



max_connections는 mysql에 connect할수 있는 최대 갯수를 지정해 둔것입니다.

"too many connections"라는 메시지는 이 갯수를 초과해서 connect하려고 할때 발생하는 메시지입니다.



결론부터 말씀드리자면 이 갯수를 적절히 조절해야한다고 말씀드릴수 있습니다.

하지만, max_connections 아래에 있는 wait_timeout이란 variable은 connect된 후에 몇초간 지속적으로 연결을 유지할 것인가를 지정해 둔 것입니다.



이를 설명하기 위해서는 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요한데.



간단히 설명해 보자면, mysql_connect()함수로 DB connect를 했다면 해당스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지않아도 자동으로 연결이 종료됩니다.



하지만, mysql_pconnect()함수는 해당스크립트가 종료된후 mysql_close()함수가 호출되었더라도 연결이 끊어지지않은채로 계속 연결을 유지하고 있습니다.



따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만, 그런 이유도 있을수 있지만, 직접적인 이유는 그것이 아니라 MySQL의 메뉴얼을 보면 mysql_connect()함수를 사용하면 해당스크립트의 종료와 함께 연결이 종료된다고 되어있지만

./mysqladmin -u -p processlist"라는 명령어를 통해서 살펴보면 그대로 살아 있음을 알수 있습니다.

맨위에서 살펴보았던 "mysqladmin -u -p variables"의 결과로서 볼수 있는 여러가지 시작옵션들중 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한채로 남아 있는 것입니다.

따라서, 이것이 "too many connections"의 직접적인 이유인 것입니다.

그렇다면 문제의 해결은 간단하게

실행옵션을 주어서 이들 값들을 자기가 운용하고 있는 서버의 성능과 용도에 알맞게 수정해 주면 됩니다.

MySQL실행시에 주는 실행옵션값은 다음과 같습니다.

./safe_mysqld -O max_connections=1000 -O table_cache=256 -O wait_timeout=300 &


일반적으로 실행시킬때에는 기본옵션을 그대로 사용하는 "./safe_mysqld"라는 옵션을 사용하면.

이렇게 실행하면 36개의 MySQL시작옵션중에서 위의 3가지 옵션들만 값들을 임의로 지정하여 실행시킨 것입니다.

이렇게 실행시킨후에 다시 "mysqladmin -u -p variables"로 옵션들값을 확인해 보면 변경되어 있음을 알수 있을 것이다.



그리고, 참고로 리눅스 실행시에 mysql을 자동으로 시작하도록 설정해둔 /etc/rc.d/rc.local파일에도

위와 같이 옵션을 함께 주어서 실행하도록 설정하는 것을 잊지말기 바랍니다.
2005/07/05 14:56 2005/07/05 14:56
[root@op bin]# ./mysql -h localhost -u isseo -p isseo
Enter password:
ERROR 1203: User myunggoni@localhost has already more than 'max_user_connections' active connections

max_user_connections 는 서버에 허용되는 클라이언트 최대 수를 나타냅니다.
max_user_connections 가 100 으로 설정되어 있을때 100을 초과하는 클라이언트의
접속은 허용되지 않습니다.
웹으로 접속하도록 한 프로세스건, 쉘에서 mysql 클라이언트로 접속하건 물론
마찬가지입니다.
동시 사용자수가 현재의 설정값보다 많지 않은지 또는 프로그램에서 DB 커넥션을
제대로 릴리즈 하지 않는지를 점검할 필요가 있습니다.

/etc/my.cnf 에서 max_user_connections 파라메터 값을 변경하실 수 있습니다.
또한, mysqladmin 유틸리티 또한 하나의 커넥션을 맺어야 하므로 이 에러 상황에서는
mysqladmin 유틸리티의 실행 또한 동일한 에러를 발생할 것입니다.

DB 를 셧다운 한 후 파라메터 값을 변경할 것을 권장합니다.
2005/07/05 14:52 2005/07/05 14:52
Q ./mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through
socket '/var/lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the
socket: '/var/lib/mysql/mysql.sock' exists!

mysql접속시도를 하거나 아니면 서버를 실행하려고 mysql.server start 를
실행하면 이런메세지가 뜨면서 실행이 되질 않습니다
왜그런것져?

A.
에러는 /var/lib/mysql/mysql.sock 이 이미 있다는 얘기입니다. 그래서
mysql 이 현재 구동중인 것이 아닌가 확인해 보라는 내용이네요.

mysql process 가 있는지 확인해 보시고, 있으면 kill 로 죽이시고, mysql.sock
을 지우신 후에 재 시작 해 보십시오.
2005/07/05 14:34 2005/07/05 14:34

mysql 설치시 오류.

MySQL 2005/07/04 14:42
#configure
#make
make[2]: *** [mysql] 오류 1
make[2]: 나감 `/data/php/mysql-3.23.35/client' 디렉토리
make[1]: *** [all-recursive] 오류 1
make[1]: 나감 `/data/php/mysql-3.23.35' 디렉토리
make: *** [all-recursive-am] 오류 2
오류

위와 같은 오류가 날 때에는 gcc -v로 gcc 버젼을 확인
하신 후 버젼이 낮을 경우 최신의 버젼으로 받아서 설치 후
컴파일 하시면 위와 같은 오류는 나오지 않을 것입니다.
2005/07/04 14:42 2005/07/04 14:42
아래 내용은 mysql설치 후 소켓에러가 발생했을 시 해결하는 방법입니다.

[에러 내용]
Warning: Can't connect to local MySQL server through socket '/home/mysql/mysql.sock'
(111) in /home/dspaper/public_html/board/index.html on line 15

[문제의 원인]
실제로 mysqld 에 의한 socket 파일은 /tmp/mysql.sock 에 존재하는데 PHP 나 mysql 과 같은
프로그램들은 그 파일을 /var/lib/mysql/mysql.sock 에서 찾습니다. 그러니 당연히 mysqld 와
의사소통이 될리가 없고, 접속이 안된다고 에러가 납니다.

[해결방법]
1. ln -sf /tmp/mysql.sock /var/lib/mysql/mysql.sock
이 해결법은 가장 간단하게 할 수 있지만 문제점은 리부팅 되고 나면 그때마다 다시 이
soft link 를 걸어 줘야 합니다. 왜냐하면 이 파일은 일반적인 파일이 아닌 unix socket
파일이기 때문입니다.

2. msyqld 기동시에 --socket=/var/lib/mysql/mysql.sock 라는 옵션을 추가
이 방법은 강제적으로 소켓 파일을 원하는 디렉토리에 만들도록 해 줍니다. 그러므로 mysqld의
소켓파일이 저 디렉토리에 생성만 된다면 문제는 해결이 되겠지요.

3. PHP 연동시 client 측에서 socket 파일의 위치를 지정해 주는 방법
$conn = mysql_connect("localhost:/tmp/mysql.sock","db_user","db_passwd");
이 방법은 클라이언트 측에서 서버측의 소켓파일의 위치를 명시해 주는 방법입니다.
2005/07/04 12:29 2005/07/04 12:29

Mysql DB백업 받는법

MySQL 2005/07/04 11:27
우선 클라이언트두 mysqldump 명령을 쓸수 있게
관리자 가 /bin 밑에 mysqldump 명령을 복사 해주어야 합니다.
그래야 클라이언트 사용자두 그 명령을 사용할 수 있으니까요..

그런후 아래와 같은 옵션을 써서 디비 백업 받으면 됩니다.

형식:
$ mysqldump [OPTIONS] database [tables]

설명:
테이블이 생략되면 전체 태이블을 백업.
예제:
$ mysqldump --opt database > backup-file.sql
$ mysqldump --opt database | mysql --host=remote-host -C database
$ mysqldump --quick -c -ujhs -p jhs > jhs.out.sql
$ mysqldump --quick -c -t --add-locks -urp bizaide110 > bae110.data.sql

마지막 예제 처럼, -u, -p 가 데이터베이스 앞에와야하며,
데이터베이스는 맨 뒤에 와야한다.


도움말:
$ mysqldump --help

주의: 만약, --quick 이나 --opt 없이 덤프하면 메모리가 많이 소모되어
큰 데이터베이스의 경우 문제가 발생할 수 있다.

옵션:
--add-locks
테이블의 덤프하기전에 해당 테이블을 잠그고 덤프한 후에
테이블을 풀어준다.
-c, --complte-insert
INSERT 구문에서 필드명을 포함한 전체를 덤프
-f, --force
덤프 중 에러가 있어도 계속 진행
-h, --host
특정 호스트의 MySQL 에서 데이터 덤프
-t, --no-create-info
테이블 생성 정보는 덤프하지 않음(데이터만 덤프)
-d, --no-data
테이블 스키마만 덤프
-q, --quick
버퍼를 사용하지 않고 바로 표준출력으로 보낸다.


위의 예기는 원론적인 예기구요..
실사용예
만약 사용자가 할당 받은 디비 이름이 hahaha 라면
그 디비 안에 여러개의 table 이 있지 않습니까?
그러면 여기서는 한번에 기냥 hahaha 라는 디비 전체를 다 긁어 오는 방법을 설명 드릴게요..

#mysqldump -u님의디비아뒤 -p님의디비패스 hahaha >
hahaha_backup.sql
이렇게 해주시면 됩니다.
그러면 hahaha 디비안에 들어있는 테이블과 전체 내용이 싹 읽혀서 .sql 화일 안에 들어 갑니다.
vi hahaha_backup.sql 이렇게 해보세요..
그럼 모든게 들어가 있는것이 확인 될테니..
2005/07/04 11:27 2005/07/04 11:27

MySQL Replication

MySQL 2005/07/04 10:25
1. Master 측 설정


Replication 에서는 Master 와 Slave 라는 말을 사용하게 된다. Master 라는 말은 즉 능동적인
작업을 수행하는 측을 의미한다. 즉 실제로 업데이트가 발생하고, 동기화를 할 서버의 기준이
되는 서버를 의미한다.

일단, Replication 기능을 사용하기 위해서는 Replication 의 기능을 수행 할 유저가 필요하며
이 유저는 모든 DB 에 대해서 file 의 권한을 가지고 있어야 한다.

GRANT file ON *.* TO $repjob_user@\$slave_host_addr' IDENTIFIED BY '$passwd'

명령을 이용하여 file 에 대해서만 모든 DB 에 권한을 가지는 유저를 추가하도록 한다. 여기서
$repjob_user 는 중복되지 않는 유일한 아무 이름의 유저로 지정하면 되며, $salve_host.addr
은 SLAVE server 로 만들 서버의 주소를 적어 줘야 한다. 그래야 SLAVE 에서 위에서 지정한 유
저로 MASTER server 에 접속이 가능하기 때문이다. 마지막의 $passwd 는 접속할 패스워드를 지
정하는 것이다.

다음 my.cnf 에 아래와 같이 Replication 기능을 위한 MASTER 설정을 한다.




Hanterm - cat /etc/my.cnf

[root@bbuwoo /etc]$ cat my.cnf

[mysqld]
....
....
log-bin
binlog-do-db = test
binlog-do-db = test1
server-id = 1

[root@bbuwoo /etc]$



log-bin 은 Replication 을 위한 binary log 를 남기게 한다. server-id 는 Replication 기능
을 사용하는 서버중 유일값을 가져야 한다. server-id 는 1 에서 2^32-1 까지 지정할 수 있다.

binlog-do-db 는 Replication 을 사용할 database 를 지정한다. binlog-do-db = test,test1 과
같이는 사용이 안된다. 이유는 모르겠지만 하나에 하나씩 적어 줘야 한다. 만약 모든 database
를 동기화 하려한다면 binlog-do-db 를 설정을 안하면 된다. 만약 mysql DB 만 Replication 기
능을 사용하고 싶지 않다면 binlog-ignore-db 를 사용하면 된다.

my.cnf 에서 사용할 수 있는 MASTER 에 관한 옵션은 다음과 같다

log-bin=filename

Replication 기능에 필요한 binary log 를 남기게 한다. filename 을 지정하지 않을 경우에는
mysql 의 lib directory 에 $host-bin.001 과 같이 남게 된다. RPM으로 설치했을 경우에는 보
통 /var/lib/rpm 에 남게되며, prefix 를 지정하지 않은 채 소스 컴파일을 했을 경우에는 보통
/usr/local/mysql/lib/ 에 남게 된다.

log-bin-index=filename

binary file 의 index 파일을 생성한다. 지정하지 않으면 $host-bin.index 로 남게 된다. 지정
하나 하지 않으나 별 상관은 없다.

sql-bin-update-same

If set, setting SQL_LOG_BIN to a value will automatically set SQL_LOG_UPDATE to the same
value and vice versa.

binlog-do-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 할 Database를 선택한다. 이것이 지정이
되어 있으면 지정되지 않은 Database 들은 동기화에서 빠진다.

binlog-ignore-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 하지 않을 Database 를 선택한다. 이것
이 지정이 되어 있으면 지정되지 않은 Database 들만 동기화를 한다. 만약 binlog-do-db 가 설
정이 되어 있을 경우 에는 binlog-do-db 를 먼저 적용하고나서 binlog-ignore-db 를 적용한다.

좀 더 자세한것을 알고 싶다면 http://www.mysql.com/doc/R/e/Replication_Options.html 를 참
고 하도록 한다.


2. SLAVE 측 설정

SLAVE 측의 설정에서는 별다른 유저 추가가 필요 없으며 MASTER 측의 추가한 유저 정보를 이용
하여 my.cnf 에서 SLAVE 설정만 해 주는 것으로 설정이 끝난다.




Hanterm - cat /etc/my.cnf

[root@bbuwoo /etc]$ cat my.cnf

[mysqld]
....
....
server-id = 2
master-host = mater_ipaddres
master-user = $repjob_user
master-password = $passwd
replicate-do-db = test
master-port = 3306

[root@bbuwoo /etc]$



server-id 는 역시 유일값 이어야 한다. MASTER 에서 1 을 사용했으니 SLAVE 에서는 2 를 사용
한다.

master-host 는 MASTER server 의 ip address 를 지정해 준다. master-user 는 Replication 작
업을 할 유저를 지정한다. 위의 MASTER 에서 등록해 준 유저를 적도록 한다.

master-passwd 는 Replication 작업을 할 유저의 패스워드를 지정한다.

master-port 는 MASTER server 가 사용하는 포트를 지정한다. 기본값으로 3306 이다.

만약 MASTER server 의 특정 DB만 Replication 기능을 사용하고 싶다면 replicate-do-db 를 이
용한다. 하지만 이 기능은 MASTER 에서 binlog-ignore-db 로 제한을 하고 있다면 적용이 되지
않는다. 즉 SLAVE level 에서는 MASTER 가 허락 하는 database 중에서 선택을 할 수 있을 뿐이
다. SLAVE 에서 사용할 수 있는 옵션들은

http://www.mysql.com/doc/R/e/Replication_Options.html

를 참고 하도록 한다.

위의 작업을 간단히 설명을 하자면 MASTER 에서는 Replication 을 위한 유저에게 file 에 대해
서는 모든 권한을 준 상태로 추가 했으며, test, test1 database 에 대해서 Replication 을 하
도록 설정을 한 것이다. SLAVE 에서는 replicate-do-db 가 설정이 되어 있으므로 test1 DB 만
동기화를 하게 설정한 것이다.


3. 동기화 초기화 작업

MASTER 와 SLAVE 의 설정을 마쳤으면 Replication 기능을 사용하기 전에 두대간의 동기화 작업
을 먼저 해 놓아야 한다. 먼저 동기화 할 database 를 SLAVE 로 옮긴다. (만약 MASTER 에서 아
무것도 없는 상태에서 시작한다면 이 작업은 필요없다. MASTER에서 운영중인 것을 Replication
기능을 이용하여 동기화 하기 위해 필요한 작업이다.) 위에서는 test1 DB 만 동기화를 하도록
설정을 했으니 MASTER 의 test1 DB를 압축해서 SLAVE 로 옮긴다 (mysql 의 경우에는 data file
만 옮겨도 그냥 적용을 할 수 있다.)

master) cd /var/lib/mysql
master) tar cvfpz test1.tgz test1
master) chmod 777 test1.tgz

slave) cd /var/lib/mysql
slave) ncftp -u user master_server
slave) (Afer login) cd /var/lib/mysql
slave) get test1.tgz
slave) delete test1.tgz (ftp 상의 파일을 삭제)
slave) quit (ftp logout)
slave) tar xvfpz test1.tgz
slave) chown -R mysql.mysql test1


4. Replication 확인

여기 까지의 작업이 완료 되었다면 이제 MASTER 와 SLAVE 의 mysql 을 구동하고 다음을 확인한
다. 여기서의 결과값은 3.23.42 를 기준으로 한다. 버젼 마다 결과값이 다른 형태로 나올 수가
있다.


MASTER Server


Hanterm - mysql -e "show process"

[root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

Shutting down MySQL: [ OK ]
Starting MySQL: [ OK ]

[root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

+----+-------+--------+------+-------------+------+
| Id | User | Host | db | Command | Time |
+----+-------+--------+------+-------------+------+
| 7 | $user | $slave | NULL | Binlog Dump | 2865 |
+----+-------+--------+------+-------------+------+
+---------------------------------------------+------+
| State | Info |
+---------------------------------------------+------+
| Slave connection: waiting for binlog update | NULL |
+---------------------------------------------+------+

[root@bbuwoo /etc]$ mysql -uroot -p -e "show master status"

+---------------+----------+------------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+------------------+------------------+
| $host-bin.001 | 729 | test,test1 | |
+---------------+----------+------------------+------------------+

[root@bbuwoo /etc]$




SLAVE Server


Hanterm - mysql -e "show process"

[root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

Shutting down MySQL: [ OK ]
Starting MySQL: [ OK ]

[root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

+----+-------------+------+------+---------+------+-----------------------+------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+------+------+---------+------+-----------------------+------+
| 1 | system user | none | NULL | Connect | 2847 | Reading master update | NULL |
+----+-------------+------+------+---------+------+-----------------------+------+

[root@bbuwoo /etc]$ mysql -uroot -p -e "show slave status"

+-------------+-------------+-------------+---------------+---------------+-----+
| Master_Host | Master_User | Master_Port | Connect_retry | Log_File | Pos |
+-------------+-------------+-------------+---------------+---------------+-----+
| $master_ip | $rejob_user | 3306 | 60 | $host-bin.001 | 729 |
+-------------+-------------+-------------+---------------+---------------+-----+
+---------------+-----------------+---------------------+------------+
| Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
+---------------+-----------------+---------------------+------------+
| Yes | test | | 0 |
+---------------+-----------------+---------------------+------------+
+------------+--------------+
| Last_error | Skip_counter |
+------------+--------------+
| | 0 |
+------------+--------------+

[root@bbuwoo /etc]$



와 같이 나와 있음을 확인하면 된다.


5. Replication Error 복구방법

Replication 이 잘 되다가 갑자기 slave 에서 master 가 반영이 되어 있지 않을 경우 slave 의
error log 를 보도록 한다. error log 를 보고 문제점을 fix 한 다음

shell> mysqladmin -uroot -p slave-start

명령을 실행하면 반영되지 않았던 master 의 자료가 하나씩 반영되는 것을 볼 수 있을 것이다.

또 한가지 주의할 점은 replication 을 구현할때 master 에서

mysql> create database DB명;

명령은 slave 에 반영이 되지를 않는다. 그러므로 slave 의 설정에

replicate-do-db = DB명

을 명확하게 밝혀 놓아야지 에러가 발생하는 것을 막을 수 있다. 그럼 Master 에서 DB 를 추가
할 때는 귀찮더라도 slave 에서 수동으로 create database 를 한 다음 추가된 db 를 my.cnf 에
서 replicate-do-db 를 설정한 다음 slave 를 재시작 하는 것을 권장한다.

database 추가가 반영이 되지 않는 것은 필자가 그 방법을 찾지 못한 것인지 아니면 원래 구현
이 안되어 있는 것인지를 모르겠다. 혹시 아는 사람이 있으면 필자에게 포스팅을 해 주면 감사
하겠다.


6. Replication Error 유형

mysql> show processlist;

+----+-------------+------+------+---------+------+-----------------------+------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+------+------+---------+------+-----------------------+------+
| 1 | system user | none | NULL | Connect | 2847 | Waiting to reconnect | NULL |
| | | | | | | after a failed read | |
+----+-------------+------+------+---------+------+-----------------------+------+
2 rows in set (0.00 sec)

mysql> show slave status;
+-------------+-------------+-------------+---------------+---------------+-----+
| Master_Host | Master_User | Master_Port | Connect_retry | Log_File | Pos |
+-------------+-------------+-------------+---------------+---------------+-----+
| $master_ip | $rejob_user | 3306 | 60 | $host-bin.101 | 729 |
+-------------+-------------+-------------+---------------+---------------+-----+
+---------------+-----------------+---------------------+------------+
| Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
+---------------+-----------------+---------------------+------------+
| Yes | test | | 0 |
+---------------+-----------------+---------------------+------------+
+------------+--------------+
| Last_error | Skip_counter |
+------------+--------------+
| | 0 |
+------------+--------------+

이 경우를 보도록 하자. processlist 에서는 읽기 실패후에 재접속을 기다리고 있다고 상황을
출력하고 있고, slave status 에서는 host-bin.101 에서 멈춰있다. 그리고 master 에서는 로그
파일이 host-bin.130 번을 생성하고 있을 경우이다. 즉 로그 101 에서 slave 는 멈춰진 상태이
다. 그리고 slave 의 에러로그 파일에는 다음과 같은 내용이 있다.

020312 17:52:37 Error reading packet from server: Could not open log file
(read_errno 0,server_errno=13)
020312 17:53:37 Slave: Failed reading log event, reconnecting to retry, log
'$host-bin.101' position 729
020312 17:53:37 Slave: reconnected to master '$rejob_user@$master_ip:3306',
replication resumed in log '$host-bin.101' at position 729

이런 경우에는, master 의 바이너리 로그 파일의 소유권을 잘 살펴보기 바란다. 보통 mysql 은
mysql 유저로서 구동을 하는 경우가 많은데 이때 로그파일이 간혹 root 의 권한으로 생성이 되
는 경우가 있다. 이 경우 읽기 권한이 없어 위와 같은 에러가 발생하는 경우가 존재한다.
2005/07/04 10:25 2005/07/04 10:25
어느날 아침 로긴이 안되거나 혹은 게시판에서 데이터 베이스 엑세스를 할수 없습니다.. 이런 메세지를 볼수 있다. 난감하기 그지 없다... 어떻게 극복을 할것인가... ?
데이터 베이스는 항상 깨지기 마련이다. 1년은 운영한다면.. 적어도 1~2회 정도는 화일을 열수 없습니다.


에러 메세지 :
ERROR 1016: Can't open file: 'xxxxxx.MYD'. (errno: 145)

만약 /usr/local/mysql/var/데이터 베이스에 들어 가면 각각의 부분에 대하여
*.FRM : 테이블 정보
*.MYI : 인덱스 정보
*.MYD : 데이타 정보

[root@ilinuxbay ]# /usr/local/mysql/bin/myisamchk sessions.*
myisamchk: error: 'sessions.MYD' is not a MyISAM-table

---------

Checking MyISAM file: sessions.MYI
Data records: 6 Deleted blocks: 6
myisamchk: warning: Table is marked as crashed
- check file-size
- check key delete-chain
- check record delete-chain
myisamchk: warning: Not used space is supposed to be: 896 but is: 624
myisamchk: error: record delete-link-chain corrupted
- check index reference
- check data record references index: 1
myisamchk: error: Found 4 keys of 6
- check record links
myisamchk: error: Record-count is not ok; is 4 Should be: 6
myisamchk: warning: Found 4 deleted blocks Should be: 6
myisamchk: warning: Found 8 parts Should be: 11 parts
MyISAM-table 'sessions.MYI' is corrupted
Fix it using switch "-r" or "-o"

---------

누가 지웠나.. 혹은 화일이 없는 경우 다음과 같은 명령어를 이용 확인 복구를 할 수 있다.


]#myisamchk 옵션을 보면

# -r -o로 복구가 안되면다 -f 옵션을 이용한다.
-f, --force Overwrite old temporary files.

#복구
-r, --recover Can fix almost anything except unique keys that aren't unique.

#안전하게 복구
-o, --safe-recover Uses old recovery method; Slower than '-r' but can
handle a couple of cases where '-r' reports that it
can't fix the data file.

#데이터 정렬 및 속도 증가 -R1 저도 주면 될듯 싶네요
-R, --sort-records=#
Sort records according to an index. This makes your
data much more localized and may speed up things

일반적으로 -r 을 기본으로 사용하며 대상 화일은 * 확장자를 잡으면 된다.
그럼 복구를 해보자.


[root@ilinuxbay ]# /usr/local/mysql/bin/myisamchk -r sessions.*
myisamchk: error: 'sessions.MYD' is not a MyISAM-table

---------

- recovering (with sort) MyISAM-table 'sessions.MYI'
Data records: 6
- Fixing index 1
Data records: 4

---------
2005/07/04 10:24 2005/07/04 10:24

Mysql 기본사용법

MySQL 2005/07/04 10:20
1. MySQL 사용하기

1.1 MySQL 서버 시작하기

MySQL이 정상적으로 설치 되었다면 그리고 디폴트 옵션으로 설치
하였다면 /usr/local/bin/ 디렉토리에 관련 실행 파일이 설치 되었
을 것이다. 먼저 MySQL 서버를 실행하는 명령은 다음과 같다.
물론 root 아이디로 실행해야 한다.(다른방법이 있으면 알려주세요)

mysql.server start

위와 같이 입력하면 서버가 실행된다. 두개의 프로세서가 데몬상태로
실행되는데, safe_mysqld, mysqld 이렇게 두개이다.
이 두개의 프로세서가 실행되고 있다면 이제 MySQL을 사용할수 있다.
MySQL 두번째 강좌에서 보면 위의 두 프로그램에 대한 설명이 나와 있다.
이 상태에서 아래와 같이 MySQL을 사용할수 있는 가상 터미날을 실행시킨다.

mysql -u root mysql

MySQL이 처음 설치되면 DB admin user 는 root 이다. 몰론 이것은 변경
할수도 있다. 디폴트로 설치한 경우 암호가 처음에는 생성되어 있지 않으
므로 위와 같이 하면 실행이 된다. 위의 명령에 대한 설명은 다음과 같다.

mysql -u root mysql
실행파일 유저선택 root db 유저 사용할데이타베이스

그외 몇가지 간단한 옵션이 있으나 필요하면 mysql -h 하여 내용을 참고
하기 바란다. 그리고, root 유저에 암호를 설정한 후 부터는 -p 옵션을
하나더 추가하여 실행하기 바란다. 이 옵션은 패스워드를 입력받는 옵션이다.


1.2 mysql 프로그램의 사용

mysql을 실행하여 간단한 동작을 하여보자.
mysql은 일반 유저로 실행하여도 되는 프로그램이다.

$ mysql -u root mysql ---> DB 사용을 위한 실행
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql>

위와 같이 연결된다. 여기서 몇가지 간단한 테스트용 명령을 적는다.

mysql> show databases --> 데이타베이스 종류보기
-> \g
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)

mysql> show tables from mysql --> mysql상의 테이블 정보 보기
-> \g
+-----------------+
| Tables in mysql |
+-----------------+
| db |
| func |
| host |
| user |
+-----------------+
4 rows in set (0.00 sec)

mysql> show columns from db --> db table 칼럼정보 보기
-> \g
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| Host | char(60) | | PRI | | |
| Db | char(32) | | PRI | | |
| User | char(16) | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
+-------------+---------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

mysql> show index from db --> db table의 인덱스정보기
-> \g
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
Collation | Cardinality | Sub_part |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
| db | 0 | Host | 1 | Host |
A | 4 | NULL |
| db | 0 | Host | 2 | Db |
A | 4 | NULL |
| db | 0 | Host | 3 | User |
A | 4 | NULL |
| db | 1 | User | 1 | User |
A | NULL | NULL |
+-------+------------+----------+--------------+-------------+
-----------+-------------+----------+
4 rows in set (0.00 sec)

mysql> show status --> MySQL의 상태정보 보기
-> \g
+--------+-----------------+-----------+---------------+---------
+-------------+
| Uptime | Running_threads | Questions | Opened_tables | Reloads
| Open_tables |
+--------+-----------------+-----------+---------------+---------
+-------------+
| 1493 | 1 | 26 | 4 | 1
| 4 |
+--------+-----------------+-----------+---------------+---------
+-------------+
1 row in set (0.00 sec)

mysql> show variables --> MySQL 환경변수보기
-> \g
+--------------------+---------------------------------+
| Variable_name | Value |
+--------------------+---------------------------------+
| back_log | 5 |
| basedir | /usr/local/ |
| datadir | . |
| join_buffer | 131072 |
| key_buffer | 1048568 |
| language | /usr/local/share/mysql/english/ |
| max_allowed_packet | 65536 |
| max_connections | 90 |
| max_join_size | 4294967295 |
| max_sort_length | 1024 |
| net_buffer_length | 8192 |
| port | 3306 |
| record_buffer | 131072 |
| skip_locking | 1 |
| socket | /tmp/mysql.sock |
| sort_buffer | 2097144 |
| table_cache | 64 |
| thread_stack | 65536 |
| tmp_table_size | 1048576 |
+--------------------+---------------------------------+
19 rows in set (0.00 sec)

mysql> select * from db --> db 테이블의 데이타 가져오기
-> \g
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| Host | Db | User | Select_priv | Insert_priv |
Update_priv |Delete_priv | Create_priv | Drop_priv |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
| % | test | | Y | Y |
Y |Y | Y | Y |
| % | test\_% | | Y | Y |
Y |Y | Y | Y |
| localhost | binggo | binggo | Y | Y |
Y |Y | Y | Y |
+-----------+----------+------------+-------------+-------------+
-------------+-------------+-------------+-----------+
3 rows in set (0.00 sec)

mysql>


위의 명령은 기본적인 명령으로서 실제 mysql 을 사용할때
자주 사용될 명령이라고 생각된다. 기타 sql문은 강좌 3에서
정리하였으므로 생략하기로 한다.


2. MySQL DB admin user 암호걸기

MySQL 을 설치후 가장 먼저 해야 할 일은 MySQL의 admin 인
root (DB user 임)의 암호를 설정하는 일이다. 이것은 서버가
인터넷상에 접속되어 있을경우 보안을 위하여 가장 먼저해야
하는 일이라고 생각된다. 암호를 설정하는 방법은 다음과 같다.
먼저 admin 유저인 root 아이디의 암호를 설정하기로 한다.

mysql> update user
-> set password = password('testpass')
-> where user = 'root'
-> \g
Query OK, 2 row affected (0.00 sec)

mysql>

위를 실행하면 일반적으로 user 테이블상에 root 아이디가 두개가 root
아이디가 등록 되어 있으므로 2 row 의 비밀번호가 변경이 된다.
여기시 확인을 위하여 아래의 명령을 실행해 본다.

mysql> select * from user
-> \g
. . . .
. . . .

테이블상에 저장된 내용이 출력될 것이다.

자 이제부터는 admin 유저인 root로 mysql에 접속할 경우 꼭 password를
입력해야 한다. 즉 아래와 같이 실행하여야 한다.

$ mysql -u root -p mysql
Enter password:

암호를 물을때 암호를 입력하면 mysql을 사용할수 있다.


3. 새로운 데이타 베이스 생성과 사용자 연결

3.1 데이타 베이스의 생성

데이타베이스 생성의 방법은 두가지가 있다. mysqladmin 프로그램을
이용하여 root 아이디로 shell 상에서 생성하는 방법과 또하나 mysql
프로그램 상에서 생성하는 방법이다.

먼저 mysqladmin 프로그램을 이용하는 방법이다.

mysqladmin create soonhg --> 이경우 soonhg 라는 데이타베이스 생성

admin 인 root 에 암호를 설정한 경우 다음과 같이 실행한다.

mysqladmin -u root -p create soonhg

이 경우 디폴트로 설치한 경우 /usr/local/var/soonhg 라는 디렉토리가 생성
된다. 이 디렉토리가 데이타 베이스 공간으로 이용될 곳이다. 즉 soonhg 라는
데이타 베이스 공간에 테이블을 생성할 경우 soonhg 라는 디렉토리로 관련된
파일이 생성되며 데이타가 저장된다.

*******************************************************************
중요한 tip......
*******************************************************************
MySQL과 주고 받는 각종 내용은 /usr/local/var 상의 full도메인명.log
파일상에 모두 저장된다. 만일 동작 상태를 알고 싶다면 터미날을 하나 더
열어서 tail -f full도메인명.log 하여 MySQL과의 주고받는 내용을
모니터링 할 수 있다.
*******************************************************************

두번째 방법으로 mysql을 이용하는 법이다. mysql 실행상태에서 아래와 같이
한다. (admin 인 root 아이디로 mysql 에 접속)

mysql> create database soonhg
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위의 두가지 방법중 어느 방법을 사용하여도 무관하다. 개인적으로는 mysql
상에서 데이타베이스를 생성하는것을 권장한다. 왜냐하면 계속하여 작업을
해야할것들이 있기 때문이다.


3.2 데이타베이스와 mysql 관리 테이블과의 연결 및 사용자등록 및 특권정의

자 이제 생성된 데이타베이스와 데이타베이스 관리및 엑세스 권한등을 정의
하고 있는 mysql 상의 db, user 테이블에 방금 생성된 soonhg 테이블의 내
용을 정의 하자.

먼저 이 soonhg 데이타베이스는 모든 호스트 상에서 접근이 가능하도록 만들
기로 한다. 그리고 사용자는 id 로 park 라는 DB user 를 생성한다고 하자.
sql 문은 다음과 같다.

mysql> insert into db
-> (host,db,user,select_priv,insert_priv,update_priv,delete_priv,
-> create_priv,drop_priv)
-> values ('%','soonhg','park','Y','Y','Y','Y','Y','Y')
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위의 sql문에서 보면 park 이라는 사용자는 soonhg 데이타베이스에 대하여
select,insert,update,delete,create,drop 권한이 모두 주어졌다. 이것은
하나의 soonhg 데이타 베이스에 대하여 각 sql 명령에 대한 권한을 개별적
으로 줄수 있다는 것을 의미한다.
select * from db 라는 sql 문을 이용하여 정상적으로 insert 되었는지
확인해 보기 바란다.

자 이제 park 라는 db 사용자에 대한 등록을 할 차례이다.
다음과 같은 sql 문을 만들어 실행한다.


mysql> insert into user
-> (host,user,password,select_priv,insert_priv,
-> update_priv,delete_priv,create_priv,drop_priv,
-> reload_priv,shutdown_priv,process_priv,file_priv)
-> values ('localhost','park',password('park'),'N',
-> 'N','N','N','N','N','N','N','N','N')
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

위와 같이 하여도 되고 간단히 아래와 같이 하여도 무방하다.

mysql> insert into user
-> (host,user,password)
-> values ('localhost','park',password('park'))
-> \g
Query OK, 1 row affected (0.00 sec)

mysql>

host,user,password 이외의 칼럼들은 모두 디폴트로 'N' 으로 설정
되어 있으므로 위와 같이 하면된다. 여기서 db 테이블과 user 테이블은
특권상에서 약간의 차이점이 있다. db 테이블 상에서 설정되지 않고
user 테이블 상에만 설정되어진 DB 사용자는 user 테이블 상에서 설정
된 권한을 존재하는 모든 데이타베이스에 대하여 인정받는다.
이러한 이유로 일반 사용자인 경우는 user 테이블 상에는 모든 권한을
'N' 로 설정하여야 하고 각 DB user 가 사용할 데이타베이스에 대한
권한을 DB 테이블에 다시 정해주는 것이다.
즉, 데이타베이스가 여러개 존재한다고 가정하자. aaa, bbb, ccc 라는
세개의 데이타베이스가 존재할때, park 이라는 DB 사용자는 aaa 라는
데이타베이스만 이용하게 하려고 설정하려고 한다고 하자.

이경우는 user 테이블에는 모든 권한을 'N' 상태로 설정하고 db 테이블
에는 aaa 라는 테이블에 대하여 모든 권한을 'Y' 라고 설정하면 이 park
라는 db 사용자는 aaa 라는 데이타베이스에 대하여 사용권한이 주어질
것이다. 잘 이해가 가지 않는다면 몇번 더 자세히 읽어보고 test 해본다면
쉽게 이해할 수 있을것이다.

*******************************************************************
중요한 tip......
*******************************************************************
user 테이블에 사용자를 insert, update 한 경우 MySQL을 꼭 재기동
시켜 주어야만 한다. 명령은 다음과 같다.
mysqladmin -u root -p reload
이 명령은 user 테이블에서 사용자 정보를 다시 읽어서 MySQL 을 다시
실행시켜준다.
*******************************************************************


4. 테이블의 생성

테이블의 생성은 일반적인 sql 문장이므로 간단히 테이블 하나 생성하는
예제를 적는것으로 대신하겠다.
위에서 생성한 사용자와 사용자를 위한 테이블을 이용하여 작업을 하여보자

먼저 mysql을 실행한다. 실행은 그냥 일반 계정 사용자로 한다.

$ mysql -u park -p soonhg
Enter password: **** <-- 여기서 password 인 park을 입력한다.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 3.21.27-gamma-log

Type 'help' for help.

mysql>


자 MySQL에 접속되었다. 이제 table을 생성하여 보자. 아래는 individual
테이블 생성을 위한 SQL 문장이다.

create table individual(
empno char(16) primary key,
name char(20) not null,
sex char(2),
addr char(80),
tel char(15)
)

위의 테이블은 개인정보 테이블로 간단히 만든것이다. empno 가 키가 되어
저장된다. 물론 index 테이블이 하나 생성되며 empno 가 인덱싱 되어진 테
이블이 생성될것이다. not null 은 말그대로 name 칼럼은 null 값은 받지
않겠다는 것이고.....

자 그럼 insert 문장을 하나 작성해 보자

insert into individual
values ('1','박순행','1','서울시 중랑구 상봉동 LG apt.','02-777-7777')

위의 sql문을 실행하면 한 row의 데이타가 insert 된다. 그럼 이제
select 문을 이용하여 읽어보자.

mysql> select *
-> from individual
-> \g
+-------+--------+------+------------------------------+-------------+
| empno | name | sex | addr | tel |
+-------+--------+------+------------------------------+-------------+
| 1 | 박순행 | 1 | 서울시 중랑구 상봉동 LG apt. | 02-777-7777 |
+-------+--------+------+------------------------------+-------------+
1 row in set (0.00 sec)


위와 같이 출력 될 것이다. 여러가지 sql문장을 테스트 해보면 될것이다.
2005/07/04 10:20 2005/07/04 10:20
인터넷 사용자들이 많아지면서 인기있는 웹 사이트에서는
Max connections 에러가 발생되는 것을 볼 수 있을겁니다.

우선, MySQL은 동시에 연결될 수 있는 클라이언트의 수가
100입니다.

이런 에러가 발생한다면 먼저 접속되어있는 클라이언트의 수를
확인하셔야 합니다.. 확인방법은 아래와 같습니다.
$ mysqladmin -u root -p variables | grep max_connection

| max_connections | 100

이제는, 클라이언트의 동시 접속자를 늘리는 명령입니다.
먼저 mysqld - 이 데몬을 kill 합니다..
$ safe_mysqld --set-variable max-connections=200 &
참고로, 리눅스나 솔라리스 계열에서는 클라이언트의 동시
접속자수가 500 ~ 1,000 까지 가능하다고 합니다.

이렇게 하신 후 다시 확인합니다.
$ mysqladmin -u root -p variables | grep max_connection

그럼 제한되어 있지만 원하시는 만큼의 동시접속자 수를
늘리시게 된겁니다.
2005/07/04 10:18 2005/07/04 10:18
#/usr/local/mysql/bin/perror 1(에러번호)
Not owner

# /usr/local/mysql/bin/perror 2
No such file or directory

# /usr/local/mysql/bin/perror 3
No such process

# /usr/local/mysql/bin/perror 23
File table overflow

# /usr/local/mysql/bin/perror 24
Too many open files
2005/07/01 15:24 2005/07/01 15:24
1.MySQL 데몬 실행 중지

# /etc/rc.d/init.d/mysql.server stop
(또는 # killall -9 mysqld )

2.인증제외한 MySQL 데몬 실행

# /usr/local/mysql/bin/safe_mysqld --skip-grant &

3. 비번없이 접속후 mysql DB의 user 테이블에서 root 패스워드 변경

# /usr/local/mysql/bin/mysql -u root mysql

mysql> update user set password=password('new password') where user='root';
mysql> flush privileges;
mysql> quit

# _

4. 정상적인 MySQL 데몬 실행

# /etc/rc.d/init.d/mysql.server start
(또는 # /usr/local/mysql/bin/safe_mysqld --user=mysql &)
2005/07/01 14:54 2005/07/01 14:54
Mysql Database 간략 설명

1. 최신버전의 MySQL 바이너리 버전을 다운.

예) mysql-3.22.22-pc-linux-gnu-i686.tar

2. 압축 풀기

tar xvfz mysql-3_21_33c-pc-linux-gnu-i686_tar.gz

3. 해당 디렉토리로 이름 및 파일 이동(/usr/local/mysql)

# mv ./mysql-3.21.33c-pc-linux-gnu-i686/ /usr/local/mysql/

4. 기본 디렉토리의 이동

# cd /usr/local/mysql/

5. /scripts/mysql_install_db의 실행

# pwd
/usr/local/mysql/

# ./scripts/mysql_install_db

6. mysql demon 띄우기

# cd /usr/local/mysql

# ./bin/safe_mysqld &

7. mysql demon 확인

# ps aux
(3개의 mysql 데몬이 떠있으면 성공)

8. admin(root) password 할당

# ./mysqladmin -u root password '******'

9. mysql의 실행(mysql 데이터 베이스 사용)

# ./mysql -uroot -p****** mysql

10. table 보기;

mysql> show tables ;

11. 사용자 보기

mysql> desc user ;

12. user 보기

mysql> select user from user ;

13. 사용자 추가

mysql> insert into user values('localhost','hichips',password('*********'),'Y','Y','Y','Y','Y',
'Y','Y','Y','Y','Y','Y','Y','Y','Y');

14. 사용자 추가후 처리

# ./mysqladmin -hlocalhost -uroot -p****** reload

15. database 만들기

# ./mysqladmin -hlocalhost -uroot -p****** create hichips
또는 개인 계정으로도 데이터 베이스 생성이 가능하다.

16. database삭제

# ./mysqladmin -hlocalhost -uroot -p****** drop hichips

17. 사용자 계정에 path 설정

# su - hichips

$ vi .bash_profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin

18. mysql 자동(starting) 데몬의 설정

# vi /etc/rc.d/rc.local

# cd /usr/local/mysql

# ./bin/safe_mysqld --socket=/var/lib/mysql/mysql.sock > /dev/null 2> /dev/null&

19. 이젠 개인 계정에서 사용하시려면

$ mysql -uhichips -p********* hichips
mysql>

20. user에게 mysql계정의 권한 주기

database mysql의 user table에 insert를 해야한다. host, user, password는 임의로 주게 되고 나머지 권한 10가지는 모두 'N'로 준다.

21. user가 필요로 하는 database의 생성

# mysqladmin -uroot -ppassword create sample

22. database권한설정을 한다

database mysql의 db table에 insert한다. host, db, user에서 db는 위에서 만든 database명을 주고, user는 database의 사용권한자이다. 그 뒤의 10개의 권한을 모두 'Y'로 주므로써 database를 사용할 수 있는 모든 권한을 준다.

22. mysql을 reload하여 refresh한다.

mysqladmin -uroot -ppassword reload
2005/07/01 14:32 2005/07/01 14:32