레이블이 MySQL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MySQL인 게시물을 표시합니다. 모든 게시물 표시

2010. 12. 1.

[CentOS] 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)  


# chown -R root /usr/local/mysql
# chown -R mysql /usr/local/mysql/var
# chgrp -R /usr/local/mysql/


# /usr/local/mysql/bin/mysqld_safe --user=mysql&
 
...
... mysql ended   <- 데몬 실행이 안된겁니다.
...

2010. 10. 11.

[MySQL] lower_case_table_names 세팅하기

유닉스계열은 0, 윈도우 계열은 1, Mac OS 의 경우는 2(이건 확실치 않음)가 기본 값이라고 한다.

유닉스 계열에서 값을 변경하고 싶다면 다음과 같이 하면 된다.

# /etc/init.d/mysqld stop
# mysqld_safe --lower_case_table_names = 1 &


확인하기

mysql> show variables like '%lower%';

2010. 10. 8.

[CentOS] mysqli 설치

CentOS 64bit, php-5.2.5에서 mysqli를 설치해봤다.
apm 설치할때 보니까 mysqli가 빠져있길래 추가로 설치를 해봤다.
예전에는 애좀 먹었는데 간만에 하니까 술술 잘되는구나

# cd /usr/local/src/apm/php-5.2.5/ext/mysqli
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-mysqli=/usr/local/mysql/bin/mysql_config
# make

# mkdir -p /usr/lib64/extension/no-debug-non-zts-20060613
# cp modules/*.* /usr/lib64/extension/no-debug-non-zts-20060613/
# vi /usr/local/apache/conf/php.ini

extension_dir = "/usr/lib64/extensions/no-debug-non-zts-20060613/"
.
.
.
extension=mysqli.so

# /etc/init.d/http restart


2010. 10. 3.

[MySQL]skip-name-resolve

MySQL 서버는 외부로 부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속시에 불필요한 부하가 발생하게 됩니다. skip-name-resolve를 설정하시고 접속시에 IP 기반으로 접속을 하게 되면 hostname lookup 과정을 생략하게 되어 좀 더 빠르게 접속을 하실 수 있습니다.

# vi /etc/my.cnf

[mysqld]
skip-external-locking
skip-host-cache
skip-locking
skip-name-resolve

이렇게 추가를 해주고 mysqld를 restart를 하면 된다.

[MySQL]Too Many Connection Error

show variables like '%timeout%';
show variables like '%connect%';
show variables like '%thread%';

show status like '%thread%';
show status like '%connect%';

======================================================================

show status like 'Threads_created';
show status like 'Connections';
Cache Miss Rate(%) =  Threads_created / Connections * 100

show status like 'Aborted_connects';
show status like 'Connections';
Connection Miss Rate(%) = Aborted_connects / Connections * 100

show status like 'Threads_connected';
show variables like 'max_connections';
Connection Usage(%) = Threads_connected / max_connections * 100

show status like 'Max_used_connections';

==========================================================================

Connection Usage가 100%면 max_connections 수를 증가시켜야 한다.
Connection Miss Rate 가 1%이상이면 wait_timeout을 더 길게 설정해야한다.
Cache Miss Rate가 높다면 thread_cache_size를 더 높게 잡아야 한다.

Max_used_connections 에서는 그 동안 사용되었던 최대 커넥션 수를 보여준다.

나의 경우는 Cache Miss Rate가 100%에 가깝게 나왔다.
그건 thread_cache_size가 0이기 때문에 매번 쓰레드를 생성해서이다.
일반적으로 Peak-time의 threads_connected보다 약간 낮은 수치로 설정하는 것이 좋습니다.

SET GLOBAL thread_cache_size = 40;

이렇게 값을 세팅해주었고, Cache Miss Rate 가 줄어들길 기다려야겠다.


2010. 9. 19.

mysql 접속자 수 늘리기

netstat으로 살펴보니 mysql 의 time_wait 가 너무 많아 보였다.

그래서 1차적으로 mysql의 동접자 수를 늘려주기로 했다.

우선 현재 동접자 수를 확인해보자.

# mysqladmin -u root -p패스워드 variables | grep max_connection


1-1. /etc/my.cnf 를 통해 늘려주기

[mysqld]
set-variable=max_connections=200   ---> 다음 한 줄을 추가한다.

1-2. mysqld_safe 로 늘려주기

# mysqld stop
# mysqld_safe -O max_connection=200 &

위의 두가지 방법중 1가지로 동접자 수를 늘려보자.

2010. 8. 29.

[MySQL] Slave_Sql_Running = No

Master-Slave Replication 환경에서 Master에만 있는 테이블을 변경한다던가, Slave에서 테이블을 DROP하는 작업을 하는 경우 Slave의 Replication이 중단된다.

 

이 경우 SHOW SLAVE STATUS\G 명령어를 수행하면

 

Slave_Sql_Running = No

 

라는 부분을 발견한다. 이런 경우 error를 유발한 쿼리를 skip 해줘야 한다.

 

mysql> SLAVE STOP;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> SLAVE START;


SQL_SLAVE_SKIP_COUNTER : Slave를 작동한 후 Master로부터 읽어온 쿼리 중 skip할 쿼리 수

 

 

[MySQL] Master-Slave Replication

가. 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 역할을 할 수 있는 권한 부여

 

# vi /etc/my.cnf

[mysqld]
server-id = 1
binlog-do-db = 'DB_NAME'
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
log-bin = mysql-bin


server-id : 동기화 구성에 참여한 각각의 MySQL들을 구분짓기 위한 UNIQUE ID로서 중복되면 안된다.

