세이박스

MYSQL Table 복사

데이타베이스

CREATE TABLE 새테이블 SELECT * FROM 이전테이블

MYSQL varchar와 char 차이

데이타베이스
varchar는 입력값의 갯수를 간직하고 있기 때문에
select 시
칼럼비교->칼럼의 저장 캐릭터개수 확인->데이타로드->출력

char에선
/칼럼의 저장 캐릭터개수 확인/ 끝.

MYSQL 한글 첫자음 검색하기

데이타베이스
만약 name 칼럼에 있는 내용의 첫자음을 검색한다면...
꼭~!
binary 타입으로 바꾸어야 한다.

"ㄱ"으로 시작하는 이름을 서치할려면...
Where name>='가' and name<'나'

이렇게 해주면 됩니다. ^^

MYSQL 테이블을 화일로 백업 및 복구

데이타베이스
1. 테이블을 화일로 백업 및 복구

-. 테이블 내용을 화일로 만들기

mysql> select * from test into outfile '/root/test.txt';  꼭 경로를 지정해야함

결과 :
2 이주상 02-504-xxxx 과천시 m 1971-02-02
3 임정남 02-420-xxxx 송파구 f 1971-03-03
4 강행모 02-856-xxxx 관악구 f 1971-04-04
5 이현영 0342-718-xxxx 분당구 m 1971-05-05
6 이병환 02-891-xxxx 하안동 m 1980-06-06
1 남상욱 333-4444 동작구 m 1971-01-01


-. 테이블 내용을 화일로 만들때 |로 구분하기

terminated 문을 쓴다.
mysql> select * from test into outfile '/root/test.txt' fields terminated by '|';

결과 :
2|이주상|02-504-xxxx|과천시|m|1971-02-02
3|임정남|02-420-xxxx|송파구|f|1971-03-03
4|강행모|02-856-xxxx|관악구|f|1971-04-04
5|이현영|0342-718-xxxx|분당구|m|1971-05-05
6|이병환|02-891-xxxx|하안동|m|1980-06-06
1|남상욱|333-4444|동작구|m|1971-01-01


-. 화일을 불러오기
load 명령어를 쓴다.
mysql> load data infile '/root/test.txt' replace into table test fields terminated by '|';

결과 :
mysql> select * from test;
+------+--------+---------------+--------+------+------------+
| no | name | tel | addr | sex | birth |
+------+--------+---------------+--------+------+------------+
| 2 |이주상 | 02-504-xxxx | 과천시 | m | 1971-02-02 |
| 3 | 임정남 | 02-420-xxxx | 송파구 | f | 1971-03-03 |
| 4 | 강행모 | 02-856-xxxx | 관악구| f | 1971-04-04 |
| 5 | 이현영 | 0342-718-xxxx | 분당구 | m | 1971-05-05 |
| 6 | 이병환 | 02-891-xxxx | 하안동 | m | 1980-06-06 |
| 1 |남상욱 | 333-4444 | 동작구 | m | 1971-01-01 |
+------+--------+---------------+--------+------+------------+

MYSQL Table 수정 위한 alter 용법

데이타베이스
0. 개요
ALTER TABLE에는 다음 세가지 형식이 있습니다.
ALTER TABLE table_name ADD ( ... ) ;
ALTER TABLE table_name MODIFY( ... ) ;
ALTER TABLE table_name DROP PRIMARYKEY ;

1. 필드 추가
ALTER TABLE table_name ADD ( ... ) ;
# ALTER TABLE diary ADD addr char(20);
diary 테이블에 속성이 char(20)인 'addr' 칼럼 추가
# ALTER TABLE diary ADD addr char(20) AFTER d;
diary 테이블에 속성이 char(20)인 'addr' 칼럼을 'd' 칼럼 뒤에 추가
# ALTER TABLE diary ADD INDEX (d), ADD PRIMARY KEY (a);
컬럼 d에 새로운 인텍스를 생성 컬럼 a에 primary key 생성.
# ALTER TABLE diary ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);
diary 테이블에 c라는 컬럼을 새로 생성시키는데
INT (INTEGER) : 정수
UNSIGNED : 양수
NOT NULL : 아무데이타가 없으면 '0'
AUTO_INCREMENT : 데이타가 자동적으로 입력됨...
ADD INDEX (c) : 컬럼 c에 대해서 인텍스 생성
 
