http://www.mysql.com/doc/en/GRANT.html

버전 4.1.x부터는 계정추가시 grant로 유저에게 DB사용권한을 줘야한다.

:: 사용예
mysql> grant all privileges on db_name.* user_name@host identified by 'password' with grant option;

mysql> grant all privileges on leopit.* to leopit@localhost 

'Database' 카테고리의 다른 글

mysql index 속도 높히기  (0) 2017.01.07
실수로 삭제한 mysql DB 복구방법  (0) 2017.01.07
mysql 깨진 테이블 복구하기  (0) 2017.01.07
mySQL 개념 알기쉽게 정리한 내용  (0) 2017.01.07
웹서버 & mySQL 백업  (0) 2017.01.06

DB에 데이타가 많이 싸이면 그동안의 dml로 인해 index의 속도가 현저히 떨어집니다.
이럴때 index를 다시 정렬해주시면 검색속도가 올라갑니다.

# cd mysql/var/디비명
# myisamchk -R1 *

delete나 truncate 같은 명령으로 데이터를 지웠을때 복구하는 방법입니다.
mysql의 모든 명령들은 로그를 남기기때문에 가능합니다.
일단 mysql의 DB가 쌓이는 디렉토리로 이동합니다. 
대게 /usr/local/mysql/data /usr/local/mysql/var 등으로 설정해 놓으셨을겁니다.
해당 디렉토리로 이동하면 xxx-bin.001 xxx-bin.002 같은 바이너리 파일들이 존재할겁니다.
이게 바로 DB를 첨 생성할때부터 지금까지 쌓여온 로그인데요 이 파일을 활용하시면 삭제된 데이터도 살릴수 있습니다.
바이너리 파일이기때문에 그냥 접근하시면 이상한 문자들이 보이구요
mysqlbinlog 명령을 이용하셔서 사용해야 합니다.
다음은 예제입니다.

일단 DB 디렉토리로 이동한다.
# cd /usr/local/mysql/data

바이너리 파일을 소스파일로 변환한다.
# ../mysqlbinlog leopit-bin.002 > rescue.sql

필요한 구문만 가져온다.
# grep "insert" rescue.sql > rescue1.sql

이렇게 하시면 rescue1.sql은 지금까지의 인서트구문이 다 들어옵니다.
여기서 필요없는 부분은 지우세요

이제 최종적으로 DB에 삽입만 하시면 됩니다.
# mysql -u 계정아이디 -p DB이름 < rescue1.sql

'Database' 카테고리의 다른 글

mysql_4.1.x 부터 계정 추가시 달라진점  (0) 2017.01.07
mysql index 속도 높히기  (0) 2017.01.07
mysql 깨진 테이블 복구하기  (0) 2017.01.07
mySQL 개념 알기쉽게 정리한 내용  (0) 2017.01.07
웹서버 & mySQL 백업  (0) 2017.01.06

.. 이런경우가 없었는데.. 오늘 제가사용하는 디비가 깨졌는지..테이블 하나가 
열리지 않더군요.. 그래서.. 예전 백업본에서 다시 카피도 해 보고 하였지만.. 
잘 되지 않아.. 테이블 검색하고 오류 수정하는 myisamchk 라는 명령으로 
복구를 하였읍니다. 

책을 보니.. mysql 이 안정적이긴 하나.. 사용자의 실수나 하드웨어적인 문제, 테이블에 쓰기를 하는도중 정전, 서버가 제대로 종료되지 않았을때 이런 문제가 발생될수 있다고 하네요.. 

루트만이 복구를 할수가 있읍니다. 우선.. 사용하는 데이타의 디렉토리.. 
음.. /mysql 설치 디렉토리/var/디비명/ 에 해당하는 테이블파일들이 
있을 것입니다. 
그럼.. 이곳에서.. myisamchk 테이블명.. 하시면 됩니다. 
대부분 99% 이상 복구가 가능합니다. 

