설치 마리아디비 버전은 stable최신버전 10.0.22


1. 소스 다운로드(생략)

2. 압축해제(생략)

3. cmake

#cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mariadb/data \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATEDX_STORAGE_ENGINE=1 \
-DWITH_ARIA_STORAGE_ENGINE=1 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \

4. 사용자 추가

#useradd mysql

5. 폴더 권한 변경

#chown -R mysql.mysql /usr/local/mariadb/

6. 기본 DB 생성

#/usr/local/mariadb/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data

7. 기존에 생성된 my.cnf 백업 및 기존에 제공되는 걸로 변경

#mv /etc/my.cnf /etc/my.cnf.bak

#cp /usr/local/mariadb/support-files/my-innodb-heavy-4G.cnf /etc/my.cnf

[7-1] 로그 파일, pid파일 경로 변경시 추가작업

/etc/my.cnf 파일에

log-error=/path/to/logpath/mariadb.log

pid-file=/path/to/pidpath/mariadb.pid

추가.


해당 경로에 디렉토리는 자동으로 생성되지 않으므로 직접 생성해줘야함.

또 디렉토리 생성 후 소유자와 그룹을 mysql로 변경해줘야 파일이 생성됨.


해당 부분 없을시 로그파일과 pid파일은 /usr/local/mariadb/data에 저장된다.


8. my.cnf 파일에 문자열 설정값 추가


character_set_server = utf8

collation_server = utf8_general_ci


9. 마리아디비 구동


#/usr/local/mariadb/support-files/mysql.server start


10. 루트계정 비밀번호 변경


#/usr/local/mariadb/bin/mysqladmin -u root password 'new-password'


-- 트러블슈팅


ERR1) cmake 중

-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)

CMake Error at cmake/readline.cmake:85 (MESSAGE):

  Curses library not found.  Please install appropriate package,


SOLVE) ncurses-devel 설치

yum install ncurses-devel


--


ERR2) cmake 중

-- Looking for event.h - not found

-- Configuring incomplete, errors occurred!


SOLVE) openssl-devel 설치

yum install openssl-devel 


이걸 깔면서 의존성걸린 패키지에서 해결되는듯

--

출처: http://lsfa.tistory.com/15 [주제음슴]

MySQL 의 기본 스토리지 엔진이 무엇인지 확인하고자 할 때 아래 Query 를 실행 할 것

SQL>SELECT engine, support FROM information_schema.engines WHERE support='DEFAULT';

예시)

mysql> SELECT engine, support FROM information_schema.engines WHERE support='DEFAULT';
+--------+---------+
| engine   | support  |
+--------+---------+
| InnoDB  | DEFAULT |
+--------+---------+
1 row in set (0.03 sec)


mysql-5.5.x 에서 character-set 변경시
아래와 같이 my.cnf를 수정 후 mysql 데몬을 재시작 합니다.

 

파일 위치 : /etc/my.cnf

utf-8 에서 euckr 로 변경하는 예)

 

[client]
default-character-set=euckr
 
[mysql-5.5.x 에서 character-set 변경 ]

 

[mysqld]
init_connect=set names euckr
character-set-server=euckr

 

[mysql]
default-character-set=euckr

 

 

mysql 데몬을 stop/start 해줍니다.

예)

# /usr/local/mysql/support-files/mysql.server stop

# /usr/local/mysql/support-files/mysql.server start


MySQL 서버는 자동으로 MyISAM 테이블을 체크하고 repair 하도록 지시할 수 있다. 자동으로 repair 하도록 하면, 서버는 가장 최근에 문제없이 closed 된 테이블인지 보기 위해 그것을 열 때, 각각의 MyISAM 테이블을 체크한다. 테이블이 정상이 아니라면 서버는 테이블을 repair 한다.

자동으로 MyISAM 테이블을 유지보수 하도록 하기 위해서 서버를 --MyISAM-recover 옵션으로 시작해야한다. 이 옵션은 아래에 나와 있는 값을 한 개나 그 이상의 개수로 지정할 수 있으며 콤마로 분리된다.

my.cnf의 [mysqld]항목에 옵션추가