2. 필드 수정
ALTER TABLE table_name MODIFY( ... ) ;
# ALTER TABLE test MODIFY (age NUMBER NULL );
NOT NULL을 NULL로 바꾸기
# ALTER TABLEtest MODIFY (name VARCHAR2( 20 ) );
열의 폭 늘이기
 
3. 필드 삭제
ALTER TABLE table_name DROP PRIMARYKEY ;
# ALTER TABLE ddiass DROP COLUMN c;
컬럼 c를 삭제
 
4. 기타
# ALTER TABLE t1 RENAME t2;
테이블 이름을 t1에서 t2로 바꿈
# ALTER TABLE t2 CHANGE a a TINYINT NOT NULL, CHANGE b c CHAR(20);
테이블 내의 컬럼 속성을 바꿈. 원래 컬럼 a는 INTEGER였는데 TINYINT로,
컬럼b는 CHAR(10)이었는데 컬럼이름은 c로 이타 타입은 CHAR(20)으로 수정

MYSQL root 패스워드를 잊어버렸을때

데이타베이스
1. root 패스워드 잊어버렸을때..

mysql 중지한다.

/etc/init.d/mysql stop
데몬을 아무나 들어갈수 있게 다시 실행한다.

safe_mysqld --skip-grant &

루트 패스워드를 변경한다.
mysql> update user set password='' where user='root';

mysql 을 재시동 합니다.
/etc/init.d/mysql stop
/etc/init.d/mysql start

MYSQL 접근 권한 설정

데이타베이스
1. 각 DataBase별 권한 설정

# grant all privileges on *.* to root@localhost ;
root에 대해서 모든 권한을 부여.

# grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on bankaccount.* to custom@localhost identified by 'stupid';
costom은 local호스트에 접근가능(select,insert,update,delete,create,drop), bankaccount 데이타베이스에 접속 가능, 비밀번호 'stupid'

# grant all privileges on expenses.* to custom@whitehouse.gov identified by 'stupid';
costom은 whitehouse.gov에 접근가능, 모든 권한, expenses 데이타베이스에 접속 가능, 비밀번호 'stupid'

# grant all privileges on *.* to custom@%.gov identified by 'stupid';
costom은 모든 사이트에 접근가능, 모든 권한, 모든 데이타베이스에 접속 가능, 비밀번호 'stupid'

# flush privileges;
새로고침

MYSQL 백업과 복구

데이타베이스
1. 간단한 백업과 복구

-. 파일로 백업
# mysqldump DBName TableName > FildName
예) # mysqldump kornec sub01 > sub01.sql

-. 데이터 복구
# mysql DBName < FildName
예) # mysqldump kornec < sub01.sql



2. 주기적으로 백업하기

-. myhome_bakcup 셀스크립트

#!/bin/bash

T=$(echo `date +%Y%m%d%H%M`)
MY=$(echo /home/nalabi/backup)

echo "nalabi 의 데이타가 백업 되었습니다. $T"

mysqldump myhome > $MY/myhome$T.sql
gzip $MY/myhome$T.sql

-. /etc/crontab 사용하기
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

형식 :
a b c d e id runparts directory
분(0~59) 시(0~24) 날짜(0~31) 달(0~12) 요일(0~7) id(크론이 사용할 계정) directory(실행하게될 파일 놓이게 될 경로)

예제 :
15 14 1 * * root /home/nalabi/backup/myhome_backup
매달 1일 오후 2시 15에 myhome_backup을 실행한다.

0 22 * * 1-5 root /home/nalabi/backup/myhome_backup
월요일 부터 금요일까지 매일 오후 8시에 myhome_backup을 실행한다.

23 0-23/2 * * * root /home/nalabi/backup/myhome_backup
매일 0, 2, 4, ....시 23분에 실행한다.

트랜잭션 로그 파일 삭제 방법

데이타베이스
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]'WordGame' 데이터베이스의 로그 파일이 꽉 찼습니다. 데이터베이스의 트랜잭션 로그를 백업하여 사용 가능한 일부 로그 공간을 확보하십시오.
 
라는 오류 메시지가 나타나는 경우 해당 싸이트에서 DB를 SQL Server를 사용하는데.. 그 DB서버의 문제가 생긴 것입니다.
말 그대로 데이터베이스의 로그 공간을 확보 하면 되는데..
 
로그파일 용량을 늘여주는 방법이 있구요..
하드용량이 꽉차서 더이상 로그를 늘릴수 없다면 기존 로그를 삭제 하는 방법이 있어요.
기존 로그를 삭제하는 방법은 쿼리분석기에서
backup log 디비이름 with no_log
이렇게 실행시킨 후 엔터프라이즈관리자에서 해당 디비의 용량 축소를 하시면 됩니다.
 