--extend-check 옵션을 주면 좀더 정확하게 검사하고요.. 시간이 좀더 걸립니다. 

그리고.. myisamchk를 실행할때는 mysql 서버를 중단 하십시요.. 
서버가 실행중일때.. myisamchk를 실행하는 것은 위험할수도 있읍니다.. 
그리고.. 이 명령을 실행하기 전에.. 꼭 디비는 백업받아 놓으시고요... 

유용한 정보가 되시길 바라며.. 이만.. ^^ 

루트가 첨에 MYSQL을 관리하는 순서대로 정렬했습니다.
처음 DB를 접하시는 분이라면 큰 도움이 될거라 믿습니다.


◆ 시작하기 전에!

여러 웹사이트를 돌아다닌 결과 가장 쉽게 그리고 잘 정리되어있는 것을 찾아서 
거기에 살을 붙였습니다.
우선 아래 내용들은 슈퍼유저나 루트만이 사용 가능하다는 것을 말씀드립니다.
일반 유저가 이런걸 다 사용할 수 있다면 큰일나겠죵...^^ (무시무시~)
자 이제 시작해 봅시다. 여러분은 루트(관리자)가 되신겁니다.


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

우선은 원하는 테이블을 생성 할 수 있는 
권한을 얻는것으로 부터 mysql을 더듬어 보기로 하겠습니다.

두가지의 경우가 존재할 수 있다. root 일수 있고 일반user(이하 user)일수가 있다. 

root된 자의 도리와 user된 자의 도리는 다를수 밖에 없다. 서로가 처지를 혼동하면 
멀티유저 시스템은 흔들리게 된다. 

먼저 root된 자의 도리는 user들을 위한 최적화된 환경을 조성해야 한다. 그중에서 
도 가장 
중요한 것은 user의 데이터를 손상되지 않게 보존하는 정규적인 백업작업이고 또한 
권한없는 자로부터 민감한 데이터를 보호할수 있는 보안설정이 될 것이다. 

구체적인 것은 각각의 도리를 알고나서 할일이지만, 여기서는 크게보아 행해야 하는 
도리를 
살펴보는 것으로 질문을 완성해 본다. 

mysql 이 설치가 되고 나면, /usr/local/mysql/bin 이라는 디렉토리에 실제로 사용할 
수 있는 
유틸리티(명령어)를 볼수있다. 이중에서 당장 필요한 것은 mysql 이라는 명령어이다. 

mysql 은 mysql 데이터베이스에 로그온할수 있는 프로그램이다. 
사용법은 다음과 같다. 

# mysql mysql // root의 경우 

% mysql -u사용자명 -p패스워드 DB명 // user의 경우 

무릇 root와 user된 자의 도리를 말한 이유는 단지 단어의 차이가 아니다. 
위에서 보듯이 그 차이는 실제로 보인다. 
접근할 수 있는 데이터베이스에 차등이 있다. 그래서 root에게는 또다른 이름이 
부여가 된다. 다름아닌 DBA(database administrator)가 그것이다. 
mysql이라는 DB는 관리자용 데이터베이스로 설치시에 기본적으로 인스톨되는 것이며, 

-물론 mysql 인스톨시 초기설정 스크립트파일(mysql_install_db)를 실행해야 함은 당 
연하다- 
일반유저는 접근을 할 수 없다. 
mysql를 처음으로 살펴보게 되면 2개의 DB가 존재함을 알수 있다. 
mysql,test 라는 이름의 DB가 그것이다. 
mysql은 DB전체에 대한 관리자격 DB이며, 이곳에는 mysql에 존재하는 DB의 이름과 
해당DB의 소유자, 사용권한 등이 설정되는 곳이다. 말하자면 mysql을 총괄하는 최상 
위 
존재라고 보면 이해하기 쉽다. 그래서 user는 접근해서도 안되며,넘보아서도 안된다. 

