centos 7.0하에서 mysqldump로 DB를 백업받고자 다음과 같이 하면


# mysqldump -u사용자id -p DB명 > 백업할_파일명

ex) # mysqldump -uuserid -p testDB > mybackup.sql

과 같이하면 아래와 같은 에러가 발생하는 경우가 있다.


mysqldump: unknown variable 'symbolic-links=0'


해법은 /etc 디렉토리 아래에 있는 my.cnf 파일을 vi로 열어서


symbolic-links=0


를 주석처리하면 된다.


그런 다음 mysqld를 restart해 줘야 한다.


# service mysqld restart


혹 위의 작업을 했는데 mysqldump 명령시 다음과 같은 에러가 발생한다면


mysqldump: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'


역시 my.cnf 파일에서 아래를 주석처리하면 된다.


sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES


그런데 이상의 항목을 주석처리하고 db를 dump 후에는 원상복귀하는 것이 보안상 좋을것이다.




MySQL 테이블에 데이터를 insert하다보면 어떤 데이터는 insert가 실패하는 경우가 있다.

이때 exception을 발생하는 것도 아니고 mysqli_query()의 반환 값을 false로 반환하는 정도 선에서 끝난다.

그래서 80개의 레코드를 가진 테이블을 읽어 와서 새로운 테이블에 insert 작업을 하는데 

78개만 insert가 된다거나와 같은 상황이 발생하는 것이다.