주기적인 관리가 가능하다면
엔터프라이즈관리자 > 해당 DB의 등록정보 > 트랜잭션 로그 > 최대 파일 크기 > 파일 무제한 증가 로 체크를 하면 적어도 서비스가 중지되진 않음 하지만 용량이 커질수록 느려지는 문제가 생길수도 있음 따라서 필히 주기적으로 관리가 되어야함 ^^;
 
역시,,주기적인 모니터링이 최선인듯...ㅡㅡ;

SQL Server의 Procedure cache를 지우고 싶은데..

데이타베이스

Q . SQL Server의 Procedure cache를 지우고 싶은데요?
Tuesday, November 14, 2000

A . SQL Server 6.5 에서 유일한 방법은 SQL Server를 재시동하는 것입니다.
SQL 7.0 에서는 DBCC FREEPROCCACHE라는 명령어가 있습니다. DBCC FREEPROCCACHE의 권한은 sysadmin과 serveradmin 고정 서버 역할의 구성원에게만 기본적으로 부여되며, 양도할 수 없습니다

dat 만 가지고 데이터베이스를 복구할 수 있습니까?

데이타베이스
Q . .dat 만 가지고 데이터베이스를 복구할 수 있습니까?
Friday, November 24, 2000

A . 일반적으로 6.5 이하 버전에서는 백업을 받아 놓지 않고 자주 발생을 하는 일이다.
아래 글은 정원혁씨 사이트 참조

DISK REINIT, DISK REFIT을 수행하십시오.

1 SQL 서버를 single user mode 로 시작합니다. 옵션만 /f 대신 /m을 사용하면 됩니다.

C:MSSQLBINNSQLSERVR /m
2 ISQL/w를 수행하고 DISK REINIT을 수행합니다. 예를 들어 두 디바이스 파일로 구성되어 있었다면 다음과 같이 합니다.
DISK REINIT
NAME = 'dist' -- 이름은 종전과 똑같지 않아도 됩니다.
, PHYSNAME = 'd:mssqldatadist.dat'
-- 정확한 디바이스 파일의 path를 적어줍니다.
, SIZE = 2560
-- 파일의 크기를 근거하여 page 로 환산한 크기를 적어 줍니다.
-- 예를 들면 5MB * 512 = 2560 page 입니다.
, VDEVNO = 10
-- SQL 서버 안에서 유일한 디바이스 번호를 적어 줍니다.
--자세한 것은 Books Online/ DISK INIT 명령을 참조합니다.
--결과: This command did not return data, and it did not return any rows
GO
DISK REFIT
-- 결과: Warning: Disk Refit may not have the correct segment map information in Sysusages. Please review these after the command completes to verify their accuracy.
GO

-- 다시 이 작업을 남은 디바이스에 대해서도 수행합니다.
DISK REINIT
NAME = 'myDev'
, PHYSNAME = 'd:mssqldatamyDev.dat'
, SIZE = 1536
, VDEVNO = 11
GO
DISK REFIT
3 1 에서 사용한 프롬프트에서 Control + C를 눌르고 나타나는 질문에 Y를 입력합니다.
4 다시 정상적으로 SQL 서버를 시작합니다.

만약 이 방법으로 복구가 안 된다면 다음의 방법으로 검증을 해 보십시요.
1 testpubs라는 데이터베이스를 임의로 만듭니다.

SQL7 에서 미처 백업(.mdf)을 받지 못 하고 날려버린 DB를 살리기

데이타베이스

Q . SQL7 에서 미처 백업(.mdf)을 받지 못 하고 날려버린 DB를 살리는 법은?
Friday, November 24, 2000

A . 아래 내용은 정원혁씨 사이트에 참조한 글입니다. 저도 이러한 경우가 발생 해서 복구한적이이 있네요. 어려울때는 Books Online 을 참조 하시면 많은 도움이 됩니다.

1. *.mdf 를 비롯한 파일을 날렸다면 전혀 방법이 없습니다.
2. drop database 를 실행했거나 EM에서 database를 삭제했다면 역시 전혀 방법이 없습니다.
3. SQL 서버를 Uninstall 했다면 가능합니다. 이때는 *.mdf, *.ndf, *.ldf 등이 남아 있기 때문입니다.이 때는 바로 아래에 있는 스크립트를 참고하여 디비를 하나씩 살려내면 됩니다.
pubs 디비를 가지고 먼저 연습을 하고 하십시요.