root가 mysql DB에 로그온하는 것이다. 그리고 나서 user들을 위한 공간을 분할해 주 
어야 
한다. 그것이 최초의 작업이 될 것이다. 
mysql DB에 진입하게 되면 먼저 그 안에 뭐가 들어있는지 살펴야 한다. 
DB안에 테이블이 들어있다. 


◆ 루트 테이블 내용

다음은 root 사용자로 mysql DB에 진입한 다음에 사용한 명령어이다. 

mysql> show tables; 
+-----------------+ 
| Tables in mysql | 
+-----------------+ 
| columns_priv | 
| db | 
| func | 
| host | 
| tables_priv | 
| user | 
+-----------------+ 
6 rows in set (0.00 sec) 

다음의 명령어는 반드시 사용해 보야야 한다. desc(describe)는 테이블의 구조를 보 
여준다. 
테이블의 구조와 내용은 다르다. 구조는 뭔가를 채우는 형식이고 내용은 채워지는 속 
알맹이다. 


◆ 각종구조 보는 명령어
mysql> desc db; desc user; desc host; desc tables_priv; desc func; desc colums_priv 
mysql> desc db; 
+-----------------+---------------+------+-----+---------+-------+ 
| 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 | | 
| Grant_priv | enum('N','Y') | | | N | | 
| References_priv | enum('N','Y') | | | N | | 
| Index_priv | enum('N','Y') | | | N | | 
| Alter_priv | enum('N','Y') | | | N | | 
+-----------------+---------------+------+-----+---------+-------+ 
13 rows in set (0.00 sec) 
mysql> desc user; 
+-----------------+---------------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-----------------+---------------+------+-----+---------+-------+ 
| Host | char(60) | | PRI | | | 
| User | char(16) | | PRI | | | 
| password | char(16) | | | | | 
| 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 | | 
| Reload_priv | enum('N','Y') | | | N | | 
| Shutdown_priv | enum('N','Y') | | | N | | 
| Process_priv | enum('N','Y') | | | N | | 
| File_priv | enum('N','Y') | | | N | | 
| Grant_priv | enum('N','Y') | | | N | | 
| References_priv | enum('N','Y') | | | N | | 
| Index_priv | enum('N','Y') | | | N | | 
| Alter_priv | enum('N','Y') | | | N | | 
+-----------------+---------------+------+-----+---------+-------+ 
17 rows in set (0.00 sec) 


◆ 해당 테이블 내용보기

그리고 다음의 명령어로 해당테이블이 보유하고 있는 데이터를 들여다본다. 
mysql> select * from 테이블명; 

mysql> select * from func; 
Empty set (0.00 sec) 

mysql> select * from tables_priv; 
Empty set (0.01 sec) 

mysql> select * from host; 
Empty set (0.00 sec) 

비어있거나 내용이 나와야 한다. 
user,db테이블은 보안상 공개하지 아니하기로 한다. 
직접명령어를 입력해 보면 알게 될 것이다. 

mysql> select * from db; 명령의 경우는 mysql에 설치된 사용자 DB에 대한 정보를 
프린트해 낼 것이다. 
mysql> select * from user; 명령은 시스템의 명칭(localhost,호스트명)과 
사용자(root)를 정의하고 있다. 

mysql DB 내의 db,user테이블을 볼수 있는 유일한 존재는 root임을 의심하지 말자. 
db,user 테이블의 내용을 알고 있다면 적어도 같은 호스트상의 어떤 유저라도 
불법적으로 남의 데이터를 넘볼수 있다. 보는 차원에서 끝나면 다행이지만, 
심히 훼손을 시키거나 아예 삭제할 수 도 있기 때문이다. 
그래서 root는 전지전능해야 한다. 
방금전에 언급했듯이 아파트를 새로 지었다고 하자. 
아파트이름이 mysql이고 관리자는 root이다. 그리고 이 아파트는 localhost내지 
고유이름(host name)이라는 주소를 갖게 된다. 
그래서 외부에서 이 아파트(mysql)에 오려면 root@localhost 이런식으로 접근하게 된 
다. 
free라는 일반사용자가 허가없이 접근하는 경우는 
반드시 다음과 같은 경험을 당하게 된다. 