myisam-recover=[mode]

[mode]
DEFAULT = 디폴트 체크를 한다.
BACKUP = 변경된 테이블의 백업을 만들도록 한다.
FORCE =  데이터의 하나 이상의 행을 손실시킨다 하더라도 테이블 복구를 수행하도록 한다.
QUICK = 빠른 복구를 수행한다. DELETE나 UPDATE로 인한 hole을 가지고 있지 않은 테이블은 skip 된다.

ex) myisam-recover=force,backup or myisam-recover=FORCE,BACKUP

<Mysql table 이 손상되는 경우가 발생할 때, 상태 확인 및 복구하는 방법>

1) MySQL 데이터베이스 특정 table 이 손상 되었는지 여부를 확인
#use database이름 : 확인할 DB 선택
#check table table이름 : table 상태 확인 또는 analyze table table이름

2) MySQL Table 복구
#use database이름 : 확인할 DB 선택
#repair table table이름 : table 복구

3) MySQL Table 최적화
#use database이름 : 확인할 DB 선택
#optimize table table이름 : table 최적화



기본적으로 localhost 에서만 접속이 허용되는 DB 를 외부(PC 및 타 서버) 환경에서 접속하려고 할 때

기존의 db 유저의 host를 변경할 것이 아니라 아래의 쿼리문을 이용해 유저를 추가해주면 된다.

(host 부분의 %는 모든 호스트에서 접속 허용이며 이부분을 IP 주소로 입력하면 해당 IP 에서만 접속이 가능함.)

 

[추가]

1. insert into user (host,user,password) values ('%','user_name',password('user_password'));


[mysql 5.5 이상에서는 아래 쿼리를 실행할 것!!!]

insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string) values('%','user_name', password('user_password'),'','','','');


2. insert into db (host,db,user) values ('%','db_name','user_name');

3. flush privileges;
4. grant all privileges on user_name.* to user_name@'%';

 

(Root 계정의 경우 2번은 생략하고 1번 쿼리 이후 4번 쿼리 중 user_name.* 대신 *.* 로 처리할 것!)

 

5. flush privileges;

 

위 방법대로 했는데도 외부 접속이 안된다면 /etc/my.cnf 파일의 항목 중 bind-address = 127.0.0.1 이 있다면

 

이를 주석처리 한다. (bind-address = 127.0.0.1 는  로컬호스트에서만 접속을 허용한다는 의미임.)

 

bind-address = 127.0.0.1 를 주석처리해도 안된다면 방화벽에서의 mysql 포트 (기본:3306)이 차단되어있을 가능성이 있으므로

 

확인 해 볼것! 

 

[삭제]

아래는 위의 방법대로 외부 접속 호스트 추가 후 삭제하는 방법이다.

(user_name 과 host 부분을 and 조건으로 모두 만족해야 처리되니 주의할 것!!  // % 대신 ip를 입력해도 무방)

 

1. delete from user where user='user_name' and host='%';

(root 계정의 경우 1번만 실행하면 됨)
2. delete from db where user='user_name' and host='%';

flush privileges;


DB에 영향을 미치는 쿼리문을 찾아낼 수 있는 좋은 방법.

① mysql> show processlist;
show processlist -i5 여기서 숫자는 리프래쉬할 시간(초)입니다.
]# mysqladmin -uroot -p proc stat -i5 (밑에것 보다 조금더 상세)
]# mysqladmin -uroot -p processlist -i5

② mysql> show status;

기타)

]# top

팁!) ①의 경우 mysql에 접속을 한상태에서 내리는 명령어이지만 아래와 같이 접속하자 마자 바로 보여주는 예도 있다.
]# mysqladmin -uroot -p processlist

------------------------- sleep 죽이는 법 두가지 -------------------------
① mysql>kill id;
② mysqladmin kill id -u root -p

 

MySQL db 일반유저 (root 게정 변경가능) 패스워드 변경하고 싶을 때 방법이다.

# mysql -u root -p
Enter password : (패스워드를 입력하고 들어가서)

mysql>use mysql

mysql> update user set password=password('패스워드') where user='데이터베이스_id';

