_ xml_ns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
MySQL 관련 팁 정리 - Biocourse
<script type= "text/javascript">
var skin = "monobook";
var stylepath = "/skins";
var wgArticlePath = "/index.php/$1";
var wgscriptPath = "";
var wgServer = "http://biocourse.org";
var wgCanonicalNamespace = "";
var wgNamespaceNumber = 0;
var wgPageName = "MySQL_관련_팁_정리";
var wgTitle = "MySQL 관련 팁 정리";
var wgArticleId = 2729;
var wgIsArticle = true;
var wgUserName = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
script>
<script type="text/javascript" src="/skins/common/wikibits.js?1">script>
<script type="text/javascript" src="/index.php?title=-&action=raw&gen=js">script>
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! This is done with: /usr/bin/mysqladmin -u root -p password 'new-password' /usr/bin/mysqladmin -u root -h ns.dbakorea.pe.kr -p password 'new-password'
쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다. 나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다. /usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
→ 주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다. 위와 같이 하니 /usr/bin/mysql이 /var/lib/mysql/mysql.sock에서 소켓파일을 찾으려 했다.
socket file을 지정하는 --socket이라는 옵션으로 다음과 같이 지정하면 된다.
mysql --socket=/tmp/mysql.sock -u dbakorea -p db_test
→ 하지만 mysql실행시마다 이렇게 써줘야한다는 것이 상당히 귀찮다. 옵션이 바로 적용되게 설정하자.
* mysql은 설정사항을 다음 3가지 파일에서 검색한다.
/etc/my.cnf global options (MySQL 전체적으로 사용되는 옵션 정의) mysql-data-dir/my.cnf 특정 DB에 적용되는 option (/var/lib/mysql/my.cnf) ~/.my.cnf 사용자 각각의 설정('~'문자는 사용자의 홈디렉토리는 의미)
*소켓파일의 지정은 다음줄을 넣어주면 된다.
socket = /tmp/mysql.sock
* == /etc/my.cnf예 ==
# The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /tmp/mysql.sock
# The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock
mysql -u 사용자 -p DB명 ( or % mysqladmin -u root -p drop DB명 )
데이터파일 실행(sql*loader기능)
mysql>load data local infile "데이터파일" into table 테이블명 ;
데이터파일에서 컬럼구분은 탭문자, Null값은 /n로 입력
질의 파일 실행
쉘프롬프트상에서
mysql -u 사용자 -p DB명 < </font>질의파일 or mysql프롬프트상에서
mysql> source 질의파일
쉘프롬프트상에서 질의 실행
dbakorea@lion board]$ mysql mysql -u root -pxxxx -e \\ > "INSERT INTO db VALUES( > 'localhost', 'aaa', 'aaa', > 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y')"
사용자 생성 & 사용자에게 DB할당
shell> mysql --user=root -p mysql
mysql> INSERT INTO user VALUES('localhost','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','DB명','사용자','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('%','DB명','사용자','Y','Y','Y','Y','Y','Y');
/var/lib디렉토리는 여러 프로세스들이 사용하는 데이터를 저장하는 일종의 파일시스템상의 데이터베이 스라고 볼 수 있다.
replace
→해당 레코드 존재하면 update하고, 존재하지 않는다면 insert한다.(insert문법과 동일)
replace into test values('maddog','kang myung gyu')'
explain
→ explain 질의문: 지정한 질의문이 어떻게 실행될 건지를 보여줌
mysql> explain select u.uid, u.name, a.name from sm_user u, sm_addr a where u.uid=a.uid; +-------+------+-----------------+-----------------+---------+-------+------+-------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------+------+-----------------+-----------------+---------+-------+------+-------+ | u | ALL | PRIMARY | NULL | NULL | NULL | 370 | | | a | ref | sm_addr_uid_idx | sm_addr_uid_idx | 11 | u.uid | 11 | | +-------+------+-----------------+-----------------+---------+-------+------+-------+ 2 rows in set (0.01 sec)
temporary table
→ 크기가 큰 테이블에 있는 subset에 대한 질의라면 subset을 temporary table에 저장한 후 질의하는 것이 더 빠를 경우가 있다.
create temporary table (...); create temporary table (...) type=heap; 디스크가 아닌 메모리에 테이블 생성
MySQL 특성정리
→primary key지원 index 지원(15개컬럼, 256byte까지) foreign key, check, references기능 지원하지 않음(형식상 있음)
mysql> CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name));
* MySQL에서의 Stored script개념 => SQL server language * commit-rollback개념 => lock tables