% mysql mysql 
ERROR 1045: Access denied for user: 'free@localhost' (Using password: NO) 

위의 경우는 free라는 일반 사용자가 겁도 없이 mysql 관리자DB를 범하려고 했을때, 
만나는 에러이다. 
mysql -uroot -p마음대로 mysql 
이런 식의 명령을 하면, mysql은 순수히 받아들이지 않을 것이다. 
그러나 한가지 방법은 있다. 해킹(?) ... 
그것은 관리자의 소홀로 mysql DB에 패스워드를 걸지 않았을 경우이다. 
그러면 일반 유저도 다음과 같이 mysql에 접근할 수 있다. 
% mysql -uroot mysql 
정말 무서븐 일이다. 
그러니 root된 자는 처음에 반드시 mysql DB에 패스워드를 걸어야 한다. 


◆ 루트 패스워드 걸기

먼저 하나 짚고 넘어가자. 유닉스시스템에 로그인하는 것하고, 
데이터베이스에 로그인하고 하는 것은 서로 분리된 영역이라는 것이다. 
루트로 유닉스시스템에 로그인했다고 해서, mysql DB에 접근하는 패스워드를 
잊어버렸다면 mysql에 로그인할수없다. 단지 mysql자체를 시스템에서 제거하든지 
새로 인스톨하는 선택밖에는 없다

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

위를 실행하면 일반적으로 user 테이블상에 root사용자가 
localhost와 host명으로 2개 등록 되어 있으므로 
2 row 의 비밀번호가 변경이 된다. 
자 이제부터는 admin 유저인 root로 mysql에 접속할 경우 꼭 password를 
입력해야 한다. 즉 아래와 같이 실행하여야 한다. 
$ mysql -uroot mysql 
Enter password: 
암호를 물을때 암호를 입력하면 mysql을 사용할수 있다. 

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

이제까지 잘은 정리되진 않지만, root된 자의 도리를 대강 살펴보았다. 
이젠 user된 자를 mysql이라는 공간으로 통과시켜줄 절차가 필요하다. 
이 역시 root된 자만의 도리이다. 
사실 이 자체가 DBA에 관한 내용이기에 user된 자의 도리는 자신의 처지를 
잘 아는 일외에는 할일이 없다고 본다. 말하자면, 자기집안에서 살림만 
잘 하면 된다는 이야기이다. 


◆ 데이터베이스 생성

아파트를 분양해 보자... 아파트는 각각의 동과 호로 나누어 진다. 
하나의 동이 있어서 여러사람을 수용해야 한다고 가정하자. 
아파트에 입주하게 될(계정사용자) 사람들의 명단을 확보하고 그것에 대한 패스워드를 지정해야 한다. 
여기서 패스워드는 시스템로그인 패스워드와는 달라야 할 것이다.(물론 같아서 안될법은 없지만, 
보안은 그렇지 않다) 

mysql> create database user1; 
mysql> create database user2; 
mysql> create database user3; 


mysql> create database user1; 
Query OK, 1 row affected (0.01 sec) 
mysql> create database user2; 
Query OK, 1 row affected (0.01 sec) 
mysql> create database user3; 
Query OK, 1 row affected (0.01 sec) 

mysql> show databases; 
+-----------+ 
| Database | 
+-----------+ 
| mysql | 
| test | 
| user1 | 
| user2 | 
| user3 | 
+-----------+ 
5 rows in set (0.00 sec) 


리눅스의 경우 디폴트로 설치한 경우 /usr/local/mysql/var/user1 이런 식으로 디렉토리가 
생성되는것 같다. 이 디렉토리가 데이타 베이스 공간으로 이용될 곳이다. 

