- ISSUE
- 뉴스정보
- 주식정보
- 유용한정보
- 포트폴리오
- 각종분석법
- 투자에 도움이 되는 글
- 주식잡동사니
- 잡동사니
- 가치투자재테크
- 로또645
- 로또마을
- 컴퓨터팁&테크
- 자격증&강좌모음
- 스포츠종합영상
- 블로그팁&테크
- 리치
- 유로2008
[인터리치]
쉬운돈벌기 제공 + 수익금지원
로또분석-플러스645
좋은책 모닝365
:+:+:+::[UCC 위젯 퍼가기]::+:+:+:
보험최저가로 가입하는요령 쉬운 돈벌기 방법
php에 관하여....
1. php 언어의 규칙
1)구동법은 <? php언어; ?>이다.
2)변수는 앞에 $를 붙인다.
3)변수와 다음 변수 사이에는 &를 붙인다.
4)모든 숫자의 처음 시작은 0부터이다.
5)연산자
! 없으면
& 그리고
!= 같지 않다
% 뒷 수로 나눈 나머지
2. php 각종 명령어
echo "내용" '화면에 '내용'을 출력한다.'
print "내용"
printf ("내용")
=
phpinfo() 'php 정보를 출력한다.'
include "파일명" '파일 속에 다른 파일을 불러들인다.'
$변수[숫자] = "내용" ''변수[숫자]'를 '내용'으로 정한다.'
페이지 주소?변수 = 내용
참고 ] 내용에다가 '\r\n'을 쓰게 되면 한 줄이 띄워진다.
mail("메일 주소", "제목", "내용") '메일을 보낸다.'
if (1번 조건){1번 조건이 참일 경우의 내용} '조건에 따라 값을 출력한다.'
elseif (2번 조건){1번은 거짓, 2번 조건이 참일 경우의 내용}
else {둘다 거짓일 때의 내용}
참고 ] exit를 사용하면 밑의 내용이 실행이 안된다.
for (초기값;조건;증감값){반복시킬 내용} '초기값부터 조건값까지 증감된 만큼 내용을 반복한다.'
count($변수) '변수의 갯수를 세어준다.'
explode("분리할 수 있는 기호", $변수명) '기호를 기준으로 분리해서 다른 변수에 배열로 삽입한다.
fopen("파일명", " 모드") '파일을 연다.'
[모드] - r 읽기 전용
w, a 쓰기 전용
r+, w+, a+ 읽기 쓰기 가능
참고 ] w를 사용하면 원래 내용이 지워지고 덮어쓴다.
a를 사용하면 원래 내용에 추가된다. 단 파일이 있어야 한다.
a+를 사용하면 원래 내용에 추가되고, 파일이 없으면 만들어진다.
fclose($fopen이 들어있는 변수) 'fopen으로 불러들인 파일을 닫는다.'
fputs($fopen이 들어있는 변수, "내용") 'fopen으로 불러들인 파일에 '내용'을 쓴다.'
fgets($fopen이 들어있는 변수, 글자 수) 'fopen으로 불러들인 파일을 글자수 만큼 읽어들인다.'
while($fgets가 들어있는 변수){반복할 내용} 'fgets로 읽어들일 수 있을 때 계속 반복해준다.'
time() (mysql의 경우에는 now()이다) '1970년을 기준으로 현재의 시간을 나타낸다.'
date("Y m d h:i:s", $time이 들어있는 변수) 'time으로 표현된 시간을 정상적인 날짜로 바꾼다.'
file("파일명") ''파일'을 줄단위 배열로 읽어들인다.'
ereg("내용",$변수) '변수 안에 '내용'이 있으면 true로, 없으면 false로 한다.'
str_replace("원본내용", "바꿀 내용",$변수) '변수 안에 있는 '원본 내용'을 '바꿀 내용'으로 바꾼다.'
substr($변수, 시작할 위치, 글자 수) '변수 안에 있는 '내용'에서 '시작할 위치 부터 글자수 만큼'
출력한다.'
strlen($변수) '변수 안에 있는 '내용'의 글자수를 출력한다.'
setcookie("변수", "내용") '변수를 '내용'으로 정한다. 단, 열려있는 다른 파일에도 적용된다.'
참고 ] 내용 뒤에 -1을 넣으면 브라우저가 활성화 된 동안에만 쿠키가 유효하며
그 뒤에 "/"를 넣으면 해당 도메인 전체에서 사용할 수 있다.
unlink(파일) '파일을 삭제한다.'
$REMOTE_ADDR '사용자의 ip를 나타낸다.'
$PHP_SELF '현재 페이지의 주소를 나타낸다.'
$HTTP_USER_AGENT '사용자의 브라우저 정보를 나타낸다.'
$HTTP_REFERER '이전 페이지의 주소를 나타낸다.'
mysql을 사용할 때 기본으로 들어가는 명령어.
-----------------------------------------------------------------------------------------------
mysql_connect("호스트명", "아이디", "비밀번호") '호스트로 접속한다.'
mysql_select_db("데이터베이스명") '데이터베이스를 불러들인다.'
mysql_close($mysql_connect가 들어있는 변수) '호스트 접속을 끊는다.'
참고 ] or die("경고내용")를 붙이면 실패했을 경우 "경고 내용"의 경고창이 뜬다.
-----------------------------------------------------------------------------------------------
mysql에서 편집에 사용하는 명령어.
-----------------------------------------------------------------------------------------------
"insert into 테이블명( 필드명 ) values('값')" '각 필드 안에 값을 넣는다.'
"select 필드명 from 테이블명 where 필드명='조건' order by 필드 asc/desc limit [시작번호,]갯수"
'각 필드에서 오름차순(asc)이나 내림차순(desc)으로
시작번호부터 갯수만큼 '조건'에 맞는 값을 가져온다.'
참고 ] 1) "select count(*) as 문자 from 테이블명" 을 사용하게 되면
테이블 안에 있는 전체 자료의 갯수를 구할 수 있고, '전체 자료의 갯수 = 문자'가 된다.
2) password(필드)를 사용하면 필드 내용이 암호화되어 가져온다.
3) (필드명 like '%$변수%')를 사용하면 변수 내용이 들어가 있는 필드내용은 모두 가져온다.
4) $변수 .= "내용"은 변수의 내용 다음에 "내용"이 추가된다.
"delete 필드명 from 테이블명 where 필드명='조건' " '조건에 맞는 필드를 찾아 삭제한다.'
"update 필드명 set 테이블명 where 필드명='조건' " '조건에 맞는 필드를 찾아 수정한다.'
mysql_query($insert, select, delete , $mysql_connect가 있는 변수)
'insert, select, delete로 대입된 값을 실제로 전달한다.'
참고 ] select의 경우 전달받은 데이터를 표현하기 위해서
mysql_query부분을 한 변수로 지정해야 한다.
mysql_Fetch_array($mysql_query가 있는 변수) 'query로 전달받은 값을 '변수[$mysql_query가 있는 변수]'에 넣는다.'
-----------------------------------------------------------------------------------------------
mysql에서 function에 사용하는 명령어
-----------------------------------------------------------------------------------------------
function 이름($변수){내용} ''내용'을 실행하는 '이름()'라는 이름을 가진 기능을 하나 만든다.
단, 바로 실행되지는 않는다. '
참고 ] 다른 곳에서 이름("내용")을 입력하게 되면 '$변수 = 내용' 이 된다.
global $변수 '전역(전체의) 변수를 지역(한 부분의) 변수로 사용할 수 있게 한다.'
return $변수 '함수 속에서 값이 정해진 $변수를 함수가 사용된 곳에 대입한다.'
-----------------------------------------------------------------------------------------------
mysql에서 파일 업로드에 사용하는 명령어
-----------------------------------------------------------------------------------------------
move_uploaded_file '파일을 특정 폴더에 업로드한다.'
($파일이 있는 변수, "파일을 보낼 폴더", $파일이 있는 변수_name)
참고 ] 파일이름_name 이름
_type 형식
_size 크기
-----------------------------------------------------------------------------------------------
mysql에서 세션에 사용하는 명령어
-----------------------------------------------------------------------------------------------
session_start() '세션을 시작한다.'
session_register("변수") ''변수'를 세션으로 등록한다.'
session_destroy() '세션에 등록된 값이 사라진다.'
-----------------------------------------------------------------------------------------------
3. 기타 html 명령어
form action=대상 파일명 method=보낼 방식 name=이름 '대상 파일로 '보낼 방식'으로 보낼 '이름'양식을 만든다.'
참고 ] 1) method는 get과 post방식이 있다.
get 방식 -> 주소창에 '입력된 변수'가 그대로 보인다.
post 방식 -> 주소창에 '입력된 변수'가 보이지 않는다.
post 방식에 추가로 'enctype = multipart/form-data' 을
사용해야 업로드가 가능하다.
2) readonly를 넣으면 읽기전용이 된다.
input type=형태 '내용을 가진, 변수를 입력할 양식을 만든다.'
value=내용
name=변수명
4.자바 스크립트
location.href = "대상 페이지" '대상 페이지로 바로 이동한다.'
window.alert('내용') ''내용'이 적혀있는 경고창이 나타난다.'
return confirm('내용') ''내용'이 적혀있는 확인창이 나타난다.'
history.back(1) '이전 페이지로 이동한다.'
document.폼 이름.개체 이름.속성 '폼의 한 개체의 속성을 가리킨다.'
opener '이 페이지를 열게 한 페이지를 가리킨다.'
window.close() '창을 닫는다.'
flash & php PHP
2007/03/16 23:28
http://blog.naver.com/rookiemodel/10015259420
PHP(Professional Hypertext Preprocessor)의 이해
PHP는 현재까지 서버사이드 스크립트중에 오픈소스로 개발되는 것 중에 가장 대중화된 언어입니다.
서버사이트 스크립트라고 함은 서버에서 작동되는 스크립트를 말합니다.
이와 대별되는 자바스크립트는 사용자(클라이언트)컴퓨터에서 작동되는 스크립트입니다.
PHP는 거의 모든 웹서버와 운영체계에서 사용할 수 있습니다.
PHP와 플래시
1. mysql 접속 종료 명령어 -
mysql>프롬프트상에서 \'\\q\',\'exit\',\'quit\' 사용하면 리눅스 쉘로 빠져나온다.
2. mysql>show databases; - mysql에서 데이터베이스의 정보를 보기위한 명령어이다.
즉 이 명령어를 이용해 현재 생성되어 있는 데이터 베이스 목록을 볼 수 있다.
그리고 mysql 사용자에서 모든 명령은 항상 세미콜론(;) 혹은 \'\\g\'로 끝나야 한다.
3. mysql>use 선택 데이터베이스 이름; - 사용할 데이터베이스를 선택하려면, \'use\'라는 명령어를 사용한다.
4. mysql>show tables; - 선택한 데이터베이스에서 생성되어 있는 테이블을 보려면, 데이터베이스를 볼대마다 \'show tables;\'을 사용하면 된다.
5. sql>desc 데이블명; - 해당테이블의 구조를 파악한다. 여기서 desc는 \'describe\'의 약자이다.
지금부터 데이터베이스 생성과 등록에 대해 알아본다.
1. mysql>create database db명; - 데이터베이스 생성 명령어이다.
2. mysql>drop database 삭제할db명; - 해당 데이터베이스를 삭제한다.
3. 그리고 만들어진 데이터베이스가 test1이라면 이 데이터베이스 사용자 php이라면 이 두가지를 mysql 데이터베이스 하위의
db테이블에 등록해야 한다. 그러기 위해서는 먼저 mysql데이터베이스를 선택해서 이동해야 한다.
mysql>use mysql; - mysql 데이터베이스로 이동한다
mysql>show tables; - 데이터 종류를 확인한다.
mysql>desc db; - db테이블 구조를 확인한다.
mysql>insert into db values(\'%\',\'test1\',\'php\',\'y\',\'y\',\'y\',\'y\',\'y\',\'y\',\'y\',\'y\',\'y\',\'y\');
- db테이블에 test1데이터베이스와 php사용자와 사용권한을 모두 y로 설정하고 각각
등록한다. 여기서 test1데이터베이스와 php사용자가 등록되면 \'php\'라는 사용자는 해당
\'test1\'데이터베이스에 대해 모든 권한을 갖게 된다.
여기서 주의할 것은 \'host\',\'db\',\'use\'필드를 제외하고 모든 필드를 \'y\'로 설정해야 한다.
* 사용자 관리 *
리눅스에서 수퍼유저는 즉 최고 관리자 계정은 root이다. 똑같이 mysql 데이터베이스에서 슈퍼유저가 있다.
바로 root이다. mysql을 처음 설치하면 root 암호가 설정되어 있지 않다.
그러므로 보안상 중대한 문제가 발생하므로 지금부터 root 비밀번호 설정과
새로운데이터베이스에 root를 등록해 본다.
먼서 root의 비밀번호를 변경하려면 mysql데이터베이스의 user 테이블을 수정해야 한다.
mysql>use mysql; - mysql 데이터베이스 선택
mysql>desc user; - user테이블 구조 파악
mysql>select host, user, password
->from user
->where user = \'root\' ;
- root 사용자의 서버주소와 사용자 암호를 파악한다.
mysql>update user
->set password = password(\'my2006\')
->where user = \'root\' ;
- root 사용자의 암호를 my2006으로 지정한다. 여기서 주의할 것은
반드시 mysql 데이터베이스의 테이블을 수정한 후 반드시 mysql을 재시동해야 한다.
그리고 해당 데이터베이스에 접근할려면 꼭 암호를 입력해야 한다.
재시동은 mysql접속을 끊고 해야 한다.
mysql>exit - mysql 접속을 끊고 빠져 나간다.
도스 기준으로 설명한다.
d:\\>mysqladmin -u root reload - mysql을 재시동하는 명령어 이다.
여기서 -u옵션은 사용자란 의미이고 root는 해당 사용자, reload는 재시동하라는 의미이다.
예를 들어 php사용자 암호 1234를 등록하고 재시동하였다 하자 그리고 접속할려면
d:\\>mysql -u php -p mysql - php사용자, -p옵션은 암호를 입력하는 것이고, mysql은 해당 데이터베이스 이름이다.
위의 php와 암호 1234를 등록하는 방법은?
mysql>use mysql;
mysql>insert into user (host, user, password)
->values(\'localhost\',\'php\',password(\'1234\'));
- 여기서 password명령어는 1234 암호를 암호화 시킨다.
만약 이 명령어를 생략하면 암호화되지 않고 1234로 저장되기 때문에 보안상 암호가 노출될
염려가 있다.
실습
d:\\>mysql -u abc -p member7 - mysql명령어는 mysql데이터베이스 접속 명령어이다. abc는 사용자, member7은 데이터베이스 이름이다.
enter password : *** 암호를 입력하면 member7데이터베이스로 접속된다.
mysql>show tables; - 해당 테이블 종류를 알아보고
mysql>create table member (
->number int not null
->, name varchar(20) not null
->, email varchar(50)
->, age int not null
->, tel varchar(20) not null
->, addr varchar(50)
->, primary key(number)
-> );
-반드시 끝에는 세미콜론을 해준다. 그리고 php는 c언어 기반이기 때문에 필드명 대소문자 구문한다.
mssql에서는 세미콜론을 안해줘도 된다. 그리고 필드명 대소문자도 구분하지 않는다.
mysql>desc member ; - member테이블 구조를 확인한다.
자 그럼 지금부터 테이블 수정문 즉 alter table 대해서 공부한다.
먼저 필드 추가문
mysql>alter table member
-> add homepage varchar(50) ;
- 이 명령문은 member테이블에 homepage필드를 추가하는 명령어
mysql>alter tabel member
-> change homepage homepageurl varchar(40)
- 추가된 homepage필드명을 homepageurl 필드명으로 바꾸고 자료형을 varchar(50)에서 varchar(40)으로
바꾸는 명령어 이다.
mysql>alter table member
-> drop homepageurl
- 변경된 homepageurl 필드명을 삭제한다.
반드시 위 명령을 실행 후 desc member;문으로 변경사항을 확인해야 한다.
mysql>desc member;
mysql>drop table 삭제할 테이블명 - 이 명령어를 입력하면 해당 테이블이 삭제된다.
테이블에 저장된 데이터까지 모두 지워지게 되므로 사용시 주의해야 한다.
mysql>select 필드명 from 테이블명 where 조건문 order by 정렬 조건;
- 해당 조건에 맞는 필드명을 검색한다. order by 필드명(asc)는 오름차순 정렬하고 order by 필드명 desc는
내림차순 정렬한다. 오름차순은 가나다순, abc순, 작은 숫자부터 큰숫자 순으로 정렬, 내림차순은 반대다.
그리고 asc는 생략가능하다. *는 모든필드를 의미한다.
mysql>insert into memeber values(값); - 레코드 삽입
mysql>update member set 필드명1=값1, 필드명2=값2
->where 조건문 ;
~조건문에 맞는 값만 수정시켜준다.
mysql>delete from 테입블명;
~한번 삭제된 자료는 복구할 수 없기 때문에 delete문을 사용할 때는 조심해야한다.
자료 삭제시 where 절을 생략하면 해당하는 테이블의 모든 자료가 삭제된다.
그러므로 삭제문을 사용할 때는 자료의 삭제범위에 따라 where절을 적절히 사용해야 한다.
My SQL 명령어 정리
mysql 명령어 모음
# root암호설정 - root로 로그인하여 해야함
% mysqladmin -u root password '변경암호'
% mysqladmin -u root -p기존암호 password '변경암호'
root암호변경설정
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'
DB작업
DB생성: mysql> create database DB명 ( or % mysqladmin -u root -p create DB명 )
DB삭제: mysql> drop database DB명
DB사용: mysql> use DB명 (엄밀히 말하자면, 사용할 'default database'를 선택하는 것이다.)
DB변경: mysql> alter database db명 DEFAULT CHARACTER SET charset (4.1이상에서만 available)
This article comes from dbakorea.pe.kr (Leave this line as is) MySQL 연결
mysql -u 사용자 -p DB명 ( or % mysqladmin -u root -p drop DB명 )
데이터파일 실행(sql*loader기능)
mysql>load data infile "데이터파일" into table 테이블명 ;
데이터파일에서 컬럼구분은 탭문자, Null값은 /n로 입력
데이터파일의 위치는 /home/kang/load.txt 와 같이 절대경로로 지정할것.
질의 파일 실행
쉘프롬프트상에서
mysql -u 사용자 -p DB명 < 질의파일
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');
mysql> FLUSH PRIVILEGES; (or shell prompt: mysqladmin -u root -pxxxx reload)
CASE 2: GRANT명령을 이용한 사용자 생성(이 방법이 권장된다)
kang이라는 DB를 만들고, 이 DB를 아래에서 나열된 권한을 가진 kang이라는 사용자를 생성
create database kang;
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';
mysql> create database kang;
Query OK, 1 row affected (0.00 sec)
mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
Query OK, 0 rows affected (0.00 sec)
mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';
Query OK, 0 rows affected (0.01 sec)
mysql>
여러가지 명령정리
mysql> show variables; 서버의 variables(설정사항)출력
mysql> show variables like 'have_inno%' 조건에 맞는 variables만 출력
mysql> show databases; database목록
mysql> show tables; 현재DB의 테이블목록(temporary table은 출력하지 않음)
mysql> show tables from db명; 지정된 db명이 소유한 테이블목록
mysql> show tables like 'mem%'; 조건에 맞는 테이블목록만 출력
mysql> show index from 테이블명; 인덱스 보기
mysql> show columns from 테이블명; 테이블구조(describe 테이블명, explain 테이블명)
mysql> show table status; 현재 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show table status from db명; 지정된 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show create table 테이블명; 해당 테이블 생성 SQL문 출력
mysql> rename table 테이블1 to 테이블2; 테이블명 변경(ALTER TABLE 테이블1 RENAME TO 테이블2)
mysql> rename table 테이블1 to 테이블2, 테이블3 to 테이블4; rename multiple tables
mysql> rename table db1명.테이블명 to db2명.테이블명; 테이블을 다른 DB로 이동
mysql> alter table 테이블명 add 컬럼명 데이터타입; 컬럼추가
mysql> alter table 테이블명 del 컬럼명; 컬럼제거
mysql> alter table 테이블명 modify 컬럼명 컬럼타입; 컬럼명에 지정된 컬럼타입의 변경
mysql> alter table 테이블명 change old컬럼명 new컬럼명 컬럼타입 컬럼명 변경
mysql> alter table 테이블명 type=innodb; 테이블type변경
mysql> create table 테이블명(..) type=heap min_rows=10000; 10000row를 수용할 수 있을 만큼 메모리할당(heap type이므로)
mysql> select version(); MySQL서버버전 출력
mysql> create table 테이블2 as select * from 테이블1; 테이블1과 동일한 테이블 생성(with 데이터, as는 생략가능)
mysql> create table 테이블2 as select * from 테이블1 where 1=2; 테이블1과 동일한 구조의 테이블 생성(without 데이터, 1=2는 0으로 할수도 있다.)
mysql> insert into 테이블2 select * from 테이블1; 테이블1의 데이터를 테이블2에 insert
테이블이 존재여부 파악
DROP TABLE IF EXISTS 테이블명;
CREATE TABLE 테이블명 (...);
프로그래밍 언어에서 COUNT(*)를 사용하여 질의가 성공하면 테이블이 존재함을 파악할 수 있다.
ISAM, MyISAM의 경우 COUNT(*)가 최적화되어 상관없으나, BDB, InnoDB의 경우 full scan이 발생하므로 사용하지 마라.
대신 select * from 테이블명 where 0; 을 사용하라. 질의가 성공하면 테이블이 존재하는 것이고, 아니면 존재하지 않는 것이다.
접속
mysql {-h 접속호스트} -u 사용자 -p 사용DB
-h로 다른 서버에 존재하는 MySQL접속시 다음과 같이 MySQL DB에 설정해줘야 한다.
mysql> INSERT INTO user VALUES('접근을 허용할 호스트ip','사용자',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('접근을 허용할 호스트ip','사용DB','사용자','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES; or 쉴프롬프트상에서 % mysqladmin -u root -p flush-privileges
검색조건(where)
regular expression을 지원하다니 신기하군..
mysql> select * from work where 열명 regexp "정규표현식";
백업 & 복구
mysqldump {-h 호스트} -u 사용자 -p DB명 > 백업파일
mysql {-h 호스트} -u 사용자 -p DB명 < 백업파일
mysqldump -u root -p --opt db_dbakorea > dbakorea.sql
mysqldump -u root -p --opt db_board | mysql ---host=remote-host -C database (상이한 머쉰)
mysql -u dbakorea -p db_dbakorea < dbakorea.sql
mysqldump -u root -p --opt db_dbakorea | mysql ---host=ns.dbakorea.pe.kr -C db_dbakorea
테이블 생성구문만을 화면에서 보려면 다음과 같이 --no-data를 사용한다. 테이블명을 생략하면 모든 테이블 출력
mysqldump -u 유저명 -p --no-data db명 테이블명
테이블 검사
isamchk
오라클 sysdate와 동일
insert into test values('12', now());
유닉스 time()함수 리턴값 사용
FROM_UNIXTIME(954788684)
UNIX_TIMESTAMP("2001-04-04 :04:04:04")
MySQL 디폴트 DB&로그파일 위치
/var/lib/mysql
/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에 저장한 후 질의하는 것이 더 빠를 경우가 있다.
temporary table는 세션내에서만 유효하고(현재 사용자만이 볼수 있다는 뜻), 세션종료시 자동적으로 drop된다.
create temporary table (...);
create temporary table (...) type=heap; 디스크가 아닌 메모리에 테이블 생성
존재하는 permanent table의 테이블명과 동일하게 생성할 수 있으며,
temporary table은 permanent table보다 우선시되어 처리된다.
4.0.7의 감마버전에서 테스트하면 결과는 약간 달라진다. 버그인건지..
mysql> create table test (id varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values('dbakorea');
Query OK, 1 row affected (0.00 sec)
mysql> create temporary table test(id varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
Empty set (0.00 sec)
mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
+----------+
| id |
+----------+
| dbakorea |
+----------+
1 row in set (0.00 sec)
Table Type에 다른 Files on Disk
ISAM .frm (definition) .ISD (data) .ISM (indexes)
MyISAM .frm (definition) .MYD (data) .MYI (indexes)
MERGE .frm (definition) .MRG (list of constituent MyISAM table names)
HEAP .frm (definition)
BDB .frm (definition) .db (data and indexes)
InnoDB .frm (definition)
보통 mysqldump를 사용하여 백업을 수행하여 다른 DB서버에 데이터를 restore하면 된다.
MySQL은 별다른 작업없이 데이터파일을 단순히 복사(copy)하는 것만으로도 다른 서버에
DB을 이동시킬 수 있다. 하지만, 이런 방식이 지원되지 않는 table type도 있다.
ISAM: machine-dependent format하기때문에..
BDB : .db파일에 이미 테이블위치가 encode되어 있기때문에..
MyISAM, InnoDB, MERGE :가능(machine-independent format)
별다른 지정을 하지 않았다면 디폴트 TABLE type이 MyISAM이므로, 무난히 migration할 수 있다.
floating-point컬럼(FLOAT,DOUBLE)이 있다면 이러한 방식이 실패할 수 도 있다.
쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다.
나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다.
/usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다.
# MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/var/lib/mysql/mysql.sock}
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/tmp/mysql.sock}
위와 같이 하니 /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 사용자 각각의 설정('~'문자는 사용자의 홈디렉토리는 의미)
/usr/share/mysql디렉토리에 예제가 있으므로 참고한다.
소켓파일의 지정은 다음줄을 넣어주면 된다.
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
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
MySQL에서 통계처리시
orderby, groupby 는 sort_buffer를 늘여준다.(show variables)
live table(smslog)에서 모든 질의를 처리하지 말고 summary table에 질의결과를 저장해 재질의 처리한다.
summary table이 heap-type table가 가능한지 확인할 것.
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
tblTemp1.fldOrder_ID > 100;
join이 subselect보다 빠르다.
join시 사용되는 컬럼은 동일한 column type과 길이를 가져야만 최적의 속도를 보장한다.
즉, 동일 column type이지만 길이가 다르다면(char(11), char(10)), 동일한 컬럼도메인으로 변경해주는 것이 좋다.
where의 in은 optimize되어 있으므로 빠르다
insert,select는 동시에 수행가능하다.(어떻게?)
explain으로 질의과정 점검
varchar to/from char
conversion varchar를 char로 변경할 경우 모든 컬럼타입을 동시에 변경해야 한다.
반대의 경우, 하나만 char->charchar변경시 다른 모든 컬럼도 varchar로 변경됨
참.. 특이하구만..
mysql> CREATE TABLE chartbl (name VARCHAR(40), address VARCHAR(80));
Query OK, 0 rows affected (0.05 sec)
mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(40) | YES | | NULL | |
| address | varchar(80) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)
mysql> alter table chartbl modify name char(40);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(40) | YES | | NULL | |
| address | varchar(80) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table chartbl modify name char(40), modify address char(80);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc chartbl;
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| name | char(40) | YES | | NULL | |
| address | char(80) | YES | | NULL | |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql>
"For each article, find the dealer(s) with the most expensive price."
표준안
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
수정안(최적화)
CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);
LOCK TABLES shop read;
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
SELECT shop.article, dealer, shop.price FROM shop, tmp
WHERE shop.article=tmp.article AND shop.price=tmp.price;
UNLOCK TABLES;
DROP TABLE tmp;
==============================================================================
MySQL 특성정리
==============================================================================
primary key, foreign key지원
index 지원(15개컬럼, 256byte까지)
MySQL에서의 Stored Script개념 => SQL server language
commit-rollback개념 => lock tables(lock table test write -> 트랜잭션.. -> unlock tables)
컬럼명길이: 64자까지, 컬럼 Alias: 256자까지
not case-sensitive: keywords, functions, column, index명
case-sensitive: database, table, alias명
키워드,함수명은 대소문자구별이 없지만, db명과 table명은 Unix계열이라면 case-sensitive하다.
(이는 오브젝트명이 OS의 fs에 따라 저장되기 때문이다. 서버의 lower_case_table_names 변수를
1로 설정하면 오브젝트명은 모두 소문자로 저장되므로 유닉스-윈도간 호환성을 높일 수 있다.
지원되지 않는 부분:
Stored Procedure(5.0이상부터 지원된다고 함)
View(5.0이상부터 지원된다고 함)
Trigger(5.0이상부터 지원된다고 함)
subquery(4.1이상부터 지원된다고 함)
union, union all(4.0이상부터 지원됨)
[테이블 type에 따른 인덱스 특성]
Index Characteristic ISAM MyISAM HEAP BDB InnoDB
NULL values allowed No Yes As of 4.0.2 Yes Yes
Columns per index 16 16 16 16 16
Indexes per table 16 32 32 31 32
Maximum index row size (bytes) 256 500 500 500/1024 500/1024
Index column prefixes allowed Yes Yes Yes Yes No
BLOB/TEXT indexes allowed No Yes(255 bytes max) No Yes (255 bytes max) No
인덱스 생성
- alter table을 이용한 인덱스 생성이 더 flexible함
- 인덱스명은 생략가능
ALTER TABLE 테이블명 ADD INDEX 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD UNIQUE 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD PRIMARY KEY (인덱스컬럼);
ALTER TABLE 테이블명 ADD FULLTEXT (인덱스컬럼);
CREATE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE FULLTEXT INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
unique인덱스와 primary key인덱스와의 차이
unique은 null허용하지만, primary key는 null허용 안함
unique은 하나의 테이블에 여러개 올 수 있지만, primary key는 하나만 존재
테이블생성시 지정
CREATE TABLE 테이블명
(
... column declarations ...
INDEX 인덱스명 (인덱스컬럼),
UNIQUE 인덱스명 (인덱스컬럼),
PRIMARY KEY (인덱스컬럼),
FULLTEXT 인덱스명 (인덱스컬럼),
...
);
index prefix 생성
- 컬럼의 전체길이중 일부만 인덱스로 사용
- supported for ISAM, MyISAM, HEAP, and BDB tables, but not for InnoDB tables
- 지정되는 길이는 byte단위가 아닌 charater단위이므로, multi-byte character일 경우 주의
- blob, text 컬럼타입일 경우, index prefix 가 유용(255 길이까지 가능)
CREATE TABLE 테이블명
(
name CHAR(30) NOT NULL,
address CHAR(60) NOT NULL,
INDEX (name(10),address(10))
);
인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
ALTER TABLE 테이블명 DROP PRIMARY KEY;
outer join
[MySQL]
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT OUTER JOIN t2 ON t1.i1 = t2.i2;
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2;
[Oracle]
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+);
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2;
SELECT
student.name, student.student_id,
event.date, event.event_id, event.type
FROM
student, event
LEFT JOIN score ON student.student_id = score.student_id
AND event.event_id = score.event_id
WHERE
score.score IS NULL
ORDER BY
student.student_id, event.event_id;
:= 문장을 이용한 변수의 설정
현재 dbakorea의 데이터베이스강좌게시판에 등록된 총 게시물은 43개이다. 43개의 강좌를 읽은 수(hit수)는 각각 다르다.
평균 hit수를 구해 보자.
mysql> select @total_hit := sum(hit), @total_record := count(*) from zetyx_board_database;
+------------------------+---------------------------+
| @total_hit := sum(hit) | @total_record := count(*) |
+------------------------+---------------------------+
| 3705 | 43 |
+------------------------+---------------------------+
1 row in set (0.00 sec)
mysql> select @total_hit/@total_record as 평균HIT;
+-----------------+
| 평균HIT |
+-----------------+
| 86.162790697674 |
+-----------------+
1 row in set (0.00 sec)
select substring(subject from 9) from zetyx_board_database where substring(subject, 1, 8) = '[ORACLE]';
보통 상용DBMS들이 row-level locking을 지원한다. 쉽게 말해 레코드단위로 락킹한다는 말이다.
반면, MySQL의 MyISAM 테이블타입은 table-level locking을 사용한다.
쉽게 말하면, insert, update, delete작업은 전체 테이블에 락을 걸고 처리된다는 것이다.
row-level락보다 비효율적이지만,.. MySQL은 빠르기 때문에 이 단점이 상쇄된다.
Compressed MyISAM(packed MyISAM)
정적인 테이블데이터는 압축하여 20-60%정도의 공간을 절약할 수 있다.
Production데이터를 CD로 받아서 차후 디스크에 풀지 않고 CD자체로 바로 사용할 수도 있다.
gzip등으로 백업받으면 이를 푸는 과정이 필요할 것이다.
% myisampack dbakorea.myi
데이터베이스 게시판의 Merge Table에 좀 더 자세한 내용을 적어 두었다.
RAID Table
1개의 테이블은 OS상에 3개의 파일로 구성된다.
스키마파일(.frm), data파일(.myd), index파일(.myi)
MySQL의 RAID테이블은 데이터파일(.myd)을 여러개의 파일들로 구성하는 것이다.
create table raid_test (...)
type=myisam raid_type=striped raid_chunks=4 raid_chunsize=8
테이블을 4개의 데이터파일로 나누고, 8kb단위로(8kb stripe) 라운드로빈 방식으로 write가 이루어진다
태초에 나는 개그이야기를 만들었다.
내말을 믿고 나를 따르면 천당,
내말을 믿지않고 나를 따르지 않으면 지옥,
나는 하늘나라(우주)에 사느니라.
그럼 난 외계인?