binlog-do-db : 실제 동기화 하려는 대상 DB의 이름. DB마다 한 라인씩 추가하면 된다.

binlog-ignore-db : 동기화 하지 않을 DB의 이름. DB마다 한 라인씩 추가하면 된다.

log-bin : 아마도 mysql의 log file 이름.

 

나. Slave 서버 설정

 

1. Slave 역할을 할 수 있는 권한 부여

 

# vi /etc/my.cnf

[mysqld]
server-id = 2
master-host = 'Master IP'
master-user = 'ID'
master-password = 'PASSWORD'
master-port = 3306
log-bin = mysql-bin

 

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 서버 동작 확인

 

mysql> SHOW MASTER STATUS\G
********************** 1. row **********************
                   File : mysql-bin.000003
             Position : 98
     Binlog_Do_DB : test
Binlog_Ignore_DB : mysql, information_schema
1 row in set (0.00 sec)
mysql>

 

3. Slave 서버 재시작 후 MySQL에 접속

 

4. Slave 서버 동작 확인

 

 

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
********************** 1. row **********************
           Slave_IO_State : Waiting for master to send event (정상)
              Master_Host : IP
              Master_User : ID
               Master_Port : 3306
        Connection_Retry : 60
         Master_Log_File : mysql-bin.000003
Read_Master_Log_Pos : 98
.
.
       Slave_IO_Running : Yes (정상)
    Slave_SQL_Running : Yes (정상)
.
.
1 row in set (0.00 sec)
mysql>

 

Read_Master_Log_Pos : MASTER STATUS의 Position과 동일하다.

 

Slave_IO_State, Slave_IO_Running, Slave_SQL_Running 의 상태가 위와 같다면 정상

 

 

 

2010. 8. 26.

[CentOS] No curses/termcap library found MySql

# ./configure --prefix=/usr/local/mysql-5.0.37 --with-charset=utf8 --with-collation=utf8_general_ci
.
.
.
@#$@#$%#$%#$%     No curses/termcap library found MySql

mysql을 설치하는 중에 ./configure 명령어 후에 다음과 같은 에러를 내면서 make를 할 수 없는 상황이 왔을 때 해결법을 찾았다.

# yum install libtermcap-devel

이후엔 설치가 잘 될꺼다!

2010. 8. 15.

[MySQL] index 추가, 삭제, 확인하기

1. 테이블의 인덱스 확인하기

SHOW INDEX FROM tablename;

2-1. 테이블의 인덱스 추가하기 : 컬럼은 1개도 가능, 2개 이상도 가능
ALTER TABLE tablename ADD INDEX indexname (column1, column2);

2-2. 테이블의 유니크 인덱스 추가하기 : 컬럼은 1개도 가능, 2개 이상도 가능
ALTER TABLE tablename ADD UNIQUE INDEX indexname (column1, column2);

3. 테이블의 인덱스 삭제하기
ALTER TABLE tablename DROP INDEX indexname;

2010. 5. 8.

성공적인 웹 프로그래밍 PHP와 MySQL


지식발전소!!! [강컴]

이미지출처 : kangcom.com

PHP로 프로그래밍을 하면서 거의 레퍼런스에만 의존해서 프로젝트를 진행했었다. 이 책을 읽음으로써 미쳐 짚고 넘어가지 못했던 부분을 알게 되었고, 다시금 초심으로 돌아갈 수 있었다.

그동안 몇권의 책을 접해봤고 대부분 소스코드가 몇페이지나 연속으로 난무하는 보기 싫은 경우가 많았는데 다행히도 이 책은 그렇지 않았다. 물론 후반부에 어느정도 나오긴 하지만 그 정도는 괜찮다.

레퍼런스에만 의존해서 프로그래밍을 했던 사람들에게는 초심으로 돌아갈 수 있는 이 책이 괜찮다고 생각한다.

2010. 3. 11.

mysql password 변경

1. 프로세스 확인
     # ps -ef | grep mysqld
2. 실행중인 mysql 종료     
     # killall mysqld
3. grant-table 미사용모드로 mysql 시작 (mysql 데몬 실행)
     # cd /usr/local/mysql/bin
     # ./mysqld_safe  --skip-grant-tables &
4. mysql 접속
     # ./mysql -u  root  mysql
5. password 갱신
     # update user set password=password('123') where user = 'root';




2009. 12. 10.

MySQL에서 인덱스 체크하기 : EXPLAIN

MySQL에서 인덱스를 타는지 체크하는 방법은 EXPLAIN을 사용하는 것이다.

 

phpMyAdmin에 접속을 하고, SQL 탭으로 이동한다.

 

EXPLAIN SELECT * FROM `member` WHERE `id` = 1;

 

다음과 같이 쿼리문 앞에 EXPLAIN을 붙여주면 된다.

 

 

다음 그림은 쿼리문에서 Primary Key로 인덱스를 탄 경우이다.

(possible_keys, key를 눈여겨 봐야 한다.)

 

 

 

 

다음 그림은 쿼리문에서 Primary Key와 Foreign Key로 인덱스를 탄 경우이다.

(possible_keys, key를 눈여겨 봐야 한다.)

2009. 12. 9.

php에서 sprintf로 쿼리문 작성하기.

보통 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를 이용해야 하는지에 대한 좋은 예이다.


2009. 12. 5.

세로를 가로로

mysql 세로를 가로로 변경하기.

====================================

SELECT coloum FROM table

바나나

====================================

SELECT group_concat(colomn SEPARATOR '구분자')
FROM table;

배,감,바나나

- 09년 11월 4일 16시 18분 -