즉 user1 라는 데이타 베이스 공간에 테이블을 생성할 경우 user1 라는 디렉토리로 관련된 파일이 
생성되며 데이타가 저장된다. 퍼미션이 정해져 있어 안을 살펴보지는 못했다. 
그러나 솔라리스의 경우는 좀 달랐다. data디렉토리가 var디렉토리 대신 쓰였다. 

[superman:/usr/local/mysql]% cd data 
[superman:/usr/local/mysql/data]% ls 
./ mysql/ superman.err user1/ user3/ 
../ test/ superman.pid user2/ 
******************************************************************* 
중요한 tip...... 
******************************************************************* 
MySQL과 주고 받는 각종 내용은 /usr/local/mysql/var 상의 호스트명.log파일상에 모두 저장된다. 
만일 동작 상태를 알고 싶다면 터미날을 하나 더 열어서 tail -f 호스트명.log 하여 MySQL과의 
주고받는 내용을 모니터링 할 수 있다. ---- 박순행(soonhg)님의 강의록중에서 
******************************************************************* 



◆ 생성된 DB 권한설정

이러면 다 되는가? 아니다. 이제 각각의 호에 이름을 지었을 뿐 입주권은 주어지지 않았다. 
권한있는 사용자가 이 집을 사용하도록 각각의 호에 열쇠와 사용규칙을 정해주어야 한다. 
그렇지 않으면, 이 집은 아무도 접근할 수 없는 버려진 공간이 되고 만다. 

user용 DB와 mysql 관리테이블과의 Link, 사용자등록 및 각각의 권한설정이 이루어져야 한다. 
이것이 바로 실제적인 분양이 되는 셈이다. 
자 이제 생성된 데이타베이스와 데이타베이스 관리및 엑세스 권한등을 정의하고 있는 mysql 상의 
db, user 테이블에 방금 생성된 user1,user2,user3 Database 내용을 정의 하자. 