mysql> flush privileges;


테이블 내의 모든 내용을 삭제하므로 테이블 이름만 남음.
다른 방법으로 delete from tbl_name 과 같음

차이점은 

DELETE의 경우에는 일단 테이블의 내용을 하나의 레코드씩 삭제하는 반면, 

TRUNCATE TABLE은 먼저 테이블을 drop한 후에 테이블의 포맷 파일인 .frm 파일을 보고 테이블을 새로 만들게 된다.

그러므로 TRUNCATE와 DELETE는 동일한 결과를 보이지만 내부적으로 작동하는 방식이 다르다. 
TRUNCATE TABLE의 경우 레코드를 삭제할 필요 없이 테이블을 삭제하므로 레코드의 수가 많을 경우 매우 빠르게 삭제할 수 있다.

[형식]

truncate table tbl_name;

 

mysql.sock 라는 것은 Unix Domain Socket 입니다.
Unix Domain Socket 이라는 것은 TCP/IP와 같은 식으로 다룰 수 있는 통신 소켓입니다.
(소켓 프로그래밍에서도 socket을 생성할 때 TCP/IP와 인수만 다르게 주어서
생성시키죠. 그 뒤는 같은 방식으로 다룹니다.)
단 Unix Domain Socket은 다른 컴퓨터에 있는 프로세스와는 통신할 수 없고,
같은 컴퓨터에 있는 프로세스끼리 통신만 가능합니다. 일종의 IPC 죠.

왜 이런 게 필요하냐면,
Mysql 서버 프로그램(데몬이라고 하죠. mysqld)과 클라이언트 프로그램(mysql, 또는
php의 mysql 접속 루틴)은 서로 다른 프로세스입니다. 당연히 둘 사이에 통신이 이루어져야
어떤 일을 할 수 있는 거죠. 이 통신의 용도로 Unix Domain Socket을 쓰는 겁니다.

mysql은 TCP/IP 소켓과 Unix Domain Socket 둘 다 사용할 수 있습니다.
앞의 것은 mysql 서버와 클라이언트가 다른 컴퓨터에 있을 때 사용하며(이때 포트는 보통
3306이죠), 뒤의 것은 서버와 클라이언트가 같은 컴퓨터에 있을 때 사용합니다. 같은 컴퓨터에
있을 때에도 TCP/IP 소켓을 쓸 수도 있으나 Unix Domain Socket이 더 빠르죠.

TCP/IP 소켓이 아이피 주소와 포트를 이용해서 접속을 하듯이 Unix Domain Socket은
파일을 이용합니다. 질문에서 나왔던 mysql.sock 이라는 것이 바로 이 용도로 사용되는
파일입니다. 따라서 mysqld 를 실행시켰을 때는 mysql.sock 파일이 있지만, 중지시키면
저 파일은 사라집니다.

그래서 통신을 하기 위해서는 mysql.sock 라는 파일은 서버와 클라이언트 모두 접근
가능해야 합니다. mysql.sock 파일이 생성되는 위치에 서버가 파일을 쓰거나 읽을 수 없으면
서버는 에러를 발생시키고 중지되며, 클라이언트가 그 파일에 접근할 수 없으면 접속이
이루어지지 않습니다. mysql.sock 파일에 관한 문제는 이 접근 권한이 잘못되어서
발생하는 것이 대부분입니다.

rpm으로 설치하면 보통 mysql.sock 파일의 위치는 /var/lib/mysql/mysql.sock 입니다.
이것은 mysql 을 컴파일할 때 --with-unix-socket-path=.... 에서 설정할 수 있습니다.
이럿게 되면 mysqld, mysql, 그리고 libmysqlclient.a(so) 도 모두 이 설정을 이용해서
통신을 하게 됩니다. 이 도메인 소켓의 위치는 컴파일 후라도 명령행 인수를 이용해서
바꿔 줄 수 있습니다. 또는 /etc/my.cnf 파일에서 지정할 수도 있습니다.

unix domain socket 에 대해 더 자세히 알고 싶으시면
W. Richard Stevens, Unix Network Programming I 을 참조하시면 됩니다.