Mysql을 설치하고 데몬을 실행하려고 하는데 다음과 같은 에러가 뜬다면 이렇게 해보세요~
# /usr/local/mysql/bin/mysqladmin --version
ERROR 2002: Can't connect to local MySQL server through
socket '/tmp/mysql.sock' (2)
Mysql을 설치하고 데몬을 실행하려고 하는데 다음과 같은 에러가 뜬다면 이렇게 해보세요~
# /usr/local/mysql/bin/mysqladmin --version
ERROR 2002: Can't connect to local MySQL server through
socket '/tmp/mysql.sock' (2)
Master-Slave Replication 환경에서 Master에만 있는 테이블을 변경한다던가, Slave에서 테이블을 DROP하는 작업을 하는 경우 Slave의 Replication이 중단된다.
이 경우 SHOW SLAVE STATUS\G 명령어를 수행하면
Slave_Sql_Running = No
라는 부분을 발견한다. 이런 경우 error를 유발한 쿼리를 skip 해줘야 한다.
SQL_SLAVE_SKIP_COUNTER : Slave를 작동한 후 Master로부터 읽어온 쿼리 중 skip할 쿼리 수
가. Master 서버 설정
1. Slave 서버에서 접근할 수 있도록 권한을 준다.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'ID'@'IP' IDENTIFIED BY 'PASSWORD';
ID : Master MySQL의 user id로 Slave의 MySQL에서 접근함
IP : Slave 서버의 IP
PASSWORD : Slave의 MySQL에서 쓰는 id의 password
2. Master 역할을 할 수 있는 권한 부여
server-id : 동기화 구성에 참여한 각각의 MySQL들을 구분짓기 위한 UNIQUE ID로서 중복되면 안된다.
binlog-do-db : 실제 동기화 하려는 대상 DB의 이름. DB마다 한 라인씩 추가하면 된다.
binlog-ignore-db : 동기화 하지 않을 DB의 이름. DB마다 한 라인씩 추가하면 된다.
log-bin : 아마도 mysql의 log file 이름.
나. Slave 서버 설정
1. Slave 역할을 할 수 있는 권한 부여
server-id : Master에서의 역할과 동일하게 UNIQUE ID
master-host : Master 서버의 IP
master-user : Master 서버의 MySQL에 생성했던 Replication 계정 ID
master-password : Replication 계정 ID의 비밀번호
master-port : Master 서버의 MySQL 원격 접속 포트번호 (기본: 3306)
log-bin : Master에서의 역할과 동일하게 아마도 log file 이름
다. 동기화 작동
1. Master 서버 재시작 후 MySQL에 접속
2. Master 서버 동작 확인
3. Slave 서버 재시작 후 MySQL에 접속
4. Slave 서버 동작 확인
Read_Master_Log_Pos : MASTER STATUS의 Position과 동일하다.
Slave_IO_State, Slave_IO_Running, Slave_SQL_Running 의 상태가 위와 같다면 정상
이미지출처 : kangcom.com
MySQL에서 인덱스를 타는지 체크하는 방법은 EXPLAIN을 사용하는 것이다.
phpMyAdmin에 접속을 하고, SQL 탭으로 이동한다.
EXPLAIN SELECT * FROM `member` WHERE `id` = 1;
다음과 같이 쿼리문 앞에 EXPLAIN을 붙여주면 된다.
다음 그림은 쿼리문에서 Primary Key로 인덱스를 탄 경우이다.
(possible_keys, key를 눈여겨 봐야 한다.)
다음 그림은 쿼리문에서 Primary Key와 Foreign Key로 인덱스를 탄 경우이다.
(possible_keys, key를 눈여겨 봐야 한다.)
보통 php에서 쿼리문을 작성할때는 이렇게 한다.
$query = "SELECT * FROM users WHERE id = $id";
이번에는 sprintf로 쿼리문을 작성해보면
$query = sprintf("SELECT * FROM users WHERE id = %d", $id);
이렇게 할 수 있다.
php에서 sprintf를 이용해서 쿼리문을 작성하는 경우,
쿼리와 변수를 분리시킬 수 있고, 더 깔끔한 코드가 작성된다.
$query = sprintf("SELECT * FROM users
WHERE user='%s'
AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
위와 같은 쿼리문은 왜 sprintf를 이용해야 하는지에 대한 좋은 예이다.