mysql> insert into db 
-> (host,db,user,select_priv,insert_priv,update_priv 
-> ,delete_priv,create_priv,drop_priv,grant_priv, 
-> references_priv,index_priv,alter_priv) 
-> values ('%','user1','daepal', 
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') 
-> ; 
Query OK, 1 row affected (0.01 sec) 

위의 내용은 눈감도 착착 만들어낸 것은 아니다. 
mysql> desc db; 라는 명령어를 사용하게 되면, db테이블의 구조가 있으니 그것을 참조해야 한다. 
insert 시에 철자가 틀려서도 안되며, 필드숫자에 맞도록 값을 정확히 기재해야 한다. 
위의 sql문에서 보면 daepal 이라는 사용자는 user1 데이타베이스에 대하여 select,insert,update,delete,create,drop,grant,references,index,alter 
권한이 모두 주어졌다. 
이것은 하나의 user1 데이타 베이스에 대하여 각 sql 명령에 대한 권한을 
개별적으로 줄수 있다는 것을 의미한다. 

자 이제 user1 이라는 db 사용자에 대한 등록을 할 차례이다. 
다음과 같은 sql 문을 만들어 실행한다. 
다음은 user테이블에 사용자에 대한 정보를 기술해 주어야 한다. 
다음처럼 user테이블의 구조를 무시하고 제멋대로 passwd라고 기술하면 에러에 봉착한다. 
에러를 만나기 원하지 않으면, 반드시 desc user; 명령으로 테이블의 구조를 보면서 
하나하나 값을 메워가면 될 것이다. 



◆ USER 등록

mysql> insert into user 
-> (host,user,passwd) 
-> values ('localhost','user1',passwd('daepal')) 
-> ; 
ERROR 1064: You have an error in your SQL syntax near '('daepal')) 
;' at line 3 

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


mysql> desc user; 
+-----------------+---------------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-----------------+---------------+------+-----+---------+-------+ 
| Host | char(60) | | PRI | | | 
| User | char(16) | | PRI | | | 
| password | char(16) | | | | | 
| 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 | | 
| Reload_priv | enum('N','Y') | | | N | | 
| Shutdown_priv | enum('N','Y') | | | N | | 
| Process_priv | enum('N','Y') | | | N | | 
| File_priv | enum('N','Y') | | | N | | 
| Grant_priv | enum('N','Y') | | | N | | 
| References_priv | enum('N','Y') | | | N | | 
| Index_priv | enum('N','Y') | | | N | | 
| Alter_priv | enum('N','Y') | | | N | | 
+-----------------+---------------+------+-----+---------+-------+ 
17 rows in set (0.00 sec) 

생략한 항목(필드)와 값은 위에서 보듯이 기본값이 'N'임을 상기해야 한다. 

host,user,password외의 칼럼들은 모두 디폴트로 'N' 으로 설정 
되어 있으므로 위와 같이 하면된다. 여기서 db 테이블과 user 테이블은 특권상에서 약간의 차이점이 있다.
db 테이블 상에서 설정되지 않고 user 테이블 상에만 설정되어진 DB 사용자는 user 테이블 상에서 
설정된 권한을 존재하는 모든 데이타베이스에 대하여 인정받는다. 

이러한 이유로 일반사용자인 경우는 user 테이블 상에는 모든 권한을 'N' 로 설정하여야 하고 각 DB user 가 사용할 데이타베이스에 대한 권한을 DB 테이블에 다시 정해주는 것이다. 
즉, 데이타베이스가 여러개 존재한다고 가정하자. aaa,bbb, ccc 라는 세개의 데이타베이스가 존재할때, daepal이라는 사용자는 aaa 라는 데이타베이스만 이용하게 하려고 설정하려고 한다고 하자. 

이경우는 user 테이블에는 모든 권한을 'N' 상태로 설정하고 db 테이블에는 aaa 라는 데이터베이스에 
대하여 모든 권한을 'Y' 라고 설정하면 daepal이라는 사용자는 aaa 라는 데이타베이스에 대하여 
사용권한을 확보하게 될 것이다. 

******************************************************************* 
중요한 tip...... 
******************************************************************* 
user 테이블에 사용자를 insert, update 한 경우 MySQL을 꼭 재기동시켜 주어야만 한다. 
명령은 다음과 같다. 
myaqladmin -u root -p reload 
이렇게 해도 된다.
flush privileges
이 명령은 user 테이블에서 사용자 정보를 다시 읽어서 MySQL 을 다시 실행시켜준다. ---- 박순행(soonhg)님의 강의록중에서 
******************************************************************* 
[superman:/usr/local/mysql/data]% mysql -udaepal -pdaepal user1 
ERROR 1045: Access denied for user: 'daepal@localhost' (Using password: YES) 

[superman:/usr/local/mysql/data]% mysqladmin -uroot reload 
[superman:/usr/local/mysql/data]% mysql -udaepal -pdaepal user1 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 58 to server version: 3.22.24 

Type 'help' for help. 

mysql> show tables; 
Empty set (0.01 sec) 

mysql> 









자 이로써 root된 자의 도리는 어느정도 마무리가 되었다. 
아파트도 분양이 되었고, 열쇠도 주어서 언제든지 입주할 수 있도록 모든 준비를 끝냈다. 
이제 사용자에게 데이터베이스의 이름과 로그인명 그리고 비밀번호를 전해주면, root된 자의 
훌륭한 임무를 완수하게 되는 것이다.

자 이제는 user된 자의 도리를 다해, root님께서 분양주신 집을 잘 관리해 보자.. 
DB를 얻게 되면 그안에 테이블이라 불리우는 녀석을 만들수가 있다. 
실제로 우리가 DB에 쿼리(질의)를 날리다고 말을 하는데, 바로 이녀석(테이블)이 바로 그 대상인 셈이다. 
그러니까, DB의 무결성과 완벽성은 바로 얼마나 테이블을 잘 만들고 관리하느냐에 따라 사정이 
확연히 달라진다. 
테이블이 혼자 놀수도 있지만, 아주 비싼 컴포넌트 오디오처럼 여러가지 연결선을 통해 
하나로 동작하는 경우도 있다. 테이블간의 관계(조인)로 이루어진 DB는 매우 복잡한 일에 쓰이게 된다. 
관계형데이터베이스라 불리우는 이유는 바로 여기에 있다. 자료구조들이 서로 관계를 맺고 있으면서 
상호작용을 하기 때문이다.
데이터베이스 디자인이 중요한 문제로 떠오르는 것은 이러한 관계가 처음에 잘못 설정이 되면, 
애플리케이션 전체를 처음부터 다시 프로그래밍을 해야하는 어처구니 없는 사태에 다다르게 되기 때문이다.
이것은 나도 두어번 경험을 해서 매우 중요시하고 조심스러워 하는 부분이다. 
하지만 여기선는 user된자의 기본도리인 테이블하나만 만들어 보는 것으로 만족한다. 

그 이상은 자신도 없거니와 독립적인 범주로 다루어야 할 주제라 생각되기 때문이다. 



◆ USER로 로긴하기

아무것도 없는 껍데기에 이제 user된 자의 도리를 다해 
실내장식에 게으름을 피워선 안된다. 이제 이사를 와서 보았더니 벽에 벽지도 붙어있지 않는 집을 
상상해 보자... Empty set ... 바로 이런 격이다. 
이제 테이블을 하나둘 들여놓아야 한다. 그래야 잠도 자고 살림도 하고 그럴테니까.. 

% mysql -udaepal -pdaepal user1 

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 58 to server version: 3.22.24 

Type 'help' for help. 

mysql> show tables; 
Empty set (0.01 sec) 

mysql> 




◆ 테이블 생성
mysql> create table individual 
-> ( 
-> pno char(13) primary key, 
-> name char(20) not null, 
-> addr char(80), 
-> tel char(15) 
-> ) 
-> ; 
Query OK, 0 rows affected (0.01 sec) 

mysql> show tables; 
+-----------------+ 
| Tables in user1 | 
+-----------------+ 
| individual | 
+-----------------+ 
1 row in set (0.00 sec) 

mysql> select * from individual; 
Empty set (0.01 sec) 

테이블만 만들면 되는가? 
당연히 테이블의 내용물을 채워야 한다. 
참고로 primary key(주키)라는 것은 하나의 테이블이 자신의 주체성을 확보하기 위해 -
데이터의 무결성이라고 한다- 반드시 있어야 한다.. 
이것의 존재이유는 여러가지가 있지만, 다른 테이블과 자신을 구별하기 위해 쓰인다고 보면 된다.
나를 세계의 유일한 존재로 알리는 것은 이름인가? Never!!! 라고들 이야기 한다. 
그대신 우린 740551-1666418 이라는 주민번호를 쓴다. 물론 이것도 세계의 유일한 존재보다는 
대한민국의 유일한 존재라고 보는게 낫겠다. 주민번호를 독일에 가서 쓸 생각이 아니라면.....^^; 
그리고 색인기능(index)을 가지고 있는 필드(항목)쯤으로 기억해두면 편할 것이다. 
데이터검색 효율을 높이기 위해 인덱싱을 한다고 한다. 
도서관에 가서 책을 가장 빨리 찾는 방법은 ? 
유일하지는 않지만, 대강 방법이 있다. 바로 그것이 인덱싱이다. 




◆ 테이블 내용 채우기
mysql> insert into individual 
-> values ('740551-1666418','정유리','전남 완도군 소안면','123-1234') 
-> ; 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from individual; 
+---------------+--------+--------------------+----------+ 
| pno | name | addr | tel | 
+---------------+--------+--------------------+----------+ 
| 740551-166641 | 홍지현 | 전북 임실군 임실읍 | 123-1234 | 
+---------------+--------+--------------------+----------+ 
1 row in set (0.00 sec) 




created by 장원철
modified by 송윤경

'Database' 카테고리의 다른 글

mysql_4.1.x 부터 계정 추가시 달라진점  (0) 2017.01.07
mysql index 속도 높히기  (0) 2017.01.07
실수로 삭제한 mysql DB 복구방법  (0) 2017.01.07
mysql 깨진 테이블 복구하기  (0) 2017.01.07
웹서버 & mySQL 백업  (0) 2017.01.06

/root아래에 backup.sh 이라는 파일을 만들어 놓고 백업 명령어를 다음과 같이 주었다.

#!/bin/bash
/usr/local/mysql/bin/mysqldump -uroot -p***** mysql > mysql_db_bak_$(date +%Y%m%d).sql
/usr/local/mysql/bin/mysqldump -uyanemone -p***** yanemone > yanemone_db_bak_$(date +%Y%m%d).sql
mv *.sql /backup
tar cvfpz /backup/html_bak.tar.gz /var/www/html
tar cvfpz /backup/yanemone_html_bak.tar.gz /home/yanemone/public_html
tar cvfpz /backup/dichang_html_bak.tar.gz /home/dichang/public_html

백업할 내용이라던지 파일 이름은 자신의 상황에 맞게 주면 되겠다.

이렇게 하고 나면 backup.sh파일을 chmod 100 backup.sh로 단단히 무장하라.

그리고 crontab -e 명령으로 cron 작업을 명시하자
그럼 vi가 열리면서 편집이 가능하다

00 06 * * * /root/backup.sh

를 추가하고 :x 로 저장하고 나오자.
위의 작업은 매일 새벽 6시에 /root/backup.sh을 실행하라 라는 말이다.

그리고 /var/spool/cron/root가 있는지 확인해보자. 있다면 정상적으로 수행할 것이다.

*************************************************************************************
팁팁팁
이렇게 하면 cron의 결과를 cron 데몬이 root에게 친절하게도 메일을 자꾸 날려준다. (x10)
정말 귀찮고 용량도 만만치 않다.
안오게 할 수 있다.

/etc/crontab이라는 파일을 열어보자
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=ROOT
HOME=/

부분이 있다. MAILTO=ROOT를 다음과 같이 고쳐보자
MAILTO=""
************************************************************************************

크론에 등록시 아래와 같이 하면 메일이 날아오지 않는다.
위에꺼는 전체 메일이 다 날아오지 않으므로 주의 해야 한다.
그러므로 아래꺼 사용하믄 된당...
00 06 * * * /root/backup.sh >/dev/null 2>&1 


************************************************************************************
추가팁 저장할 파일의 크기가 클경우 분할하여 압축할수 있다.
백업을 하다보면 기가단위가 넘을때가 많습니다.
그때는 분할백업(CD 1장 단위가 좋겠죠...)
tar -zcvpf - /압축할dir | split -b 670mb - 압축파일.tar.gz 

그러면 압축파일.tar.gzaa 
압축파일.tar.gzab순으로 파일이 생깁니다. 

-b 670mb는 압축파일을 670mb단위로 분할 하라는 옵션입니다. 

압축풀라고 할때는 (쿠쿠 바로 답해 주셔서 캄솨함다.)
cat test.tar.gza* > test.tar.gz
로 하여 tar.gz파일로 만들어서 풀면 된다.
***********************************************************************************

***********************************************************************************
삼바로 마우트한 윈도우즈 백업서버에 데이터 저장
mount -t smbfs -o username=윈도우계정아이디,password=윈도우패스워드 //서버이름/backup /backup
***********************************************************************************

+ Recent posts