이유와 원인은 홑따옴표(') 처리에서의 문제다.

게시판의 경우 제목이나 내용에 홑따옴표(')가 포함되는 경우가 있다.

이 경우 insert는 보기 좋게 실패한다.


예를들어 $result에 select한 결과 셋이 있다고 할때


while($data = mysqli_fetch_array($result))

{

... 전략 ...

$title = $data['title'];

$con = $data['content'];

... 후략...

  $qry = "insert into my_table (...생략... title, content ...생략...) values (...생략... '$title', '$con' ...생략... )";

  mysqli_query($qry, $connect);

}


이 경우 title 내용이나 content에 홑 따옴표가 있다면 해당 레코드가 insert가 되지 않는다.

해법은 title과 content에 addslashes()함수를 사용한다. 그렇게 되면 홑따옴표에 \를 추가해서 MySQL에 insert를 하게 되고 정상적으로 입력이 된다.

다음과 같이...
$title = addslashes($data['title']);
$con = addslashes($data['content']);




MySQL limit 기능에 대해서


게시판을 만들때 주로 사용하는 기능인데 DB에 있는 데이터를 모두 조회해서 가져오지 않고 

원하는 갯수만큼의 데이터만 조회해서 가져 오기 위한 기능이 DBMS마다 마련되어 있다.

MySQL을 예로 든다면 limit이라는 키워드를 쿼리문에 사용하여 이 기능을 이용할수 있다.


MySQL의 limit은 2개의 매개변수를 가지는데 

첫 번째는 「시작 위치」,  

두 번째는 「가져올 게시물 수」 이다. 


여기서 「시작 위치」라는 것은 그룹으로 묶었을 때 각 그룹들의 첫 번째 게시물(데이터)의 번호를 의미한다.

예를 들어 10,000개의 데이터를 5개씩 가져온다고 할때(「가져올 게시물 수」가 5이라는 뜻)

전체 데이터를 5개씩 묶었을 때 묶여진 각 그룹들의 첫 번째 게시물(데이터)의 일련 번호를 「시작 위치」라고 한다는 뜻이다.

예를 들어 5개씩 묶으면

0~4

5~9

10~14

15~19

...


이때 「시작 위치」는 0, 5, 10, 15...가 될 것이다.

이때 각 그룹들에 일련 번호를 붙일 때 1번부터가 아니라 0번부터 일련 번호가 붙여 진다는 점을 주의해야 한다.


select * from bbs1 where id='bbs1' order by number desc limit (5 - 1) * 10, 15

⇒ 40번째 이후부터 15개의 게시물을 가져오라는 뜻


만일 limit의 매개변수를 1개만 사용하면 해당 매개변수의 갯수만큼 게시물을 가져오라는 뜻이다.


select * from bbs1 where id='bbs1' order by number desc limit 10

⇒ 이건 limit 0, 10와 동일한 뜻이다.


아래와 같이 변수 형태로도 당근 사용이 가능하다.

$page는 시작 위치이고 $view_total은 가여올 게시물의 수이다.

 

$query = "select * from bbs1 where id='bbs1' order by no desc limit $page, $view_total";





◈ mysql에 접속하기

d:\>mysql -uroot -papmset

 ==> 여기서 root는 id, apmset은 비밀번호

 ==> mysql -u계정id, -p계정비밀번호


◈ mysql이 관리하는 데이타베이스들 목록 보기

mysql>show databases;


◈ 원하는 데이터베이스 선택/사용하기

mysql>use phpmyadmin;

 ==> 여기서 phpmyadmin은 DB 이름


◈ 선택된 데이타베이스(현재 사용하는 데이타베이스)의 테이블 목록 보기

mysql>show tables;


◈ 새로운 데이터베이스 생성

mysql>create database 데이터베이스명;


◈ 데이터베이스 삭제

mysql>drop database 데이터베이스명;

mysql>drop database meditab;


◈ 특정 테이블 구조 보기

mysql>desc 테이블명;

 ==> 이 명령 전에 먼저 데이터베이스를 사용하는 "mysql>use 데이터베이스명;"이 선행되어야한다.


◈ mysql 데이타베이스의 user 테이블에 있는 사용자 계정 정보 보기

mysql>select host, user, password from user;

 ==> user라는 테이블로부터 host, user, password라는 필드의 내용을 보여줌

 ==> user 테이블의 필드들 정보를 보려면 "desc 테이블명;"을 통해서 보면 host, user, password....등의 필드 이름들을 볼 수 있다.


◈ mysql 이라는 데이타베이스의 user 테이블에 새로운 사용자 계정 정보 등록하기

mysql>insert into 테이블명 (필드1, 필드2, 필드3) values (필드1_값, 필드2_값, 필드3_값);

ex) mysql> insert into user (host, user, password) values ('localhost', 'uljavajoe', password('kog'));

 ==> host에는 MySQL이 있는 서버의 URL 주소가 입력된다.

 ==> 여기서 비밀번호를 셋팅할 때는 반드시 password('kog')와 같은 식으로 해야지 되지 그냥 ('localhost', 'uljavajoe', 'kog')와 같이 하면 나중에

이 계정과 이 비밀번호를 mysql에 접속할 때 다음과 같은 에러 발생한다.


ERROR 1045 (28000): Access denied for user 'uljavajoe'@'localhost' (using password: YES)


◈ 레코드 수정 명령
update 레코드명 set 필드명='필드값' where 조건식
 mysql>update info set age=35 where name='홍길동';


◈ 특정 레코드 삭제 명령
delete from 레코드명 where 조건식;
mysql>delete from info where name='홍길동';

-. 전체 레코드 삭제
mysql>delete from info;


◈ 데이터베이스 백업하기
c:\>mysqldump -uuljavajoe -pkog joe > joebackup


◈ 데이터베이스 백업
c:\>mysqldump -u계정id -p계정비밀번호 데이터베이스이름 > 백업할이름.확장자
c:\>mysqldump -uuljavajoe -pkog joe > joe_backup.sql
===> 백업되는 joe_backup.sql이라는 이름으로 저장되는 내용은 SQL 명령 형태로 데이터가 저장된다. 데이터베이스 내용 자체가 저장되는 것은 아니다.
이렇게 SQL 명령 형태로 저장된 내용을 이용해서 나중에 백업 데이터베이스를 복원(?)(생성) 하는 식이다.


◈ 데이터베이스 복원
c:\>mysql -u계정id -p계정비밀번호 복원될_데이터베이스이름 < 백업한파일이름.확장자
c:\>mysql -ujsisx -pkog joe2 < joe_backup.sql
===> 이때 여기서 다른 계정인 jsisx와 kog가 준비되어 있어야 하고 복원될 데이터베이스인 joe2도 미리 준비가 되어 있어야만 한다.


◈ php에서 MySql에 접속하는 함수
mysql_connect(데이터베이스_접속주소, 계정id, 계정비번)
resource mysql_connect(string hostname [:port], string username, string password)
 -. hostname : 서버의 호스트명 또는 '호스트명:포트번호'
 -. username : 사용자 계정 id
 -. pssword : 사용자 계정 비번

⇒ 기능 : php와 MySql을 연결한다. d:\>mysql -uuljavaje -pkog와 같은 기능

⇒ 반환값
 -. 성공 : 식별자 번호(resource) --> 이 값은 0 보다 큰 임의 수인데 시스템 내부적으로 사용하는 값.
 -. 실패 : false(실제 값은 0이다. C언어에서 나온 php이므로 C언어에서 false는 0이다)

⇒ 용례
  $mConnect = mysql_connect("localhost", "uljavajoe", "kog");

◈ 테이블에 있는 특정 필드 삭제
mysql>alter table 테이블명 drop 삭제할필드명;
msyql>alter table info drop age;


◈ 필드이름 수정명령
mysql>alter table 테이블명 change 이전필드명 바꿀필드명 바꿀필드타입;
mysql>alter table info change addr address varchar(80);


◈ 필드 타입 수정명령
mysql>alter table 테이블명 modify 필드명 필드타입;
mysql>alter table info modify addr char(70);


◈ 테이블명 수정 명령
mysql>alter table 테이블명 rename 새테이블명;
mysql>alter table info rename person;


◈ 테이블 삭제 명령
mysql>drop table 테이블명;
mysql>drop table info;


◈ sql 쿼리 문 일괄 실행
c:\>mysql -u사용자계정 -p비밀번호 데이터베이스명 < 일괄처리명령문파일명.확장자
c:\>mysql -ujsisx -p1234 joe < info.txt


◈ 레코드 삽입 명령
mysql>insert into 레코드명 (필드명1, 필드명2, 필듬여3,...) values('필드값1', '필드값2', '필드값3'...);
insert into info (num, name, age, addr) values (1, '홍길동', 23, '대구시 북구 산격로 7');


◈ 검색명령
 -. 이름이 김씨 성을 가진 모든 사람
 mysql>select * from info where name like '김%';

 -. 나이가 20대인 사람 모두
 mysql>select * from info where age>=20 and age<30;

 -. 이름 가운데 글자에 '수'자가 있는 사람 모두
 mysql>select * from info where name like '__수%';
  ===> 여기서 _는 임의의 글자 한 자, %는 임의의 여러 글자. 그런데 한글은 2바이트 이므로 _를 2개로 표현

 -. 나이를 기준으로 오름차순 검색
 mysql>select * from info order by age;

 -. 이름을 기준으로 내림차순 검색(이름이 한글인 경우는 sort가 잘 안되는데 이때는 MySQL 설치시 한글이 제대로 되도록 해당 파라미터를 옵션으로 설정해야됨)
 mysql>select * from info order by name desc;
 혹은 binary() 함수를 이용하면 한글도 정상적으로 sort가 된다.
 mysql>select * from order by binary(name);


+ Recent posts