sp_helpdb pubs
select * from pubs..titles
sp_detach_db pubs

sp_attach_db pubs, 'c:temppubs.mdf','c:temppubs_log.ldf'

sp_attach_single_file_db pubs, 'c:temppubs.mdf'
-----------
sp_helpdb mydb2
sp_detach_db mydb2

sp_attach_single_file_db mydb2, 'f:mssql7datamydb2.mdf'
,'f:mssql7datad2.ndf'
,'f:mssql7datamydb2_log.ldf'

mdf화일만 또는 mdf와 ldf 화일만 남았을때...

데이타베이스

10. 백업과 복구 - 4. mdf화일만 또는 mdf와 ldf 화일만 남았을때..
이번에 소개해드릴 내용은 약간은 쉬운? ^_^;;
간단한 내용 입니다.
앞에서 설명드린 FAQ들에 대해서 실질적인 내용을 답변 드리지요.
또한 하도 많이 받는 질문이라 아예 페이지를 만들었으니 참고 하시길 바랍니다.

Q. 풀백업과 로그백업을 혼용해 지속적으로 백업하고 있습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 가능합니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
이 두 조건이 맞다면 즉시 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.
 
Q. 지속적으로 전체 백업만을 받아 왔습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 제약 조건이 있습니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
3. 로그 백업이 가능할것 입니다.
만약 이 세 조건이 맞다면 바로 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.

Q. 풀백업과 로그백업을 혼용해 지속적으로 백업하고 있습니다.
개발자의 실수로 update 회원테이블 set 이름 = '아무개'
로 WHERE절 없이 update를 해 버렸습니다. 복구할 방법이 없을까요?

A. 가능합니다.
1. 복구 모델이 전체 모델일것(DB를 생성하면 기본입니다.)
2. 문제 발생후 풀백업이나 로그에 쓰지 않는 작업을 하지 않았을것
이 두 조건이 맞다면 즉시 로그를 with no_truncate 옵션으로 백업하신후..
Stop at 명령으로 복구할 수 있습니다.

Q. 이전 서버에서 사용하던 시스템의 문제로 해당하는 데이터베이스의
mdf 화일과 ldf 화일만 남았습니다. 새로 설치하는 시스템에 복구가 가능할까요?

A. 이전 서버와 문자셋 정보(sp_helpsort 명령으로 보실수 있습니다.)가 같고
이전에 사용하던 SQL서버가 정상적인 상태로 종료 되었을때(엔터프라이즈 관리자에서
SQL서버를 스탑 시켰거나.. 정상적으로 윈도우 시스템을 종료시킨 경우 - 해당
mdf 화일과 ldf 화일이 정상적으로 닫혔을 경우) 복구가 가능하며 이때 사용하는 명령은

EXEC sp_attach_db 'pubs'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs_log.ldf'

명령으로 복구할 수 있습니다.

Q. 이전 서버에서 사용하던 시스템의 문제로 해당하는 데이터베이스의
mdf 화일만 남았습니다. 새로 설치하는 시스템에 복구가 가능할까요?

A. 가능합니다.
이전 서버와 문자셋 정보(sp_helpsort 명령으로 보실수 있습니다.)가 같고
이전에 사용하던 SQL서버가 정상적인 상태로 종료 되었을때(엔터프라이즈 관리자에서
SQL서버를 스탑 시켰거나.. 정상적으로 윈도우 시스템을 종료시킨 경우 - 해당
mdf 화일이 정상적으로 닫혔을 경우) 복구가 가능하며 이때 사용하는 명령은

EXEC sp_attach_single_file_db 'pubs'
, 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
 
명령으로 복구하실 수 있습니다.

Q. 이전시스템에서 사용하던 풀 백업본이 있습니다.
새로 시스템을 설치한후 이 풀 백업본을 복구하려 하는데 방법이 없을까요?

A. 가능합니다.
약간 다른 방식으로 아래처럼 하심 됩니다.
1. 같은 이름의 db를 만든다 (텅빈 db)
2. 빈 db를 그냥 풀 백업 한다.
3. 원본서버에서 가져온 백업본으로 리스토어 한다.
4. 리스토어시 옵션의 강제로 덮어쓰기 하시면 됩니다.
의 순서로 진행하시면 무리없이 하실 수 있습니다.