반응형
반응형

http://kakaodbe.blogspot.kr/2014/04/pt-online-schema-change-modified-pt.html



pt-online-schema-change_kakao.patch




Percona Toolkit에는 많은 훌륭한 도구들이 있지만, 그 중에서도 pt-online-schema-change는 아마도 대 부분의 사용자들이 경험해보았을 정도로 유용한 툴이다.
하지만 아무리 좋은 도구도 모든 사용자의 요건을 만족하기는 어려우며, pt-online-schema-change도 우리의 요건을 만족하기에 조금은 부족한 부분이 있었다.
우선 급하게 아래와 같이 필수적인 부분들 위주로, 조금 보완해서 pt-online-schema-change 도구를 개선해보았다. 


  1. 프라이머리 키 변경과 테이블 파티션을 동시에 수행하는 경우
  2. 이미 존재하는 이름의 컬럼의 기본(Default) 값을 변경하면서, 해당 컬럼의 값을 모두 새로운 기본값으로 채우기
  3. pt-online-schema-change 도구가 서비스에 미치는 영향을 최소화하기 위해서 청크(Chunk)간 대기(Sleep) 시간 넣기

위의 기능들을 위해서 pt-online-schema-change 툴에 아래와 같이 4개의 파티미터가 추가되었다.

  • --prompt-before-copy
    "--ask-pass"와 같이 별도의 파라미터 값을 필요로 하지 않으며, 이 파라미터가 정의되면 pt-online-schema-change 스크립트가 복사용으로 사용할 테이블을 생성하고 사용자의 확인을 기다리게 된다. 만약 새로운 테이블에 데이터가 복사되기 전에, 새로운 테이블의 구조를 확인한다거나 추가로 변경해야 할 사항이 있다면 이 옵션을 사용하면 된다. 대표적으로 파티션을 생성하는 작업을 위해서 프라이머리 키의 구조를 변경해야 할 때도 있다. 하지만 하나의 ALTER 구문으로는 프라이머리 키를 변경하는 작업과 파티셔닝을 수행하는 작업을 동시에 처리할 수 없다. pt-online-schema-change도구에서도 이 제약은 동일하게 적용된다. 이럴 때에는 --prompt-before-copy 옵션을 활성화하고, pt-online-schema-change가 실행을 잠깐 멈추었을 때 추가로 스키마 변경 작업을 해줄 수 있다.
  • --skip-copy-columns
    pt-online-schema-change 도구가 서비스중인 테이블에서 새로운 테이블로 레코드를 복사할 때, 구조 변경 전의 테이블과 구조 변경후의 테이블에서 공통되는 이름의 컬럼은 자동으로 값을 복사하게 된다. 하지만 때로는 이름이 동일한 컬럼이라 하더라도, 기존 테이블의 컬럼 값을 새로운 테이블로 가져오지 말아야 할 때도 있다. 이런 경우에는 --skip-copy-columns 옵션에 무시할 컬럼들을 ","로 구분해서 나열하면 된다.
  • --sleep-time-us
    pt-online-schema-change는 기본적으로 MySQL 서버의 시스템 부하 정도를 판단해서 스키마 변경 작업(레코드 복사)의 처리 속도를 조절할 수 있도록 제공하고 있다. 하지만 아주 가벼운 형태의 쿼리가 빈번하게 처리되는 MySQL 서버에서는 이 규칙은 별로 도움이 되지 않는다. 그래서 --sleep-time-us 옵션을 이용하면 pt-onine-schema-change 툴이 청크(chunk) 단위로 복사를 수행하고 나서 일정 시간동인 대기(Sleep)하도록 해서, 서비스용 쿼리들이 거의 지연되지 않고 처리될 수 있도록 할 수 있다. --sleep-time-us 는 마이크로 단위(1/1,000,000)의 초를 파라미터로 받기 때문에, 실제 pt-online-schema-change를 이용하는 경우에는 --sleep-time-us는 1000(1밀리 초) ~ 50000(50 밀리 초) 정도의 값이 적절해 보인다.
  • --print-sql
    pt-onine-schema-change 툴은 내부적으로 기존의 테이블은 변경하지 않고, 변경하고자 하는 내용을 포함하는 새로운 테이블을 생성하고 트리거를 이용해서 기존 테이블의 레코드를 새로운 테이블로 복사하는 형태로 처리된다. 이때 pt-onine-schema-change가 생성하는 트리거나 신규 테이블의 구조가 궁금할 때도 있다. 이런 경우에는 --print-sql 옵션을 명시해주면, 생성되는 트리거와 신규 테이블의 구조를 화면에 출력한다. 물론 오리지널 버전의 pt-online-schema-change에도 디버깅 모드로 실행해서 모든 내용을 출력하도록 할 수 있다. 하지만 이는 너무 많은 불필요한 내용들이 출력되므로, 꼭 필요한 내용만 간략히 확인하고자 할 때에는 --print-sql 옵션이 더 도움이 될 것이다.

개선된 pt-online-schema-change에서 위의 옵션들이 명시되면, 아래와 같이 명시된 옵션이 추가로 표기되므로 재확인할 수 있다.
-- Additional parameters ----------------------------------
  >> skip columns : Not specified
  >> sleep time (us) : 50000
  >> prompting user operation : Yes
-----------------------------------------------------------

추가된 기능들을 간단히 살펴보았으니, 이제 위의 1~3번 케이스에 대해서 추가된 기능들을 어떻게 사용할 수 있는지 예제로 살펴보자.



1) 프라이머리 키 변경과 테이블 파티션을 동시에 수행하는 경우

CREATE TABLE test.test_partition (
  id INT AUTO_INCREMENT,
  fd1 VARCHAR(10),
  fd2 DATETIME,
  PRIMARY KEY(id)
) ENGINE=InnoDB;

ALTER TABLE test.test_partition DROP PRIMARY KEY, ADD PRIMARY KEY(id, fd2);
ALTER TABLE test.test_partition PARTITION ...

위의 2개 ALTER 문장은 하나로 묶어서 실행할 수 없으며, pt-online-schema-change 도구를 사용하는 경우에도 마찬가지이다.
그래서 이런 경우에는 아래와 같이 (두개의 ALTER 중에서) 프라이머리 키 변경만 pt-online-schema-change 도구 옵션으로 명시하고, pt-online-schema-change를 --prompt-before-copy 옵션과 함께 실행하는 것이다.

/usr/bin/pt-online-schema-change --alter "DROP PRIMARY KEY, ADD PRIMARY KEY(id, fd2)" D=test,t=test_partition \
--no-drop-old-table \
--no-drop-new-table \
--chunk-size=500 \
--chunk-size-limit=600 \
--defaults-file=/etc/my.cnf \
--host=127.0.0.1 \
--port=3306 \
--user=root \
--ask-pass \
--progress=time,30 \
--max-load="Threads_running=100" \
--critical-load="Threads_running=1000" \
--chunk-index=PRIMARY \
--charset=UTF8MB4 \
--no-check-alter \
--sleep-time-us=50000 \
--prompt-before-copy \
--print-sql \
--execute

--prompt-before-copy 옵션이 명시되었기 때문에, pt-online-schema-change는 새로운 테이블을 생성하고 사용자가 별도의 사인을 줄때까지 기다리게 된다.
...
-- Additional parameters ----------------------------------
  >> skip columns : Not specified
  >> sleep time (us) : 50000
  >> prompting user operation : Yes
-----------------------------------------------------------
...
-- Create Triggers ---------------------------------------
CREATE TRIGGER `pt_osc_test_test_partition_ins` AFTER INSERT ON `test`.`test_partition` FOR EACH ROW REPLACE INTO `test`.`_test_partition_new` ...
CREATE TRIGGER `pt_osc_test_test_partition_upd` AFTER UPDATE ON `test`.`test_partition` FOR EACH ROW REPLACE INTO `test`.`_test_partition_new` ...
CREATE TRIGGER `pt_osc_test_test_partition_del` AFTER DELETE ON `test`.`test_partition` FOR EACH ROW DELETE IGNORE FROM `test`.`_test_partition_new` WHERE `test`.`_test_partition_new`.`id` <=> OLD.`id`;
----------------------------------------------------------

Table copy operation is paused temporarily by user request '--prompt-before-copy'.
pt-online-schema-change utility created new table, but not triggers.
   ==> new table name : `test`.`_test_partition_new`

So if you have any custom operation on new table, do it now.
Type 'yes', when you ready to go.
Should I continue to copy [Yes] ? : <== pt-online-schema-change는 새로운 임시 테이블 _test_partition_new를 생성한 상태에서 처리를 멈추고, 사용자의 입력을 기다리게 된다.


이때 다른 터미널을 이용해서 MySQL 서버에 로그인하여 새로운 테이블(_test_partition_new)을 ALTER TABLE PARTITION 명령으로 파티션을 생성하고, pt-online-schema-change 터미널에서 "Yes"를 입력하면
프라이머리 키도 변경되고 파티션도 추가된 테이블로 데이터를 복사하게 된다. 이 이후 과정은 오리지널 버전의 pt-online-schema-change와 동일하게 작동하게 된다. 

ALTER TABLE _test_partition_new
PARTITION BY RANGE COLUMNS(CRT_DT)
(
 ...
 PARTITION PF_20140420 VALUES LESS THAN ('2014-04-21 00:00:00') ENGINE = InnoDB,
 PARTITION PF_20140421 VALUES LESS THAN ('2014-04-22 00:00:00') ENGINE = InnoDB,
 PARTITION PF_20140422 VALUES LESS THAN ('2014-04-23 00:00:00') ENGINE = InnoDB,
 PARTITION PF_20140423 VALUES LESS THAN ('2014-04-24 00:00:00') ENGINE = InnoDB
);

참고로, 이렇게 프라이머리 키가 변경되는 경우에는 pt-online-schema-change는 그냥 경고 메시지와 함께 멈춰버리게 되는데, 이 때에는 --no-check-alter 옵션으로 강제 진행되도록 해야 할 필요가 있다. 물론 --no-check-alter 옵션을 사용하는 경우에는 새로 복사되는 테이블의 데이터가 문제없이 복사된다는 것을 사용자 입장에서 검증해야 할 것이다.



2) 이미 존재하는 이름의 컬럼의 기본(Default) 값을 변경하면서, 해당 컬럼의 값을 모두 새로운 기본값으로 채우기

아래와 같은 테이블에서 fd1 컬럼의 기본 값을 'Y'에서 'N'으로 변경하고자 한다. 그런데 이때 pt-online-schema-change로 스키마가 변경된 이후 test_defaultvalue 테이블의 fd1 컬럼은 모두 'N' (새로운 기본값)으로 업데이트되어야 한다고 가정해보자. (물론 당연히 test_defaultvalue 테이블의 fd1 컬럼은 'Y'와 'N'이 혼재되어서 저장되어 있는 상황)

CREATE TABLE test.test_defaultvalue (
  id INT AUTO_INCREMENT,
  fd1 CHAR(1) DEFAULT 'Y',
  fd2 DATETIME,
  PRIMARY KEY(id)
) ENGINE=InnoDB;

ALTER TABLE test.test_defaultvalue MODIFY fd1 CHAR(1) DEFAULT 'N';
UPDATE test.test_defaultvalue SET fd2='N' WHERE fd2='Y';

이때 pt-onine-schema-change 툴을 아래와 같이 실행하면, 새로 생성되는 테이블의 fd1 컬럼의 기본 값은 'N'으로 바뀌겠지만 실제 컬럼의 저장된 값은 이전 테이블의 fd1 컬럼의 값을 그대로 복사해서 가져오게 된다.

/usr/bin/pt-online-schema-change --alter "MODIFY fd1 CHAR(1) DEFAULT 'N'" D=test,t=test_defaultvalue \
--no-drop-old-table \
--no-drop-new-table \
--chunk-size=500 \
--chunk-size-limit=600 \
--defaults-file=/etc/my.cnf \
--host=127.0.0.1 \
--port=3306 \
--user=root \
--ask-pass \
--progress=time,30 \
--max-load="Threads_running=100" \
--critical-load="Threads_running=1000" \
--chunk-index=PRIMARY \
--charset=UTF8MB4 \
--execute

그래서 오리지널 버전의 pt-online-schema-change 도구를 사용하면, fd1 컬럼의 값을 새로운 기본 값인 'N'으로 채울수가 없다. 그래서 결국 아래오 같이 UPDATE 문장으로 전체 업데이트를 해야 할 것이다. 물론 이런 류의 UPDATE 문장은 인덱스를 이용하지 못해서 테이블의 모든 레코드에 대해서 배타적 잠금을 걸 가능성이 높아서 실제 스키미 변경 만큼이나 영향도가 큰 작업이 되어버리게 된다.

이런 경우에는 개선된 pt-online-schema-change 툴의 --skip-copy-columns 옵션을 이용해서 기존 테이블에서 신규 테이블로 복사할 컬럼에서 일부를 배제시키는 것이 가능하다.
아래와 같이 pt-online-schema-change 를 실행하면, fd1 컬럼의 값을 기존 테이블에서 새로운 테이블로 복사를 하진 않지만 fd1 컬럼의 기본 값이 'N'이기 때문에 fd1 컬럼의 모든 값을 'N'으로 초기화까지 할 수 있게 된다.

/usr/bin/pt-online-schema-change --alter "MODIFY fd1 CHAR(1) DEFAULT 'N'" D=test,t=test_defaultvalue \
--no-drop-old-table \
--no-drop-new-table \
--chunk-size=500 \
--chunk-size-limit=600 \
--defaults-file=/etc/my.cnf \
--host=127.0.0.1 \
--port=3306 \
--user=root \
--ask-pass \
--progress=time,30 \
--max-load="Threads_running=100" \
--critical-load="Threads_running=1000" \
--chunk-index=PRIMARY \
--charset=UTF8MB4 \
--sleep-time-us=50000 \
--skip-copy-columns='fd1' \
--prompt-before-copy \
--print-sql \
--execute

이때 --prompt-before-copy 옵션과 --print-sql 옵션을 사용하면, --skip-copy-columns에 의해서 적용된 트리거와 INSERT .. SELECT .. 복사 SQL 문의 내용을 확인하고 문제가 없으면 작업을 진행하도록 할 수 있다.



3) pt-online-schema-change 도구가 서비스에 미치는 영향을 최소화하기 위해서 청크(Chunk)간 대기(Sleep) 시간 넣기

pt-online-schema-change 도구 자체적으로 부하를 조절하면서 복사하는 기능을 가지고 있다는 것은 잘 알고 있을 것이다. 하지만 이미 간단히 언급했듯이, MySQL 서버가 디스크를 읽지 않고 PK나 인덱스 기반으로 1~2건 레코드를 메모리만 읽어서 (아주 빠르게) 서비스하는 경우에는 경우에는 오리지널 버전의 pt-online-schema-change가 가지고 있는 부하 제어 기능은 부족할 수도 있다.
이런 경우에는 개선된 pt-online-schema-change의 --sleep-time-us 옵션으로 하나의 청크(chunk)가 완료되면 일정 시간동안 pt-online-schema-change의 복사 작업이 잠깐 Sleep하도록 할 수 있다.
--sleep-time-us 옵션에는 숫자 값으로 마이크로 단위의 초를 입력해주면 된다. 즉 "--chunk-size=500 --sleep-time-us=5000" 옵션이 사용되면 500개의 레코드를 복사하고 5 밀리초를 Sleep하게 되는 것이다.

물론 이렇게 매 청크마다 일정 시간동안 Sleep을 수행하면 스키마 변경 시간이 더 길어지게 되는 문제점이 있다. 하지만 pt-online-schema-change 도구 자체의 특성상 다른 트랜잭션의 처리를 잠금 차원에서 방해하거나 리두 로그나 언두 레코드를 대량으로 발생시키는 작업이 아니므로, pt-online-schema-change 자체의 완료 시간이 길어진다 하더라도 데이터의 정합성을 훼손하지는 않으므로 크게 걱정하지 않아도 된다. 또한 pt-online-schema-change를 이용해서 온라인 스키마 변경을 한다 하더라도 사용량이 적은 시간대를 골라서 수행하므로, 소요 시간이 더 걸린다고 해서 크게 문제되지는 않을 것이다. 물론 테이블의 전체 레코드 건수를 기반으로 Sleep할 시간을 결정해야 할 필요가 있지만, 여전히 그만큼의 가치는 있는 작업이 될 것이다.
오리지널 버전의 pt-online-schema-change에서는 --max-load 옵션이 최적으로 설정되지 않으면, 쉬지 않고 레코드를 새로운 테이블로 복사하게 될 수도 있다. 하지만 이는 InnoDB의 Checkpoint age를 급증시켜서 InnoDB 서버를 Sync나 Async 모드로 전환시켜버릴 수도 있다. 하지만 --sleep-time-us 옵션을 적절히 설정해준다면, 천천히 데이터를 복사하므로 Checkpoint age가 급증하는 현상을 막을 수도 있다. 

많은 프로그램들이 초단위나 밀리 초 단위의 값을 입력받기 때문에, 가끔 --sleep-time-us에 입력되는 값을 밀리초로 착각하고 사용할 수도 있으므로 주의할 필요가 있다. --sleep-time-us 옵션을 사용하는 방법은 위의 예제를 참조하도록 하자.



설치 및 패치



  1. Download percona toolkit percona-toolkit-2.2.7-1.noarch.rpm from http://www.percona.com/downloads/percona-toolkit/LATEST/RPM/
  2. Install percona toolkit 2.2.7-1
    $ rpm -Uvh percona-toolkit-2.2.7-1.noarch.rpm
  3. Patch modified code to original pt-online-schema-change
    $ patch /usr/bin/pt-online-schema-change < pt-online-schema-change_kakao.patch

첨부된 패치 파일은 Percona toolkit 2.2.7-1 버전을 기준으로 생성되었습니다.




추가 AWS RDS에서 사용시

SET GLOBAL log_bin_trust_function_creators = 1;
수정.. SUPER 권한을 요구하므로 cmd로는 안됨. Parameter Groups 들어가서 새로운 parameter group 만든 후 변경해서 적용해야 함.

pt-online-schema-change --execute --ask-pass --user=root --alter "ADD COLUMN c1 INT" D=데이터베이스,t=테이블,h=host넣고,P=포트넣고


반응형
반응형

http://cafe.naver.com/mysqlpg



Consistency.txt


pt-table-checksum.txt



MySQL은 MasterDB / SlaveDB 간

최고의 유연성을 보장한다는 장점이 있는 반면,  이 때문에 다소의 정합성이 깨질 수 있다는 단점을 가지고 있습니다.

이에 정합성이 맞는지 수시로 확인을 해야하는데요, 이와 관련된 내용이 있어 공유드립니다.

 

출처 : Oracle Press - Effective MySQL Backup and Recovery (p.68~)

 


=========================================================
Data Consistency : pt-data-checksum
=========================================================

[각 노드에서 percona-toolkit 설치]

sudo su -

yum install -y percona-toolkit

 

[MasterDB]

sudo su - mysql

 

cd /usr1/mysql/dba/tools

 

pt-table-checksum --host localhost --user root --ask-pass --replicate=zzdba.pt_checksum --databases=globaldb,gamedb,logdb --create-replicate-table --no-check-binlog-format --nocheck-replication-filters

 

------------------------------------------------------------------------------------------------------------
Waiting for the --replicate table to replicate to slavedb-s...
Waiting for the --replicate table to replicate to slavedb-s...
Waiting for the --replicate table to replicate to slavedb-s...

 

Checksumming globaldb.achievements:  55% 00:24 remain

            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
02-07T18:24:06      0      0  1032199      26       0  37.582 globaldb.achievements
02-07T18:24:06      0      0      670       1       0   0.022 globaldb.achievementsdata
02-07T18:24:20      0      0  1032184      25       0  13.456 globaldb.achievementsreward
02-07T18:24:20      0      0        1       1       0   0.261 globaldb.boss
02-07T18:24:20      0      0       15       1       0   0.009 globaldb.bossattack
02-07T18:24:26      0      0  1582272      10       0   6.235 globaldb.chattingdfield
02-07T18:24:32      0      0  1539837      10       0   6.172 globaldb.chattingnotify
...
# ------------------------------------------------------------------------------------------------------------
# --ask-pass                        : 암호를 입력받을 수 있게 (ask password)
# --replicate=zzdba.pt_checksum     : 체크섬 데이터를 저장할 테이블명
# --create-replicate-table          : 체크섬 테이블이 없다면 만들어서
# --databases=globaldb,gamedb,logdb : 체크할 데이터베이스명
# --no-check-binlog-format          : binlog-format='STATEMENT' 가 아니면 에러가 나는데, 이를 무시하라 (우리는 MIXED 이기 때문에 사용해야함)
# --nocheck-replication-filters     : 복제되지않는 DB들 체크하지 않아도 됨
# ------------------------------------------------------------------------------------------------------------
# Waiting for the --replicate table to replicate to ld-db-s... 
#   : Slave DB 에 체크섬 테이블(zzdba.pt_checksum) 이 만들어지지 않으면 위의 오류 발생
#     만일 2~3번까지도 waiting 된다면 slave node 에 replication 에 문제가 없는지 확인 필요 (slavedb : show slave status\G)
# ------------------------------------------------------------------------------------------------------------


[SlaveDB]

sudo su - mysql

cd /usr1/mysql/dba/tools

 

mysql -u root -p

 

SELECT db, tbl, chunk
     , IF(this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc), 'YES', 'NO') AS diff
     , this_cnt-master_cnt AS rowcount_diff
  FROM zzdba.pt_checksum
 WHERE master_cnt <> this_cnt
    OR master_crc <> this_crc
    OR ISNULL(master_crc ) <> ISNULL(this_crc);

 

+-----------+-------------------+-------+------+---------------+
| db        | tbl               | chunk | diff | rowcount_diff |
+-----------+-------------------+-------+------+---------------+
| globaldb  | log_ranking_cache |     1 | YES  |            -1 |
+-----------+-------------------+-------+------+---------------+

 


=========================================================
Object Consistency : md5(), length(), diff -u
=========================================================

sudo su - mysql

mysql -u root -p

 

use zzdba;

 

create view dba_checksum_proc
as
select routine_schema,routine_name, routine_type

     , length (routine_definition) as size, md5(routine_definition) as checksum
  from information_schema.routines
 where ROUTINE_SCHEMA not in ('bmt_schema2a','common_schema','ps_helper','test','mysql','information_schema')
 order by routine_schema,routine_name, routine_type;

 

cd /usr1/mysql/dba/monitor

 

mysql -uroot -p -h master_host -e "set sql_log_bin=0; select * from zzdba.dba_checksum_proc" > zztmp_object_master.log

 

mysql -uroot -p -h slave_host  -e "set sql_log_bin=0; select * from zzdba.dba_checksum_proc" > zztmp_object_slave.log

 

diff -u zztmp_object_master.log zztmp_object_slave.log

 


=========================================================
Schema Consistency : mysqldump, diff -u
=========================================================

The layman's approach to detecting schema differences is to use the mysqldump utility

and to generate the schema only and compare.

 

cd /usr1/mysql/dba/monitor

 

mysqldump --all-databases --no-data --skip-dump-date -uroot -p -h ld-db-m   | sed -e "s/AUTO_INCREMENT=[^\ ] //" > zztmp_schema_master.log

 

mysqldump --all-databases --no-data --skip-dump-date -uroot -p -h localhost | sed -e "s/AUTO_INCREMENT=[^\ ] //" > zztmp_schema_slave.log

 

diff -u zztmp_schema_master.log zztmp_schema_slave.log

 

This process is not ideal as there is no guarantee the output is ordered, and the format does differ between MySQL versions; however,this process can be used to confirm that no schema differences exist.  ^^;

 


=======================================================================
참고. pt-table-checksum 소스버젼으로 실행하면서 에러 발생시!
=======================================================================

erroe : 02-07T08:43:57 Cannot read response; is Term::ReadKey installed?
        Can't locate Term/ReadKey.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl
        /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./pt-table-checksum line 2629.
=======================================================================

yum install perl-CPAN yaml

cpan YAML

perl -MCPAN -e shell

install Term::ReadKey

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Convert Unixtime to Date Shell 공유 (ex.slowquery 분석)  (0) 2014.09.12
pt-online-schema-change 개선  (0) 2014.09.12
monitoring system  (0) 2014.09.12
monitoring script  (0) 2014.09.12
monitoring  (0) 2014.09.12
반응형


zzdba_objects_v1.1_20140125.sql


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

pt-online-schema-change 개선  (0) 2014.09.12
MasterDB / SlaveDB 간 Consistency 확인하기 (pt-table-checksum, md5, diff)  (0) 2014.09.12
monitoring script  (0) 2014.09.12
monitoring  (0) 2014.09.12
[Monitoring] nmon for linux 소개  (0) 2014.09.11
반응형

monitoring script 짤 때 사용하면 될 듯.


env.ini 파일 내용


export MySQL_VER=5.6.12

export MySQL_BASE=/usr1/mysql

export MySQL_HOME=$MySQL_BASE/$MySQL_VER/bin


export MySQL_SID=vm21

export MySQL_PORT=10614

export MySQL_SOCKET=/tmp/mysql_sandbox10614.sock


export _DBDBA_UID=msandbox

export _DBDBA_PWD='msandbox'

export _DBBACKUP_UID=msandbox

export _DBBACKUP_PWD='msandbox'

export _DBMON_UID=msandbox

export _DBMON_PWD='msandbox'




mon_script.sh 파일 내용

#!/bin/bash

cd /usr1/mysql/dba/
. .env.ini

clear

echo "######################################"
echo "###         Script List            ###"
echo "######################################"
echo ""
echo "  1.Transaction"
echo "  2.Blocking trans"
echo " 11.Process (All)"
echo " 12.Process (Long Time : 5 sec)"
echo ""
while :
do
   echo ""
   echo "Select > "

   read ScriptNo
   case $ScriptNo in
      1)
         SQLSTR=" select trx_id, trx_state, trx_started, trx_requested_lock_id, trx_mysql_thread_id"
         SQLSTR+="     , substr(trx_query,1, 50) as tsql, trx_operation_state, trx_tables_locked "
         SQLSTR+="  from information_schema.innodb_trx;"
         break ;;
      2)
         SQLSTR=" select il.*"
         SQLSTR+="  from information_schema.innodb_locks       il"
         SQLSTR+="  join information_schema.innodb_lock_waits  ilw"
         SQLSTR+="    on (il.lock_trx_id = ilw.blocking_trx_id);"
         break ;;
      11)
         SQLSTR=" select *"
         SQLSTR+="  from information_schema.processlist"
         SQLSTR+=" order by time desc limit 50;"
         break ;;
      12)
         SQLSTR=" select *"
         SQLSTR+="  from information_schema.processlist"
         SQLSTR+="  where time > 5 order by time desc limit 50;"
         break ;;
       *)      ;;
   esac
done


while (true)
do
   clear
   echo "##################################"
   date "+%Y/%m/%d %H:%m:%S"
   echo "##################################"

   mysql -u ${_DBMON_UID} --password=$_DBMON_PWD --port=${MySQL_PORT} --socket=${MySQL_SOCKET} -t -e "$SQLSTR"
   sleep 1
done

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MasterDB / SlaveDB 간 Consistency 확인하기 (pt-table-checksum, md5, diff)  (0) 2014.09.12
monitoring system  (0) 2014.09.12
monitoring  (0) 2014.09.12
[Monitoring] nmon for linux 소개  (0) 2014.09.11
Monitoring Script qps (query / sec)  (0) 2014.09.11
반응형


.env.ini


chk_all.sh


chk_lock.sh


chk_process.sh


chk_qps.sh


chk_session.sh


chk_slowquery_cnt.sh



파일 권한은 chmod +x *.sh



파일 업로드 후 bin/sbinM^ 뭐..이딴 에러나면

vi 파일명

:set ff=unix

:wq



전체 파일


mysql command monitoring script v1.1.txt


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

monitoring system  (0) 2014.09.12
monitoring script  (0) 2014.09.12
[Monitoring] nmon for linux 소개  (0) 2014.09.11
Monitoring Script qps (query / sec)  (0) 2014.09.11
바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
반응형

/* CentOS 설치

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

nmon Install

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


sudo su -


mkdir -p /usr1/program


cd /usr1/program


wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz


tar xvfp nmon_linux_14i.tar.gz


ls -l /usr/bin/nmon


chmod +x nmon*


ls -l 


mv nmon_x86_64_centos6 /usr/bin/nmon


ls -l /usr/bin/nmon


nmon


rm -rf nmon*

*/





http://cafe.naver.com/mysqlpg.cafe?iframe_url=/ArticleList.nhn%3Fsearch.clubid=26608564%26search.menuid=28%26search.boardtype=L




extreme linux performance monitoring part ii (io tuning).pdf


nmon_analyser_34a.zip


nmon_linux_14i.tar.gz


nmon_linux_14i_ubuntu134




MySQL, Oracle 가 설치된 Linux 환경에서 OS 성능분석툴로 유용한 nmon 공유드립니다.

IBM 에서 OS 관련 문제해결시 사용하는 툴로 원래 AIX 용으로 개발되었지만,

최근에는 Linux 버전도 제공하고 있으며, 수집된 Log  nmon analyzer 를 통해 엑셀로 이쁘게 출력도 됩니다.

 

그래서 저희는, nmon을 default로 설치하여 모니터링 하고 있답니다. ㅎㅎ

 

사용법 : nmon 실행 후, c 클릭 (CPU), m 클릭 (Memory), n 클릭 (Network), d 클릭 (Disk)

 

[nmon wiki]

http://nmon.sourceforge.net/pmwiki.php

http://nmon.sourceforge.net/pmwiki.php?n=Site.Download

 

[nmon tool 다운로드]

: http://www.ibm.com/developerworks/wikis/display/WikiPtype/nmon
: 
압축풀고 /usr/bin 으로 nmon 파일을 복사해서 사용하면 됨.

 

 

 

1. 일정 기간 nmon 데이터 수집하기
 1) nmon 
파일명 : 호스트명_년월일_시분.nmon
 2) nmon -f -s 10 -c 100  : 10
초 간격(-s 옵션)으로 100번 수집 (-c 옵션)
 3) nmon -f -s 60 -c 1440 : 1
분 간격으로 24시간 수집 (배치로 등록하여 수행중임)
 (실행하면 몇 초 후 프롬프트로 떨어지는데, 중지된 것이 아니라, Back 단에서 실행되고 있음.)

 

2. 수집된 nmon 파일 sort 
 1) sort hostname_090317_1931.nmon > hostname_090317_1931.csv

 

3. nmon analyzer 엑셀파일 실행

 1) nmon_analyzer.xls 파일을 오픈한다. ("매크로 포함" 클릭)
 2) "
인증"오류가 발생하면 매크로 보안 수준을 낮추면 된다. 그리고 재시작.
 3) 
가운데 Analyse nmon data 버튼을 클릭하여 수집된 *.nmon 또는 *.csv 파일을 연다.


 ※ Download : https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+Systems/page/nmon_analyser

 

4. nmon analyzer WebUI

 1) nmon data 를 분석기를 통해 그래프로 분석해 주는 웹 Tool 입니다.

 2) http://www.aixservice.co.kr/nmon2rrd/index.php


 2-1) https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power%20Systems/page/nmon_analyser

 

 

 

 



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

monitoring script  (0) 2014.09.12
monitoring  (0) 2014.09.12
Monitoring Script qps (query / sec)  (0) 2014.09.11
바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
mysql INSERT ON DUPLICATE KEY UPDATE  (0) 2014.08.29
반응형

http://cafe.naver.com/mysqlpg.cafe?iframe_url=/ArticleList.nhn%3Fsearch.clubid=26608564%26search.menuid=28%26search.boardtype=L




env.ini


mon_qps.sh.txt


mon_script.sh.txt



서비스 오픈초기 모니터링시 사용하는 "실시간 모니터링" 스크립트 공유해 봅니다.

 

mon_qps.sh


 

mon_script.sh

 

@ 유용한 Script 들 많이 공유되면 좋겠네요. ^^;

 



시간하고 같이 찍는 스크립트 입니다. 

mysqladmin ext -i1 -u root --password=$_PASSWD | gawk '
/Queries/{q=$4-qp;qp=$4}
/Questions/{qs=$4-qsp;qsp=$4}
/Slow_queries/{sq=$4-sqp;sqp=$4}
/Com_select/{cs=$4-csp;csp=$4}
/Com_insert/ && $2 !~ /Com_insert_select/{ci=$4-cip;cip=$4}
/Com_update/ && $2 !~ /Com_update_multi/{cu=$4-cup;cup=$4}
/Com_delete/ && $2 !~ /Com_delete_multi/{cd=$4-cdp;cdp=$4}
/Threads_connected/{tc=$4}
/Threads_running/{printf "Time: %20s Queries: %5d Questions: %5d Slow_queries: %5d Com_select: %5d Com_insert: %5d Com_update: %5d Com_delete: %5d Threads_connected: %5d Threads_running: %5d\n", strftime("%m-%d-%Y %H:%M:%S"),q,qs,sq,cs,ci,cu,cd,tc, $4}' > $LOG_DIR/thread_mon.log

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

monitoring  (0) 2014.09.12
[Monitoring] nmon for linux 소개  (0) 2014.09.11
바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
mysql INSERT ON DUPLICATE KEY UPDATE  (0) 2014.08.29
mysql> show status  (0) 2014.08.29
반응형

mysqlbinlog --database=sakila /gamevil/database/binlog/mysql-master-bin.000001 | grep -B 3 -i 'drop table sakila.payment'

# at 352

# 070919 16:11:23 server id 1 end_log_pos 429 Query thread_id=16 exec_time=0 error_code=0

SET TIMESTAMP=1190232683/*!*/;

DROP TABLE sakila.payment/*!*/;



server1# mysqlbinlog --database=sakila /gamevil/database/binlog/mysql-master.bin.000001 --stop-position=352 | mysql -uroot -p


server1# mysqlbinlog --database=sakila /gamevil/database/binlog/mysql-master.bin.000001 --start-position=429 | mysql -uroot -p

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

[Monitoring] nmon for linux 소개  (0) 2014.09.11
Monitoring Script qps (query / sec)  (0) 2014.09.11
mysql INSERT ON DUPLICATE KEY UPDATE  (0) 2014.08.29
mysql> show status  (0) 2014.08.29
설치 패키지  (0) 2014.08.29
반응형

출처 : http://www.s-arcana.co.jp/tech/2011/11/insert-on-duplicate-key-update.html


프라이머리 키, 유니크 키가 중복된 경우에 UPDATE를 하는 MySQL의 편리한 구문 INSERT ON DUPLICATE KEY UPDATE
그럼 사용법을 알아보자

테스트용 테이블 준비


먼저 테이블을 작성

1CREATE TABLE `duplicate` (
2  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3  `value` varchar(255) NOT NULL,
4  `update_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATECURRENT_TIMESTAMP,
5  PRIMARY KEY (`id`)
6) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

그리고 적당히 데이타를 insert한다.

1mysql> select * from duplicate;
2+----+-------+---------------------+
3| id | value | update_at           |
4+----+-------+---------------------+
5|  1 | hoge  | 0000-00-00 00:00:00 |
6|  2 | fuga  | 0000-00-00 00:00:00 |
7|  3 | piyo  | 0000-00-00 00:00:00 |
8+----+-------+---------------------+

한행씩 처리하는 경우는 문제가 없는데...


ON DUPLICATE KEY UPDATE를 사용, 한행씩 insert하는 경우라면 이런 식으로 UPDATE하고 싶은 컬럼이랑 값을 지정한다.

1INSERT INTO duplicate (id, value) VALUES (1, 'new-value') ON DUPLICATE KEYUPDATE value = 'new-value';

하지만 이것으로 복수행을 insert할경우에 어떻게 값을 설정해야 좋을지 고민하게 된다.

해결방법을 발견!


다큐멘트를 잘 보면 이렇게 적혀진것을 발견할수 있다.

1ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

실제로 사용해 보면 이렇다.

01INSERT INTO `duplicate` (id, value) VALUES (1,'new-hoge'), (2, 'new-fuga'),(3,'new-piyo') ON DUPLICATE KEY UPDATE value=VALUES(`value`);
02 
03mysql> select * from duplicate;
04+----+----------+---------------------+
05| id | value    | update_at           |
06+----+----------+---------------------+
07|  1 | new-hoge | 2011-11-08 05:21:25 |
08|  2 | new-fuga | 2011-11-08 05:21:25 |
09|  3 | new-piyo | 2011-11-08 05:21:25 |
10+----+----------+---------------------+

한번에 갱신이 되었다.

REPLACE INTO를 사용하면 동일하게 동작하지만 REPLACE INTO는 새롭게 insert를 해버리므로
ON UPDATE CURRENT_TIMESTAMP를 사용할수 없다.


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Monitoring Script qps (query / sec)  (0) 2014.09.11
바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
mysql> show status  (0) 2014.08.29
설치 패키지  (0) 2014.08.29
Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28
반응형
mysql>show status;


Aborted_clients
클라이언트가 비정상으로 종료한 접속 건수
Aborted_connects
접속을 시도했으나 실패한 건수
Bytes_received
모든 클라이언트로부터 받은 바이트 수
Bytes_sent
모든 클라이언트에게 보낸 바이트 수
Com_xxx
xxx 명령이 실행된 횟수
Connections
서버로 접속을 시도한 횟수
Created_tmp_disk_tables
디스크에 만들어진 임시 테이블 수
Created_tmp_tables
메모리에 만들어진 임시 테이블 수
Created_tmp_files
mysqld가 만든 임시 파일 수
Delayed_insert_threads
사용중인 delayed insert handler의 스레드 수
Delayed_writes
insert delayed로 기록된 row의 수
Delayed_errors
insert delayed로 기록할 때 에러가 발생한 row의 수
Flush_commands
Flush 명령이 실행된 횟수
Handler_commit
내부적으로 commit한 횟수
Handler_delete
row가 테이블에서 삭제된 횟수
Handler_read_first
첫 엔트리가 인덱스에서 읽혀진 횟수
즉, full index scan 횟수
Handler_read_key
key에 의해서 row가 읽히도록 요청받은 횟수
수치가 높으면 잘 인덱스 되었음을 의미
Handler_read_next
key order로 다음 row를 읽도록 요청받은 횟수
index scan, 제약된 범위로 index column을 질의하면 증가함
Handler_read_prev
key order로 앞 row를 읽도록 요청받은 횟수
즉, order by...desc를 사용한 횟수
Handler_read_rnd
지정한 위치로부터 row를 읽도록 요청 받은 횟수
즉, 소팅한 횟수
Handler_read_rnd_next
데이터 파일에서 다음 row를 읽도록 요청 받은 횟수
즉, 테이블 scan의 횟수로 테이블이 적절하게 인덱스 되어 있지 않음을 가리킴
Handler_rollback
내부적으로 rollback한 횟수
Handler_update
테이블에서 row의 갱신을 요청 받은 횟수
Handler_write
테이블에서 row에 insert를 요구한 횟수
Key_blocks_used
key cache에서 사용된 block의 수
Key_read_requests
cache로부터 key block을 읽도록 요청받은 횟수
Key_reads
디스크에서 key block를 실제로 읽은 횟수
Key_write_requests
cache에 key block을 기록하도록 요구한 횟수
Key_writes
디스크에 key block을 실제로 기록한 횟수
Max_used_connections
동시에 사용토록 허용된 최대 접속 수
Not_flushed_key_blocks
변경된 것이 디스크에 flush되지 않은 key cache의 key block 수
Not_flushed_delayed_rows
insert delay에 의해서 아직 기록되지 않고 기다리는 row의 수
Open_tables
open되어 있는 테이블의 수
Open_files
open되어 있는 파일의 수
Open_streams
open되어 있는 stream의 수(주로 logging에 사용)
Opened_tables
열어본 테이블의 수
Questions
서버에 질의를 보낸 횟수
Qcache_queries_in_cache
0
Qcache_inserts
0
Qcache_hits
0
Qcache_lowmem_prunes
0
Qcache_not_cached
0
Qcache_free_memory
0
Qcache_free_blocks
0
Qcache_total_blocks
0
Rpl_status
안전조치 복제 상태
Select_full_join
key 없이 join한 횟수(0이 아니면, 테이블의 인덱스를 검토요망)
Select_full_range_join
참조 테이블에서 range search로 join한 횟수
Select_range
첫 테이블에서 range를 사용하여 join한 횟수
Select_range_check
key 없이 join한 횟수(0이 아니면, 테이블의 인덱스를 검토요망)
Select_scan
첫 테이블중 full scan한 곳에서 join한 횟수
Slave_open_temp_tables
slave가 현재 열고 있는 임시 테이블 수
Slave_running
ON이면 master에 접속한 slave가 있음
Slow_launch_threads
create시 slow_launch_time보다 더 걸린 스레드의 수
Slow_queries
long_query_time보다 더 시간이 걸린 질의의 수
Sort_merge_passes
sort 알고리즘을 통과한 merge의 수
값이 크면 sort_buffer의 증가를 고려해야함
Sort_range
range 내에서 소팅한 수
Sort_rows
소팅한 row의 수
Sort_scan
테이블을 스캔닝하여 소팅한 수
ssl_xxx
SSL이 사용한 변수
Table_locks_immediate
테이블 lock이 직접 요구된 횟수
Table_locks_waited
테이블 lock이 기다려야 했던 횟수
수치가 크면, 퍼포먼스에 문제 있으므로 optimize요망
Threads_cached
thread cache에 있는 스레드의 수
Threads_created
접속을 유지하기 위해서 만들었던 스레드의 수
Threads_connected
현재 열려서 접속되어 있는 스레드 수
Threads_running
sleeping하지 않고 작동중인 스레드의 수
Uptime
서버의 작동 시간(초)


위 변수에서
 Opened_tables가 크면, 
    table_cache 변수는 작을 수 있다..
 Key_reads가 크면,  
    key_buffer_size는 작을 수 있다.
 Handler_read_rnd가 크면, 
    더 많은 쿼리를 한다.
 Thread_created가 크면,   
    thread_cache_size를 크게해야 될지도 모른다.
 Created_tmp_disk_tables가 크면, 
    tmp_table_size를 크게 해야 될지도 모른다.

[출처] mysql> show status|작성자 만박



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
mysql INSERT ON DUPLICATE KEY UPDATE  (0) 2014.08.29
설치 패키지  (0) 2014.08.29
Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28
mysql 자동 backup 2  (0) 2014.08.28
반응형

CentOS_mysql_xtrabackup_설치패키지

package_1.1.zip


Ubuntu_mysql_xtrabackup_설치패키지

package.zip


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql INSERT ON DUPLICATE KEY UPDATE  (0) 2014.08.29
mysql> show status  (0) 2014.08.29
Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28
mysql 자동 backup 2  (0) 2014.08.28
mysql 자동 backup  (0) 2014.08.28
반응형

http://mysql-mmm.org/mmm2:guide




Installation Guide

Note: this guide is a draft, feel free to make changes if you see anything that can be improved, expanded on or corrected This installation guide describes a installation of MMM 2 (without the MMMtools) based on Debian Lenny (5.0)

A basic installation contains at least 2 database servers and 1 monitoring server. In this guide, I used 5 servers with Debian Lenny (5.0)

functioniphostnameserver id
monitoring host192.168.0.10mon-
master 1192.168.0.11db11
master 2192.168.0.12db22
slave 1192.168.0.13db33
slave 2192.168.0.14db44

I used the following virtual IPs. They will be distributed across the hosts by MMM.

iproledescription
192.168.0.100writerYour application should connect to this IP for write queries.
192.168.0.101readerYour application should connect to one of these four IPs for read queries
192.168.0.102reader
192.168.0.103reader
192.168.0.104reader

Basic configuration of master 1

First we install MySQL on all hosts:

aptitude install mysql-server

Then we edit the configuration file /etc/mysql/my.cnf and add the following lines - be sure to use different server ids for all hosts:

server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log 
log_bin_index       = /var/log/mysql/mysql-bin.log.index 
relay_log           = /var/log/mysql/mysql-relay-bin 
relay_log_index     = /var/log/mysql/mysql-relay-bin.index 
expire_logs_days    = 10 
max_binlog_size     = 100M 
log_slave_updates   = 1

Then remove the following entry:

bind-address = 127.0.0.1

Set to number of masters:

auto_increment_increment = 2

Set to a unique, incremented number, less than auto_increment_increment, on each server

auto_increment_offset = 1

Do not bind of any specific IP, use 0.0.0.0 instead:

bind-address = 0.0.0.0

Afterwards we need to restart MySQL for our changes to take effect:

/etc/init.d/mysql restart

Create users

Now we can create the required users. We'll need 3 different users:

functiondescriptionprivileges
monitor userused by the mmm monitor to check the health of the MySQL serversREPLICATION CLIENT
agent userused by the mmm agent to change read-only mode, replication master, etc.SUPER, REPLICATION CLIENT, PROCESS
replication userused for replicationREPLICATION SLAVE
GRANT REPLICATION CLIENT                 ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%'   IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE                  ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication_password';

Note: We could be more restrictive here regarding the hosts from which the users are allowed to connect: mmm_monitor is used from 192.168.0.10. mmm_agent and replication are used from 192.168.0.11 - 192.168.0.14.

Note: Don't use a replication_password longer than 32 characters

Synchronisation of data between both databases

I'll assume that db1 contains the correct data. If you have an empty database, you still have to syncronize the accounts we have just created.

First make sure that no one is altering the data while we create a backup.

(db1) mysql> FLUSH TABLES WITH READ LOCK;

Then get the current position in the binary-log. We will need this values when we setup the replication on db2, db3 and db4.

(db1) mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+ 
| mysql-bin.000002 |      374 |              |                  | 
+------------------+----------+--------------+------------------+ 
1 row in set (0.00 sec) 

DON'T CLOSE this mysql-shell. If you close it, the database lock will be removed. Open a second console and type:

db1$ mysqldump -u root -p --all-databases > /tmp/database-backup.sql

Now we can remove the database-lock. Go to the first shell:

(db1) mysql> UNLOCK TABLES;

Copy the database backup to db2, db3 and db4.

db1$ scp /tmp/database-backup.sql <user>@192.168.0.12:/tmp
db1$ scp /tmp/database-backup.sql <user>@192.168.0.13:/tmp
db1$ scp /tmp/database-backup.sql <user>@192.168.0.14:/tmp

Then import this into db2, db3 and db4:

db2$ mysql -u root -p < /tmp/database-backup.sql
db3$ mysql -u root -p < /tmp/database-backup.sql
db4$ mysql -u root -p < /tmp/database-backup.sql

Then flush the privileges on db2, db3 and db4. We have altered the user-table and mysql has to reread this table.

(db2) mysql> FLUSH PRIVILEGES;
(db3) mysql> FLUSH PRIVILEGES;
(db4) mysql> FLUSH PRIVILEGES;

On debian and ubuntu, copy the passwords in /etc/mysql/debian.cnf from db1 to db2, db3 and db4. This password is used for starting and stopping mysql.

Both databases now contain the same data. We now can setup replication to keep it that way.

Note: Import just only add records from dump file. You should drop all databases before import dump file.

Setup replication

Configure replication on db2, db3 and db4 with the following commands:

(db2) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', 
              master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
(db3) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', 
              master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
(db4) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', 
              master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

Please insert the values return by “show master status” on db1 at the <file> and <position> tags.

Start the slave-process on all 3 hosts:

(db2) mysql> START SLAVE;
(db3) mysql> START SLAVE;
(db4) mysql> START SLAVE;

Now check if the replication is running correctly on all hosts:

(db2) mysql> SHOW SLAVE STATUS\G
*************************** 1. row *************************** 
             Slave_IO_State: Waiting for master to send event 
                Master_Host: 192.168.0.11
                Master_User: replication
                Master_Port: 3306 
              Connect_Retry: 60 
…
(db3) mysql> SHOW SLAVE STATUS\G
*************************** 1. row *************************** 
             Slave_IO_State: Waiting for master to send event 
                Master_Host: 192.168.0.11
                Master_User: replication
                Master_Port: 3306 
              Connect_Retry: 60 
…
(db4) mysql> SHOW SLAVE STATUS\G
*************************** 1. row *************************** 
             Slave_IO_State: Waiting for master to send event 
                Master_Host: 192.168.0.11
                Master_User: replication
                Master_Port: 3306 
              Connect_Retry: 60 
…

Now we have to make db1 replicate from db2. First we have to determine the values for master_log_file and master_log_pos:

(db2) mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+ 
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+------------------+----------+--------------+------------------+ 
| mysql-bin.000001 |       98 |              |                  |
+------------------+----------+--------------+------------------+ 
1 row in set (0.00 sec) 

Now we configure replication on db1 with the following command:

(db1) mysql> CHANGE MASTER TO master_host = '192.168.0.12', master_port=3306, master_user='replication',
              master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

Now insert the values return by “show master status” on db2 at the <file> and <position> tags.

Start the slave-process:

(db1) mysql> START SLAVE;

Now check if the replication is running correctly on db1:

(db1) mysql> SHOW SLAVE STATUS\G
*************************** 1. row *************************** 
             Slave_IO_State: Waiting for master to send event 
                Master_Host: 192.168.0.12
                Master_User: <replication>
                Master_Port: 3306 
              Connect_Retry: 60 
…

Replication between the nodes should now be complete. Try it by inserting some data into both db1 and db2 and check that the data will appear on all other nodes.

Install MMM

Create user

Optional: Create user that will be the owner of the MMM scripts and configuration files. This will provide an easier method to securely manage the monitor scripts.

useradd --comment "MMM Script owner" --shell /sbin/nologin mmmd

Monitoring host

First install dependencies:

aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl

Then fetch the latest mysql-mmm-common*.deb and mysql-mmm-monitor*.deb and install it:

dpkg -i mysql-mmm-common_*.deb mysql-mmm-monitor*.deb

Database hosts

On Ubuntu First install dependencies:

aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl iproute libnet-arp-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl

Then fetch the latest mysql-mmm-common*.deb and mysql-mmm-agent*.deb and install it:

dpkg -i mysql-mmm-common_*.deb mysql-mmm-agent_*.deb

On RedHat

yum install -y mysql-mmm-agent

This will take care of all the dependencies, which may include:

Installed:

mysql-mmm-agent.noarch 0:2.2.1-1.el5                                          

Dependency Installed:

libart_lgpl.x86_64 0:2.3.17-4                                                 
mysql-mmm.noarch 0:2.2.1-1.el5                                                
perl-Algorithm-Diff.noarch 0:1.1902-2.el5                                     
perl-DBD-mysql.x86_64 0:4.008-1.rf                                            
perl-DateManip.noarch 0:5.44-1.2.1                                            
perl-IPC-Shareable.noarch 0:0.60-3.el5                                        
perl-Log-Dispatch.noarch 0:2.20-1.el5                                         
perl-Log-Dispatch-FileRotate.noarch 0:1.16-1.el5                              
perl-Log-Log4perl.noarch 0:1.13-2.el5                                         
perl-MIME-Lite.noarch 0:3.01-5.el5                                            
perl-Mail-Sender.noarch 0:0.8.13-2.el5.1                                      
perl-Mail-Sendmail.noarch 0:0.79-9.el5.1                                      
perl-MailTools.noarch 0:1.77-1.el5                                            
perl-Net-ARP.x86_64 0:1.0.6-2.1.el5                                           
perl-Params-Validate.x86_64 0:0.88-3.el5                                      
perl-Proc-Daemon.noarch 0:0.03-1.el5                                          
perl-TimeDate.noarch 1:1.16-5.el5                                             
perl-XML-DOM.noarch 0:1.44-2.el5                                              
perl-XML-Parser.x86_64 0:2.34-6.1.2.2.1                                       
perl-XML-RegExp.noarch 0:0.03-2.el5                                           
rrdtool.x86_64 0:1.2.27-3.el5                                                 
rrdtool-perl.x86_64 0:1.2.27-3.el5 

Configure MMM

All generic configuration-options are grouped in a separate file called /etc/mysql-mmm/mmm_common.conf. This file will be the same on all hosts in the system:

active_master_role          writer


<host default>
    cluster_interface       eth0

    pid_path                /var/run/mmmd_agent.pid
    bin_path                /usr/lib/mysql-mmm/

    replication_user        replication
    replication_password    replication_password

    agent_user              mmm_agent
    agent_password          agent_password
</host>

<host db1>
    ip                      192.168.0.11
    mode                    master
    peer                    db2
</host>

<host db2>
    ip                      192.168.0.12
    mode                    master
    peer                    db1
</host>

<host db3>
    ip                      192.168.0.13
    mode                    slave
</host>

<host db4>
    ip                      192.168.0.14
    mode                    slave
</host>


<role writer>
    hosts                   db1, db2
    ips                     192.168.0.100
    mode                    exclusive
</role>

<role reader>
    hosts                   db1, db2, db3, db4
    ips                     192.168.0.101, 192.168.0.102, 192.168.0.103, 192.168.0.104
    mode                    balanced
</role>

Don't forget to copy this file to all other hosts (including the monitoring host).

On the database hosts we need to edit /etc/mysql-mmm/mmm_agent.conf. Change “db1” accordingly on the other hosts:

include mmm_common.conf
this db1

On the monitor host we need to edit /etc/mysql-mmm/mmm_mon.conf:

include mmm_common.conf

<monitor>
    ip                      127.0.0.1
    pid_path                /var/run/mmmd_mon.pid
    bin_path                /usr/lib/mysql-mmm/
    status_path             /var/lib/misc/mmmd_mon.status
    ping_ips                192.168.0.1, 192.168.0.11, 192.168.0.12, 192.168.0.13, 192.168.0.14
</monitor>

<host default>
    monitor_user            mmm_monitor
    monitor_password        monitor_password
</host>

debug 0

ping_ips are some ips that are pinged to determine whether the network connection of the monitor is ok. I used my switch (192.168.0.1) and the four database server.

Start MMM

Start the agents

(On the database hosts)

Debian/Ubuntu

Edit /etc/default/mysql-mmm-agent to enable the agent:

ENABLED=1

Red Hat

RHEL/Fedora does not enable packages to start at boot time per default policy, so you might have to turn it on manually so the agents will start automatically when server is rebooted:

chkconfig mysql-mmm-agent on

Then start it:

/etc/init.d/mysql-mmm-agent start

Start the monitor

(On the monitoring host) Edit /etc/default/mysql-mmm-monitor to enable the monitor:

ENABLED=1

Then start it:

/etc/init.d/mysql-mmm-monitor start

Wait some seconds for mmmd_mon to start up. After a few seconds you can use mmm_control to check the status of the cluster:

mon$ mmm_control show
  db1(192.168.0.11) master/AWAITING_RECOVERY. Roles: 
  db2(192.168.0.12) master/AWAITING_RECOVERY. Roles: 
  db3(192.168.0.13) slave/AWAITING_RECOVERY. Roles: 
  db4(192.168.0.14) slave/AWAITING_RECOVERY. Roles: 

Because its the first startup the monitor does not know our hosts, so it sets all hosts to state AWAITING_RECOVERY and logs a warning message:

mon$ tail /var/log/mysql-mmm/mmm_mon.warn
…
2009/10/28 23:15:28  WARN Detected new host 'db1': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db1' to switch it online.
2009/10/28 23:15:28  WARN Detected new host 'db2': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db2' to switch it online.
2009/10/28 23:15:28  WARN Detected new host 'db3': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db3' to switch it online.
2009/10/28 23:15:28  WARN Detected new host 'db4': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db4' to switch it online.

Now we set or hosts online (db1 first, because the slaves replicate from this host):

mon$ mmm_control set_online db1
OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db2
OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db3
OK: State of 'db3' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db4
OK: State of 'db4' changed to ONLINE. Now you can wait some time and check its new roles!


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql> show status  (0) 2014.08.29
설치 패키지  (0) 2014.08.29
mysql 자동 backup 2  (0) 2014.08.28
mysql 자동 backup  (0) 2014.08.28
Optimizing table  (0) 2014.08.28
반응형

http://foxrain93.blog.me/100192636540




자동 백업 스크립트 만들기

# vi mysqlbackup

---------------------------------------

#!/bin/sh

DATE=`date +"%Y%m%d%H%M"`

BACKUP_DIR=/mysqlbackup 

FILENAME=mysqlback 

/usr/bin/mysqldump -uroot -ppassword dbname > ${BACKUP_DIR}/${FILENAME}_${DATE}.sql 

# (or dbname -> --all-databases) 

cd ${BACKUP_DIR} 

tar cfpz ${FILENAME}_${DATE}.tar.gz ${FILENAME}_${DATE}.sql 

rm -Rf ${FILENAME}_${DATE}.sql  

chown root.root ${BACKUP_DIR}/${FILENAME}_${DATE}.tar.gz 

chmod 755 ${BACKUP_DIR}/${FILENAME}_${DATE}.tar.gz 

find ${BACKUP_DIR}/ -mtime +5 -exec rm -f {} \; 

cp ${BACKUP_DIR}/${FILENAME}_${DATE}.tar.gz /nfs 

-------------------------------------------------------------- 

# chmod 755 mysqlbackup 

 

매일 3시 1분에 실행

# crontab -e

----------------------------------

01 03 * * * sh /mysqlbackup/mysqlbackup > /dev/null 2>&1

------------------------------------

 

/etc/rc.d/init.d/crond stop

/etc/rc.d/init.d/crond start

[출처] mysql 자동 backup 2|작성자 진저티


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

설치 패키지  (0) 2014.08.29
Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28
mysql 자동 backup  (0) 2014.08.28
Optimizing table  (0) 2014.08.28
rand 함수를 이용한 정해진 자릿수 숫자 만들기  (0) 2014.08.28
반응형

http://foxrain93.blog.me/100192636540



자동 백업 스크립트 만들기

# vi mysqlbackup

---------------------------------------

#!/bin/sh

DATE=`date +"%Y%m%d"`

OLD_DATE=`date --date '5 days ago'+"%Y%m%d"` 

BACKUP_DIR=/mysqlbackup 

/usr/bin/mysqldump -uroot -ppassword dbname > ${BACKUP_DIR}/dbname_${DATE}.sql 

(or dbname -> --all-databases) 

chown root.root ${BACKUP_DIR}/dbname_${DATE}.sql 

chmod 755 ${BACKUP_DIR}/dbname_${DATE}.sql 

rm -Rf ${BACKUP_DIR}/dbname_${OLD_DATE}.sql 

-------------------------------------------------------------- 

# chmod 755 mysqlbackup 

 

매일 3시 1분에 실행

# crontab -e

----------------------------------

1 3 * * * sh /mysqlbackup/mysqlbackup > /dev/null 2>&1

------------------------------------

 

/etc/rc.d/init.d/crond stop

/etc/rc.d/init.d/crond start

[출처] mysql 자동 backup|작성자 진저티


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28
mysql 자동 backup 2  (0) 2014.08.28
Optimizing table  (0) 2014.08.28
rand 함수를 이용한 정해진 자릿수 숫자 만들기  (0) 2014.08.28
Mysql MMM error 처리  (0) 2014.08.28
반응형

한 번에 모든 테이블 Optimizing table 하는 스크립트


#!/bin/bash 
MYSQL_LOGIN='-u<user> -p<password>'
for db in $(echo "SHOW DATABASES;" | mysql $MYSQL_LOGIN | grep -v -e "Database" -e "information_schema")
do
        TABLES=$(echo "USE $db; SHOW TABLES;" | mysql $MYSQL_LOGIN |  grep -v Tables_in_)
        echo "Switching to database $db"
        for table in $TABLES
        do
                echo -n " * Optimizing table $table ... "
                echo "USE $db; OPTIMIZE TABLE $table" | mysql $MYSQL_LOGIN >/dev/null
                echo "done."
        done
done 


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql 자동 backup 2  (0) 2014.08.28
mysql 자동 backup  (0) 2014.08.28
rand 함수를 이용한 정해진 자릿수 숫자 만들기  (0) 2014.08.28
Mysql MMM error 처리  (0) 2014.08.28
Mysql MMM 의 설치  (0) 2014.08.28
반응형

http://foxrain93.blog.me/100192636540



i <= RAND < j 를

FLOOR(i+RAND()*(j-i)) 로 나타낸다.

5자릿수라면,

FLOOR(10000+RAND()*(99999-10000))

즉,

FLOOR(10000+RAND()*89999)


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql 자동 backup  (0) 2014.08.28
Optimizing table  (0) 2014.08.28
Mysql MMM error 처리  (0) 2014.08.28
Mysql MMM 의 설치  (0) 2014.08.28
character-set utf8mb4 사용시 replication slave 구성 주의사항  (0) 2014.08.28
반응형

http://foxrain93.blog.me/100192636540



1.

mysql> SHOW SLAVE STATUS\G 상에서 오류가 나타나지 않았는데 로그에선 다음과 같은 오류가 발생했다면,

# vi /var/log/mysqld.log

-----------------------------------------------

[Note] Error reading relay log event: slave SQL thread was killed 

~

------------------------------------------------

또, mmm monitor에서 mmm_control checks 명령으로 replication broken 상태가 보인다면,

 

마스터를 설정하는 과정 change master 에서 master가 될 서버의 로그 파일과 pos을 세팅할때 master 서버에서 상태값을 받아올때,

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;

mysql> UNLOCK TABLES;

위 처럼 락 상태에서 상태값을 읽고 slave에서 change master 를 실행해준다.

 

명령을 실행할때마다 position 이 바뀌기 때문에 잘못된 replication 연결로 발생한것이다.

 

2. 아래같은 상태일때, port가 방화벽에 열려있는지 확인한다.

 

# mmm_control show 
# Warning: agent on host db1 is not reachable 
# Warning: agent on host db2 is not reachable 
  db1() master/ONLINE. Roles: 
  db2() master/ONLINE. Roles:

 

mmm 에 필요한 port는

mysql_port : 3306 (복제는 실행되지만 모니터링이 안된다, agent, monitor, tools)

agent_port : 9989 (agent, monitor)

ssh_port : 22 (tools)

[출처] Mysql MMM error 처리|작성자 진저티


반응형
반응형

http://foxrain93.blog.me/100192636540



최소 2개의 db server 와 monistoring server가 필요하다.

서버 종류

ip

hostname

server id 

monitoring host 

 192.168.0.10

mon 

 -

 master 1

 192.168.0.11

 db1

 1

 master 2

 192.168.0.12

 db2

 2

 

master 1 환경 설정

# vi /etc/my.cnf

-------------------------------------------

server_id = 1

log_bin = /var/log/mysql/mysql-bin.log

log_bin_index = /var/log/mysql/mysql-bin.log.index

relay_log = /var/log/mysql/mysql-relay-bin

relay_log_index = /var/log/mysql/mysql-relay-bin.index

expire_logs_days = 10

max_binlog_size = 100M

log_slave_updates = 1

 

# bind-address = 127.0.0.1

삭제 하고

bind-address = 0.0.0.0

 

auto_increment_increment = 2 // master 서버의 수 설정

auto_increment_offset = 1 // 각 서버에서 auto_increment_increment 보다 적은(less than) 수로 unique 하게 설정

----------------------------------------------------------------

 

# /etc/init.d/mysqld restart

error  : ~ file '/var/log/mysql/mysql-bin.log.index' not found 로 재구동이 안될경우

->

# mkdir /var/log/mysql

# chown -R mysql.mysql /var/log/mysql

# chmod -R 755 /var/log/mysql

 

mysql 사용자 생성

mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'monitor_password';
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'agent_password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication_password';

 

백업을 위해 데이터 변경을 금지한다.

mysql> FLUSH TABLES WITH READ LOCK;

상태값을 기억한다.

mysql> SHOW MASTER STATUS;

백업을 하는동안 mysql-shell 을 닫으면 안된다. 위에서한 lock이 해제된다.

# mysqldump -u root -p --all-databases > /tmp/database-backup.sql

mysql> UNLOCK TABLES;

 

다른 db 서버로 옮긴후 import 한다,

 

# mysql -u root -p < /tmp/database-backup.sql

권한을 새로이 적용한다

mysql> FLUSH PRIVILEGES;

mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

(error)

// log를 보면 mysql slave failed to open the relay log 이렇게 나온다. 이럴 경우,

mysql> FLUSH LOGS;

mysql> RESET SLAVE;

mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication', master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

// 오류가 없으면,

mysql> SLAVE START;

mysql> SHOW SLAVE STATUS\G


이제 반대로 replication 을 실행해야 한다.

 

mysql> SHOW MASTER STATUS;

// 새 파일과 위치를 기억한다.

 

db1으로 가서 명령을 실행한다. db2 에서 기억한 SHOW MASTER STATUS의 <file>, <position> 을 입력한다.

mysql> CHANGE MASTER TO master_host = '192.168.0.12', master_port=3306, master_user='replication', master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS\G

 

# vi /etc/sysconfig/iptables

--------------------------------------

// agent, monitor, tools

-A INPUT -s 192.168.10.0/24 -m state --state NEW -p tcp --dport 3306 -j ACCEPT

// agent, monitor

-A INPUT -s 192.168.10.0/24 -m state --state NEW -p tcp --dport 9989 -j ACCEPT

// tools

-A INPUT -s 192.168.10.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

---------------------------------------

 

MMM 설치

 

모든 host 에서,

# useradd --comment "MMM Script owner" --shell /sbin/nologin mmmd

 

Monitoring host 에서,

# yum install mysql-mmm mysql-mmm-monitor

 

Database hosts 에서,

# yum install mysql-mmm mysql-mmm-agent

 

MMM 환경 설정

 

모든 host에서,

# vi /etc/mysql-mmm/mmm_common.conf

--------------------------------------------------

active_master_role          writer


<host default>

# cluster에서 사용할 장비 설정
    cluster_interface       eth0

    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/

    replication_user        replication
    replication_password    replication_password

    agent_user              mmm_agent
    agent_password          agent_password
</host>

<host db1>
    ip                      192.168.0.11
    mode                    master
    peer                    db2
</host>

<host db2>
    ip                      192.168.0.12
    mode                    master
    peer                    db1
</host>

# slave 및 추가 장비들

#<host db3>
#    ip                      192.168.0.13
#    mode                    slave
#</host>

#<host db4>
#   ip                      192.168.0.14
#    mode                    slave
#</host>


<role writer>
    hosts                   db1, db2
    ips                     192.168.0.250
    mode                    exclusive
</role>

<role reader>
    hosts                   db1, db2
    ips                     192.168.0.251, 192.168.0.252
    mode                    balanced
</role>

 

--------------------------------------------------

 

Database hosts 에서, (db1 일 경우)

 

# vi /etc/mysql-mmm/mmm_agent.conf

---------------------------------------------------

include mmm_common.conf

this db1

---------------------------------------------------

 

Monitor host 에서

 

# vi /etc/mysql-mmm/mmm_mon.conf

-------------------------------------------------------

include mmm_common.conf

<monitor>
    ip                      127.0.0.1
    pid_path             /var/run/mysql-mmm/mmm_mond.pid
    bin_path             /usr/libexec/mysql-mmm/
    status_path        /var/lib/mysql-mmm/mmm_mond.status

# ping_ips 는 monitor 가 network connection이 ok 상태인지 ping해보는 ip 이다. ping 이 가능한 서버들을 리스트한다.
    ping_ips              192.168.0.1, 192.168.0.11, 192.168.0.12

    auto_set_online    60
</monitor>

<host default>
    monitor_user        mmm_monitor
    monitor_password monitor_password
</host>

debug 0

-------------------------------------------------------

 

MMM 구동

 

Database hosts 에서,

 

(Debian/Ubuntu)

# vi /etc/default/mysql-mmm-agent

-----------------------------------

ENABLED=1

-----------------------------------

(Red Hat)

# chkconfig mysql-mmm-agent on

# /etc/init.d/mysql-mmm-agent start

 

Monitor host 에서,

 

# vi /etc/default/mysql-mmm-monitor

------------------------------------

ENABLED=1

-------------------------------------

# chkconfig mysql-mmm-monitor on

# /etc/init.d/mysql-mmm-monitor start

[출처] Mysql MMM 의 설치|작성자 진저티


반응형
반응형
 [출처] character-set utf8mb4 사용시 replication slave 구성 주의사항 (MySQL Power Group) |작성자 jm732

안녕하세요 ~
오늘 처음 글을 올리네요 .. ^^ 
앞으로 가능한한 용기내어(?) 혼자 정리하고있는 것들을 올려볼까 합니다..^^


mysql 5.5 부터 사용 가능해진 utf8mb4 를 character-set 으로 사용하는 slave DB 를 구성할 때 주의사항으로 
알아두면 좋을만한 내용이라 공유드립니다. ( 이미 아시는분이 계실수도 있겠지만 ^^ ; )

 utf8mb4 : 5.5.3 버전부터 사용 가능해진 character-set 으로, 3 바이트까지 저장가능한 utf8 character-set 의 
               superset 인 utf8mb4 는 4 바이트 까지 저장이 가능한 character set 입니다.
               자세한 내용은 여기를 참고하세요 : https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html


Master DB ( utf8 ) ---- replication ---> Slave DB ( utf8mb4 )   

위와 같은 구성으로
utf8 을 사용하는 Master DB에  utf8mb4 를 사용하는 Slave DB 를 구성할 때, 
replication 을 연결하면 ( start slave; )  다른 character-set 으로 연결되어, 에러가 발생하게 됩니다. 

하여 Slave DB 의 replication 시작 시 아래 variable 을 설정해야합니다.

+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_type_conversions | ALL_NON_LOSSY |
+------------------------+---------------+


[ slave_type_conversions ]

: slave 서버에서 사용되는 형식 변환 모드를 제어하는 변수
  
Mode
Effect
ALL_LOSSY
정보의 손실이 허용되는 타입 변환.
INT 컬럼이 TINYINT (a lossy conversion) 로 변환될 경우를 허용한다.
TINYINT 컬럼을 INT 컬럼으로 변환 (non-lossy)는 허용하지 않는다.
ALL_NON_LOSSY
Source 의 값을 변경하거나, truncate 할 필요가 없다.
소스 타입보다 타켓이 넓은 범위를 가지는 변환을 허용한다.
손실 변환이 허용되는지 여부에 관계가 없다.
INT 타입을 TINYINT 로 변환, 혹은 CHAR(25) 타입을 VARCHAR(20) 타입으로 변환할 경우 데이터 손실 발생으로 슬레이브 오류와 함께 중지된다.
ALL_LOSSY, ALL_NON_LOSSY
모든 지원되는 유형 변환은 손실 전환 여부에 관계없이 허용됨.
[empty]
속성 승격, 또는 강등이 허용되지 않는다.
소스와 타겟 테이블의 모든 열이 같은 유형이어야 한다. 기본값임

해당 값을 변환 할 경우, slave restart 가 필요

utf8 보다 utf8mb4 character-set 이 저장공간이 더 크기때문에 (4 bytes)
ALL_NON_LOSSY 로 설정하더라도 데이터 손실은 없습니다. 
replication 연결 시, 데이터 손실 여부를 반드시 잘 확인하고 설정되어야 합니다.

utf8, utf8mb4 간에 가능한 시나리오이고, 완전히 다른 형식의 캐릭터셋은 사용하지 않는 것이 좋겠습니다.

테스트 시나리오는 아래와 같습니다.

-- =============================================================
--  ( Master DB )
-- =============================================================

1) Meta Dump
신규 구성될 Slave DB 의 Character-set 을 utf8mb4 로 설정하기 위해
Master DB에서 mysqldump 를 사용하여 Meta 정보와 data 를 각각 받는다. 
( dump restore시 문자열 치환해도 상관없음 - 여기서는 정확한 확인을 위해 meta 정보, row data 를 따로 받음)

// mysql database 를 제외하고 적용하기 위해, database 단위로 dump 받음

$./mysqldump --databases  xxx kkk sysbench --opt --default-character-set=utf8mb4 [...] --no-data -uroot > /backup/pre_metadata.sql


2) 문자열 치환 
Character-set : utf8 -> utf8mb4   /  Collation : utf8_bin -> utf8mb4_bin 으로 문자열 치환

cat pre_metadata.sql  | sed 's/CHARSET=utf8 COLLATE=utf8_bin/CHARSET=utf8mb4 COLLATE=utf8mb4_bin/g'  | sed 's/COLLATE utf8_bin/COLLATE utf8mb4_bin/g'  | sed 's/CHARACTER SET utf8/CHARACTER SET utf8mb4/g' > /backup/metadata.sql

3) only data dump

$ ./mysqldump --databases  xxx kkk sysbench --opt --default-character-set=utf8mb4 [...] --master-data=2 --single-transaction --no-create-db --no-create-info -uroot > /backup/onlydata.sql

// dump 후 시점정보 확인
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4892;

-- Master DB의 table character-set
+--------------+--------------+--------+--------------------+-----------------+------------+
| table_schema | table_name   | engine | character_set_name | table_collation | table_type |
+--------------+--------------+--------+--------------------+-----------------+------------+
| kkk          | kktest       | InnoDB | utf8               | utf8_bin        | BASE TABLE |
| sysbench     | kktest       | InnoDB | utf8               | utf8_bin        | BASE TABLE |
| sysbench     | sbtest       | InnoDB | utf8               | utf8_bin        | BASE TABLE |
| xxx          | ttt1         | InnoDB | utf8               | utf8_bin        | BASE TABLE |
+--------------+--------------+--------+--------------------+-----------------+------------+


-- =============================================================
--  ( Slave DB )
-- =============================================================

// Slave DB는 MySQL 설치 및 startup 까지 되어있는 것으로 가정한다.

1) Meta dump restore

mysql>source metadata.sql 

2) only data dump restore

mysql>source onlydata.sql

-- Slave DB의 table character-set
+--------------+--------------+--------+--------------------+-----------------+------------+
| table_schema | table_name   | engine | character_set_name | table_collation | table_type |
+--------------+--------------+--------+--------------------+-----------------+------------+
| kkk          | kktest       | InnoDB | utf8mb4            | utf8mb4_bin     | BASE TABLE |
| sysbench     | kktest       | InnoDB | utf8mb4            | utf8mb4_bin     | BASE TABLE |
| sysbench     | sbtest       | InnoDB | utf8mb4            | utf8mb4_bin     | BASE TABLE |
| xxx          | ttt1         | InnoDB | utf8mb4            | utf8mb4_bin     | BASE TABLE |
+--------------+--------------+--------+--------------------+-----------------+------------+

3) replication 연결

mysql> CHANGE MASTER TO
MASTER_HOST='10.10.10.10',
MASTER_USER='replication',
MASTER_PASSWORD='xxxxxx',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4892 ;

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.10
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 998873
               Relay_Log_File: dbmysql2-relay-bin.000004
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1677
                   Last_Error: Column 1 of table 'xxx.ttt1' cannot be converted from type 'varchar(1536)' to type 'varchar(512)'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 999384
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1677
               Last_SQL_Error: Column 1 of table 'xxx.ttt1' cannot be converted from type 'varchar(1536)' to type 'varchar(512)'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 136
                  Master_UUID: 700b3176-6155-11e3-bd8e-00a0dxxxxxxx
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp: 140210 19:47:55
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)



mysql> stop slave ;
Query OK, 0 rows affected (0.03 sec)

mysql> set global slave_type_conversions=ALL_NON_LOSSY;
Query OK, 0 rows affected (0.02 sec)

mysql> show variables like '%slave_type%';
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_type_conversions | ALL_NON_LOSSY |
+------------------------+---------------+
1 row in set (0.00 sec)

mysql> start slave ;
Query OK, 0 rows affected (0.02 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.10
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 998873
               Relay_Log_File: db-mysql2-relay-bin.000005
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 998873
              Relay_Log_Space: 999384
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 136
                  Master_UUID: 700b3176-6155-11e3-bd8e-00a0dxxxxxxx
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Mysql MMM error 처리  (0) 2014.08.28
Mysql MMM 의 설치  (0) 2014.08.28
MySQL 날짜 함수 정리  (0) 2014.08.12
xtrabackup  (0) 2014.08.08
Percona Xtrabackup 으로 백업/복원하기 (전체,디비별,테이블별)  (0) 2014.08.08
반응형

 

 함수

 사용법

 내용

 NOW()

NOW()

현재 시간(년월일시분초)

SYSDATE()

SYSDATE()

현재 시간(년월일시분초) 

 HOUR()

 HOUR(n)

 n의 시간

 MINUTE()

 MINUTE(n)

n의 분

 SECOND()

 SECOND(n)

 n의 초

 DAYNAME()

 DAYNAME(n)

 n의 날짜 이름

 DAYOFMONTH()

 DAYOFMONTH(n)

 n의 숫자로 표시된 날

 MONTHNAME()

 MONTHNAME(n)

 n의 달 이름

 MONTH()

 MONTH(n)

 n의 숫자로 표시된 달

 YEAR()

 YEAR(n)

 n의 숫자로 표시된 연도

 CURDATE()

 CURDATE()

 현재 년월일

 CURTIME()

 CURTIME()

 현재 시분초

 UNIX_TIMESTAMP()

 UNIX_TIMESTAMP()

 '1970-01-01 00:00:00' 부터의 초를 반환한다. 인자가 주어질 경우는 해당 날짜에 대한 유닉스 시간을 반환한다.

 LAST_DAY()

 LAST_DAY(n)

 n월의 마지막 날 값을 반환

(n이 유효하지 않으면 NULL 반환)

 DATEDIFF()

 DATEDIFF(n1, n2)

 n1와 n2 사이의 일수 반환

 ADDDATE()

 ADDDATE(date,INTERVAL expr type)

두번째 인자 TYPE만큼 더한 값 

 SUBDATE()

 SUBDATE(date,INTERVAL expr type)

 두번째 인자 TYPE만큼 뺀 값

 ADDTIME()

 ADDTIME(expr,expr2)

 두번째 인자 시간만큼 더한 값

 SUBTIME()

 SUBTIME(expr,expr2)

두번째 인자 시간만큼 뺀 값

 DATE_ADD()

 DATE_ADD(date,INTERVAL expr type)

 시작 날짜에 두번째 인자 TYPE만큼 더한 값

 DATE_SUB()

 DATE_SUB(date,INTERVAL expr type)

시작 날짜에 두번째 인자 TYPE만큼 뺀 값 

 

위의 함수 외에 이전 시간을 구할 필요가 있을 경우도 있을 것입니다~!!

예를 들면 몇분전, 몇시간 전을 말하는 것입니다!

해당 경우를 대비해 추가로 참고 자료를 넣습니다~!^-^/

[참고] 특정 시간 구하는 방법

(기준 시간) (+ or -) interval n (year or month or day or hour or minute or second or week 등등..)

기준 시간 : 더하거나 뺄 기준 시간

(+ or - ) : 더하거나 빼기 등의 선택

n : 더하거나 뺄 정수

(year or month or day or hour or minute or second or week 등등..) : 더하거나 뺄 단위

 

ex) 5분전 : now() - interval 5 minute

 

반응형
반응형

xtrabackup 

DB가 10GB가 넘어가면서 mysqldump로 백업하면 그 시간동안 서버가 기어다님ㅠㅠ

xtrabackup innobackupex 를 쓰고싶었지만 perl DBI mysql 없어서 실행안됨ㅠㅠ

결국 xtrabackup 을 써봤는데 속도도 빠르고 괜찮아서 걍 쓰기로마음먹고 


백업<->복구 

백업->증분백업->복구


테스트해본결과 속도도 괜찮고 몇가지 사항만 숙지한다면 복구도 확실해서 쓰기로 마음먹었으나 사용법이 OTZ


1. 백업 = 전체 백업 -> 증분 백업 

2. 복구 = 증분+전체백업 합치기 -> 복구


백업(전체 백업)

frm 파일은 백업되지 않음으로

mysql 데이터 폴더 (/usr/local/mysql/data)에 database 폴더를 수동으로 백업한다

cp -r /usr/local/mysql/data/mysql /backup/mysql/xtrabackup_mysql
cp -r /usr/local/mysql/data/mydatabase /backup/mysql/xtrabackup_mydatabase

xtrabackup --backup --target-dir=/backup/mysql/xtrabackup_basedir

xtrabackup --prepare --target-dir=/backup/mysql/xtrabackup_basedir


백업(증분 백업)

xtrabackup --backup --target-dir=/backup/mysql/incremental/ --incremental-basedir=/backup/mysql/xtrabackup_basedir/




복구

0. 전체 백업에 증분백업을 합친다

1. mysql 종료

2. mysql 데이터 폴더 (/usr/local/mysql/data) 삭제

3. mysql 데이터 폴더 (/usr/local/mysql/data)에 database 폴더를 수동으로 백업한다 <- 이걸복사

4. 백업데이터를 복사

5. mysql 데이터 폴더 소유권 변경

6. mysql 시작


0. xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup/ --incremental-dir=/backup/mysql/incremental/

1. service mysqld stop

2. rm -rf /usr/local/mysql/data

3. mv /backup/mysql/xtrabackup_basedir /usr/local/mysql/data

4. 

    cp -r /backup/mysql/xtrabackup_mysql /usr/local/mysql/data/myssql

    cp -r /backup/mysql/xtrabackup_mydatabase /usr/local/mysql/data/mydatabase

5. chown -R mysql:mysql /usr/local/mysql/data

6. service mysqld start


crontab 에 등록해서 매월 1일에 전체백업을 하고 월 말까지 날마다 증분 백업하는 스크립트 예

[backup_month.sh]

#!/bin/bash
# xtrabackup
# 매월 첫 달에 실행된다
# DB xtrabackup base point
if [ ! -d /backup/mysql ]
then
mkdir /backup/mysql
mkdir /backup/mysql/$(date +%Y-%m)
fi
cp -r /usr/local/mysql/data/mysql /backup/mysql/$(date +%Y-%m)/xtrabackup_mysql
cp -r /usr/local/mysql/data/mydatabase/backup/mysql/$(date +%Y-%m)/xtrabackup_mydatabase
xtrabackup --backup --target-dir=/backup/mysql/$(date +%Y-%m)/xtrabackup_basedir
xtrabackup --prepare --target-dir=/backup/mysql/$(date +%Y-%m)/xtrabackup_basedir

[backup_day.sh]

#!/bin/bash
# xtrabackup 
# 매 일 실행된다
# DB xtrabackup base point
if [ ! -d /backup/mysql ]
then
mkdir /backup/mysql
mkdir /backup/mysql/$(date +%Y-%m)
fi
# DB xtrabackup increment point
if [ ! -d /backup/mysql/$(date +%Y-%m)/incremental ]
then
mkdir /backup/mysql/$(date +%Y-%m)/incremental
fi
xtrabackup --backup --target-dir=/backup/mysql/$(date +%Y-%m)/incremental/$(date +%d)/ --incremental-basedir=/backup/mysql/$(date +%Y-%m)/xtrabackup_basedir/


실행권한으로 바꾸고

chmod 0700 backup_month.sh

chmod 0700 backup_day.sh


crontab 등록

crontab -e

00 03 1 * * /root/contab/backup_month.sh
00 06 * * * /root/contab/backup_day.sh

반응형
반응형

Mysql과 MariaDB에 핫백업(Online Backup)을 지원하는 툴 중 무료에 쓸만한 툴은 Percona의 Xtrabackup이 제일 유명할 것이다.

하지만 한글로 정리된 자료 중 예와 함께 정리된 자료를 찾기 힘들어 이렇게 정리한다.




1) 백업 수행 계정

우선 백업하는 OS 계정은 root 혹은 mysql로 하는 것이 정신 건강상 편하다(보안을 위해 가능한 mysql계정으로)

설치 방법에 따라 다르지만 ubuntu에서 apt-get으로 설치했다고 하면 아마도 다음과 같이 소유권이 생성되어 있을 것이다.



여기서 소유권이 모두 접근 가능해야 하기 때문에 권한 설정을 잘 해 놓아야 하기 때문에 다른계정은 설정이 쉽지 않다.

(dba그룹을 만들고 참여하게 한다든지 방법이 없지는 않다.)




2) 모든 DB 백업

ex)

1
innobackupex  <백업경로>



위와 같이 하면 백업경로 아래에 시간 폴더가 생성되며 백업이 저장된다

(os계정 로그인에 관리자 권한이 없다면 "--user <관리자계정> --password <암호>"를 추가하자)




3) 로그 백업 (로그를 기존 백업에 수정된 내용이 반영됨)


ex)

1
innobackupex --apply-log <백업경로>/<시각폴더>




4) 모든 DB 복원


데이터 폴더 이름을 바꿔놓고(만약을 위해) 새로 생성후(빈 폴더) 권한을 바꿔주는 것이 포인트!

ex)

1
2
3
4
5
6
7
service mysql stop
mv /var/lib/mysql /var/lib/mysql_old
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
innobackupex --copy-back <백업경로>
chown -R mysql:mysql /var/lib/mysql
service mysql start




5) 특정 DB복원


Database파일이 손상되었다면 그대로, Drop 하였다면 같은 이름으로 생성한(show databases에서 보이도록) 상태에서


ex)

1
2
3
4
5
service mysql stop
mv /var/lib/mysql/<대상디비명> /var/lib/mysql/<대상디비명>_old
cp -r <백업경로>/<대상디비명> /var/lib/mysql/<대상디비명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>
service mysql start

아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다

찾아보면 서버에서 갖고 있는 테이블 정보와 매칭이 안되서라고 하니 다음을 수행시키자


확인해 보면 아마 복원 되어 있을 것이다




6) 특정 Table 복원


맹락은 특정 Database복원과 같다

show tables로 보이도록 만들어 두고


ex)

1
2
3
4
5
service mysql stop
mv /var/lib/mysql/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>_old
cp -r <백업경로>/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>/<대상테이블명>
service mysql start


아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다



1
mysqlcheck --all-databases


확인해 보면 아마 복원 되어 있을 것이다

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

MySQL 날짜 함수 정리  (0) 2014.08.12
xtrabackup  (0) 2014.08.08
MySQL5.1 to MySQL5.5 upgrade 때리기! [Ubuntu jaunty(32bit)]  (0) 2014.08.07
mysql 모니터링툴 innotop & mysqlreport  (0) 2014.08.01
ignored in --skip-name-resolve mode  (0) 2014.07.29
반응형

간만에 기술 블로깅질.. 
좀 하드코어 스럽긴 하지만... 일단 DB업그레이드 하기로 .. 결정.
이유는 뭐 빨라졌다고 해서?;;; 
장비빨이 안되는 환경에서 지푸라기라도 잡고 싶은 심정으로다가..  

일단 ... 개발 서버인 Ubuntu Jaunty 32bit 에다가 우선적으로다가.. 

sudo apt-get install alien

 
MySQL 다운로드 사이트에서  Linux Generic 파일 받아서 압축을 풀면 RPM들 파일이 나온다.. 
이게 뭐밍?;; 뭐 그래서 위에 녀석이 필요하다.. 

and then 
일단 난 

sudo alien -k MySQL-server-5.5.10-1.linux2.6.i386.rpm
sudo alien -k MySQL-client-5.5.10-1.linux2.6.i386.rpm


해줬다.. 

그럼 mysql-server_5.5.10-1.linux2.6_i386.deb 파일과 mysql-client_5.5.10-1.linux2.6_i386.deb 파일이 생성된다. 

일단 설치 준비는 끝.. 
그다음에 .. 혹시 모를 상황을 대비해서 백업 실시 .. 

# mkdir -p mysql_bk/data
# cd mysql_bk
# mkdir  conf
# mkdir dump 

# cp  -R /etc/mysql ~/mysql_bk/conf
# cp -R /var/lib/mysql ~/mysql_bk/data
# mysqldump -uxxxxx -p --databases mysql > ~/mysql_bk/dump/mysql.sql
# mysqldump -uxxxxx -p --databases xxxx > ~/mysql_bk/dump/xxxx.sql 
 


이렇게 일단 백업 완료 .

# apt-get install libaio-dev 

요녀석 설치 해주고.. 

# apt-get remove mysql-server-5.1
# apt-get autoremove


해서 기존 버전 제거 해준답.

# rm -R /var/lib/mysql
# rm -R /etc/mysql
# rm -R /usr/run/mysql

기존 폴더도 삭제.

일단 일편은 여기까지 ... 귀찮네;; 다 쓰려니까;; 


반응형
반응형

먼저 첨부된 파일 다운로드합니다.

 yum install perl-DBD-mysql 
                     OR
# tar -zxvf DBD-mysql-4.018.tar.gz

# cd DBD-mysql-4.018
# perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config --libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -lcrypt -lnsl -lm" --cflags=-I/usr/local/mysql/include/mysql
# make
# make install

# tar -zxvf TermReadkey-2.30.tar.gz
# cd TermReadKey-2.30/
# perl Makefile.PL
# make
# make install
# tar -zxvf innotop-1.8.0.tar.gz
# cd innotop-1.8.0
# perl Makefile.PL
# make
# make install

# innotop -uroot -pxxxx --socket /tmp/mysql.sock --delay 1
   -> 1초단위로 갱신
 # innotop -uroot -pxxxxx-h localhost --socket /tmp/mysql.sock --delay 0.5 --mode S
      
 - 
T_Cch_Usd &  Thrd_Usd 이 높으면 




# unzip mysqlreport-3.5.zip
# cd mysqlreport-3.5
# ./mysqlreport --user root --password xxxxxx --socket /tmp/mysql.sock -all


반응형
반응형

140122  9:49:14 [Warning] 'user' entry 'root@theswicelogdb2' ignored in --skip-name-resolve mode.
140122  9:49:14 [Warning] 'proxies_priv' entry '@ root@theswice-n' ignored in --skip-name-resolve mode.

 

위와 같은 메시지가 나오는 이유는
my.cnf에 skip-name-resolve를 설정을 할 경우
mysql에 host컬럼에는 도메인이 아닌 IP로만 설정하겠다는 내용이다.

 

근데 위와 같이 도메인으로 된 host가 있어서 
경고 메세지를 나타나게 된다.

 

이럴 경우 도메인을 삭제해주면 위와 같은 경고메세지가 나타나지 않는다.

use mysql로 접속하여

 

'proxies_priv' 테이블에서 theswice-n으로 되어 있는 도메인명을 삭제하고

'user'테이블에서 theswicelogdb2로 되어 있는 도메인명을 삭제하면 된다.

 

localhost는 도메인명으로 헷갈리시는 분들이 있는데

localhost는 도메인명이 아니어서 해당 host에 경고로 걸리지 않는다.

 

그리고 경고메시지가 뜬다고 해서 크게 운영상에 문제가 되지 않는다. 


반응형
반응형

금방해결한 문제라서 그리 큰 문제가 일어나는지는 모르겟다...

사용하는데 지장이 전혀 없었었음...

그래도 걸리적 거려서 구글링하니까 바로해결됨...

sudo: unable to resolve host coder
해결

duehd@duehd88:/cat /etc/hostname
duehd88


duehd@duehd88:/sudo vim /etc/hosts
#127.0.0.1       localhost
#127.0.0.1       duehd88
설정한ipAddress   duehd88

 The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters 

색깔칠해진 부분 이름이 모두같게 하니까 해결되었음...

아마 hostname에 등록되어 있는 이름이 있으면 괜찮나보다

문제가 있는 시나리오같은경우

cat /etc/hostname 은 

duehd88이지만

cat /etc/hosts 가

#127.0.0.1   duehd87

뭐 이런식으로 다를경우 sudo: unable to resolve host 문제가 생긴다.


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

mysql 모니터링툴 innotop & mysqlreport  (0) 2014.08.01
ignored in --skip-name-resolve mode  (0) 2014.07.29
my.cnf  (0) 2014.07.29
show status로 mysql 모니터링 하기  (0) 2014.07.21
MySQL 데이터 형식  (0) 2014.06.27
반응형

[mysqld]

## MySQL Server Default Option ------------------------------------------------------------------

server-id = 1


user                            = mysql 

port                            = 3306  

basedir             = /usr

datadir                         = /data/mysql

tmpdir                          = /tmp

socket                          = /var/run/mysqld/mysqld.sock


character_set_server            = utf8mb4

collation-server                = utf8mb4_general_ci

default-storage-engine          = InnoDB

skip-name-resolve

skip-external-locking


## MySQL - event-scheduler = ON(true)/OFF(false)

event-scheduler                 = OFF   

sysdate-is-now


back_log                        = 100   

max_connections                 = 300  

max_connect_errors              = 999999

thread_cache_size               = 50    


max_allowed_packet              = 32M   

max_heap_table_size             = 32M   

tmp_table_size                  = 2M  


# For Per Connection

sort_buffer_size                = 256K  

join_buffer_size                = 256K  

read_buffer_size                = 256K  

read_rnd_buffer_size            = 256K


query_cache_size                = 32M   

query_cache_limit               = 2M    


group_concat_max_len            = 1024


## MySQL Isolation

transaction-isolation = READ-COMMITTED



## InnoDB Plug-in Option -----------------------------------------------------------------------------

innodb_adaptive_flushing        = ON

innodb_adaptive_hash_index      = 1

innodb_autoinc_lock_mode        = 1

innodb_change_buffering         = all

innodb_file_format              = barracuda

innodb_io_capacity              = 600

innodb_max_dirty_pages_pct      = 90

innodb_old_blocks_time          = 500

innodb_read_io_threads          = 6

innodb_stats_on_metadata        = 1

innodb_stats_sample_pages       = 8

innodb_strict_mode              = 0

innodb_use_sys_malloc           = 1

innodb_write_io_threads         = 6

ignore_builtin_innodb           = OFF

innodb_fast_shutdown = 0


## plugin-load setting

plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so




## InnoDB Default Option  -----------------------------------------------------------------------------

innodb_additional_mem_pool_size = 32M

innodb_autoextend_increment     = 100   

innodb_buffer_pool_size         = 11G

innodb_buffer_pool_instances    = 3

innodb_commit_concurrency       = 0     

innodb_concurrency_tickets      = 500   

innodb_data_file_path = ibdata1:3G;ibdata2:3G;ibdata3:3G;ibdata4:3G;ibdata5:3G;ibdata6:3G;ibdata7:3G;ibdata8:3G;ibdata9:3G;ibdata10:3G;ibdata11:100M:autoextend  

innodb_data_home_dir            = /data/mysql

innodb_doublewrite              = 1     

innodb_file_per_table           = 1     

innodb_flush_log_at_trx_commit  = 1

innodb_flush_method             = O_DIRECT

innodb_force_recovery           = 0     

innodb_lock_wait_timeout        = 60    

innodb_log_buffer_size          = 16M   

innodb_log_file_size            = 1G    

innodb_log_files_in_group       = 2     

innodb_log_group_home_dir       = /data/mysql

innodb_max_purge_lag            = 0     

innodb_support_xa               = OFF   

innodb_sync_spin_loops          = 20    

innodb_table_locks              = 1     

innodb_thread_concurrency       = 0     

innodb_thread_sleep_delay       = 1000  


## MyISAM Option -----------------------------------------------------------------------------

## Even if you're not using MyISAM tables, you should still set it to 8-64M as it will also be

## used for internal temporary disk tables.

## If you use MYISAM, you can set still key_buffer_size=4GB(max)

key_buffer_size                 = 32M

bulk_insert_buffer_size         = 32M

myisam_sort_buffer_size         = 1M

myisam_max_sort_file_size       = 1G

myisam_repair_threads           = 1

myisam_recover

ft_min_word_len                 = 3



## Logging Option -----------------------------------------------------------------------------

pid-file                        = /var/run/mysqld/mysqld.pid

log-warnings                    = 1

log-error                       = /data/log/mysql-error.log



## "SET GLOBAL general_log = 1" (true)

#general_log                     = 1

#general_log_file                = /data/log/mysql_general.log


log_slow_admin_statements

slow-query-log                  = 1

long_query_time                 = 1

slow_query_log_file             = /data/log/mysql-slow.log

log-output = FILE



### Replication Option ------------------------------------------------------------------------

## Master Server

#log-bin                       = /data/binlog/mysql-master-bin

#binlog_cache_size             = 128K

#max_binlog_size               = 512M  

#expire_logs_days               = 15    

#log-bin-trust-function-creators = 1

#sync_binlog                   = 1

#binlog_format = mixed

#binlog-ignore-db = information_schema

#binlog-ignore-db = performance_schema

#binlog-ignore-db = mysql

#binlog-ignore-db = test




## Slave Server

# relay-log                     = /data/binlog/mysql-relay-bin

# relay_log_purge               = TRUE  

# read_only



## Slave Server = Master Server

## This option tells the slave to log the updates performed by its SQL thread to its own binary log

# log-slave-updates




[client]

socket                          = /var/run/mysqld/mysqld.sock

port                            = 3306  




[mysql]

default-character-set = utf8

no-auto-rehash

show-warnings

prompt=\d\_\R:\m:\\s>

#pager="less -n -i -F -X -E"

반응형

'연구개발 > MYSQL' 카테고리의 다른 글

ignored in --skip-name-resolve mode  (0) 2014.07.29
sudo: unable to resolve host 문제  (0) 2014.07.29
show status로 mysql 모니터링 하기  (0) 2014.07.21
MySQL 데이터 형식  (0) 2014.06.27
MySQL : GROUP_CONCAT 사이즈 조절하기  (0) 2014.06.25
반응형

 [출처] show status로 mysql 모니터링 하기|작성자 또리장군



Geert_Vanderkelen_Monitoring_MySQL__02.pdf



첨부화일도 참고하자!(중요한 계산법들이 적혀있다.) 


상태 변수

  
서버는 자신의 동작 정보를 제공하는 많은 상태 변수를 관리한다. 이러한 변수와 값들은 SHOW [GLOBAL] STATUS 명령문을 통해 확인할 수 있다.  
FLUSH STATUS 명령문을 사용하면많은 종류의 상태 변수를 0으로 리셋 시킬 수가 있다. 
 

상태 변수는 아래와 같은 의미를 가지고 있다. 아무런 버전 정보가 없는 변수들은 5.0 이전 버전에서부터 있었던 것들이다. 


Aborted_clients : 클라이언트가 올바르게 닫히지 않고 멈추었기 때문에 중단된 연결 숫자. 
Aborted_connects : MySQL 서버 연결 실패 횟수. 
Binlog_cache_disk_use : 트랜젝션으로부터 받은 명령문을 저장하기 위해 임시 파일을 사용하고 binlog_cache_size 변수 값을 초과

해서 임시 바이너리 로그캐시를 사용한 트랜젝션의 숫자. 
Binlog_cache_use : 임시 바이너리 로그 캐시를 사용한 트랜젝션의 숫자. 
Bytes_received : 모든 클라이언트로부터 전달 받은 바이트의 숫자. 
Bytes_sent : 모든 클라이언트에 전달된 바이트의 수. 
Com_xxx : Com_xxx 명령문 카운터변수는 각 xxx 명령문이 실행된 횟수를 가리킨다. 각 명령문 타입에 대해서는 하나의 상태 변수가 존재한다. 예를 들면, Com_delete Com_insert는 DELETE와 INSERT 명령문을 각각 카운트 한다. 하지만, 쿼리 캐시가 쿼리 결과를 리턴하면, 서버는 Com_select가 아닌 Qcache_hits 상태 변수를 증가 시킨다. 
모든 Com_stmt_xxx 변수들은 프리페어드 명령문 인수가 알려지지 않았거나 또는 실행 도중에 에러가 발생하더라도 증가를 하게 된다. 다른 말로 설명하면, 이 변수들은 성공적으로 완료된 요청 (request)의 수가 아닌, 입력된 요청 수에 상응한다는 것이다. 
Com_stmt_xxx 상태 변수는 다음과 같다: 
Com_stmt_prepare 
Com_stmt_execute 
Com_stmt_fetch 
Com_stmt_send_long_data 
Com_stmt_reset 
Com_stmt_close 
이 변수들은 프리페어드 명령문의 명령어를 표현한다. 이들 변수 이름들은 네트워크 레이어(layer)에서 사용되는COM_xxx 명령어 셋을참조한다. 다른 말로 표현하면, 이들 변수 값은 프리페어드 명령문 API가 mysql_stmt_prepare(), mysql_stmt_execute()와 같은 것을 호출한 후에 실행될 때마다 증가하게 되는 것이다. 하지만, Com_stmt_prepare, Com_stmt_execute, 그리고 Com_stmt_clos 역시 PREPARE, EXECUTE, 또는 DEALLOCATE PREPARE에 대해서도 각각 증가를 한다. 또한, 이전 버전의 명령문 카운터 변수 (4.1.3 이후에 사용된것들)인 Com_prepare_sql, Com_execute_sql, 그리고 Com_dealloc_sql 역시 PREPARE, EXECUTE, 및 DEALLOCATE PREPARE 명령문에 대해서 증가를 하게 된다. Com_stmt_fetch는 커서가 가져가는 네트워크 라운드-트립(round-trip)의 전체 숫자를 표현한다. 
Compression : 클라이언트 연결이 클라이언트/서버 프로토콜에서압축 사용을 제어하는 변수. MySQL 5.1.2에서 추가됨. 
Connections : MySQL 서버에 시도된 접속 횟수 (성공 또는 실패 모두 포함). 
Created_tmp_disk_tables : 서버가 명령문을 실행할 때 자동으로 디스크에 생성하는 임시 테이블의 숫자. 
Created_tmp_files : mysqld가 생성한 임시 파일의 숫자. 
Created_tmp_tables : 서버가 명령문을 실행할 때 자동으로 생성되는 메모리 상주 임시 테이블의 숫자. Created_tmp_disk_tables이 크다면, tmp_table_size 변수의 값을 늘려서 임시 테이블이 디스크가 아닌 메모리 기반으로 생성되도록 할수도 있다. 
Delayed_errors : 에러를 발생 시키는 (아마도 duplicate key) INSERT DELAYED로 작성된열의 숫자. 
Delayed_insert_threads : 사용 중에 있는 INSERT DELAYED 핸들러 쓰레드 숫자. 
Delayed_writes : INSERT DELAYED가 기록한열의 숫자. 
Flush_commands : FLUSH 명령문의 실행 숫자. 
Handler_commit : 내부 COMMIT 명령문의 숫자. 
Handler_delete : 열이 테이블에서 삭제된 횟수. 
Handler_discover : MySQL 서버는 NDB Cluster 스토리지 엔진이 주어진 이름을 사용하는 테이블을 인식하는지 요청할 수 있다. 이것을 디스커버리 (discovery)라고 부른다. Handler_discover는 테이블들이 이 메커니즘을 통해서 몇번이나 발견되었는지를 나타낸다. 
Handler_prepare : 2-단계 실행 연산에 대한 프리페어 구문용 카운터. 
Handler_read_first : 첫 번째 엔트리가 인덱스에서 읽혀진 횟수. 이 값이 크다면, 서버는 많은 수의 전체 인덱스 스캔 (full index scan)을 실행하고 있음을 의미하는 것이다; 예를 들면, SELECT col1 FROM foo의 경우에서 col1은 인덱스 된 것으로 간주된다. 
Handler_read_key : 키를 근거로 열을 읽기 위한 요청 횟수. 이 값이 크다면, 여러분이 사용하는 테이블이 쿼리에 올바르게 인덱스 되어 있다는 좋은 의미다. 
Handler_read_next : 키 순서에서 바로 다음에 있는 열을 읽기 위한 요청 횟수. 인덱스 컬럼을 범위 제한 값으로 쿼리 하거나 또는 인덱스 스캔을 한다면, 이 값이 증가하게 된다. 
Handler_read_prev : 키 순서에서 바로 전에 있는 열을 읽기 위한 요청 횟수. 이러한 읽기 방식은 주로 ORDER BY ... DESC를 최적화 시키기 위해 사용된다. 
Handler_read_rnd : 고정된 위치를 근거로 열을 읽기 위한 요청 횟수. 결과 값을 정렬하도록 요청하는 많은 수의 쿼리를 실행하는 중이라면, 이 값이 높게 설정된다. 이것은 MySQL이 전체 테이블을 스캔할 것을 요구하는쿼리를 많이 가지고 있거나 또는 키를 정확히 사용하지 않는 조인(join)을 가지고 있는 것이다. 
Handler_read_rnd_next : 데이터 파일에 있는 다음 열을 읽기 위한 요청 횟수. 이 값은 여러분이 많은 수의 테이블 스캔을 할 경우에 높게 된다. 이것은 일반적으로 테이블이 올바르게 인덱스 되지 않았거나 또는 쿼리가 인덱스를 제대로 활용하지 못하고 있음을 의미한다. 
Handler_rollback : 스토리지 엔진으로 하여금 롤백 연산을 실행하도록 요청하는 횟수. 
Handler_savepoint : 스토리지 엔진으로 하여금 세이브 포인트 (savepoint)를 설정하도록 요청하는 횟수. 
Handler_savepoint_rollback : 스토리지 엔진으로 하여금 세이브 포인트로 롤백 하도록 요청하는 횟수. 
Handler_update 
: 테이블에 있는 열을 업데이트 하기 위해 요청하는 횟수. 
Handler_write 
: 테이블에 열을 하나 삽입하기 위한 요청 횟수. 
Innodb_buffer_pool_pages_data 
: 데이터를 가지고 있는 페이지 숫자. 
Innodb_buffer_pool_pages_dirty 
: 현재 더티 (dirty)한 데이터가 있는 페이지 숫자. 
Innodb_buffer_pool_pages_flushed 
: 버퍼 풀 페이지-플러시 (buffer poolpage-flush) 요청 숫자. 
Innodb_buffer_pool_pages_free 
: 프리 (free) 페이지 숫자. 
Innodb_buffer_pool_pages_latched 
: InnoDB 버퍼 풀에 있는 latched 페이지 숫자. 이것은 현재 읽히고 있거나 또는 쓰여지고있거나 또는 여러 가지 이유로 인해 플러시 될 수 없거나 또는 삭제할 수 없는 페이지들을 가리킨다. 
Innodb_buffer_pool_pages_misc
 : 열 잠금 또는 적응적 해시 인덱스(adaptive hash index)와 같은 관리적인 오버 헤드를 위해 할당되었기 때문에 비지 (busy) 상태인 페이지의 숫자. 이 값은 Innodb_buffer_pool_pages_total – Innodb_buffer_pool_pages_free – Innodb_buffer_pool_pages_data 형태로도 계산할 수 있다. 
Innodb_buffer_pool_pages_total
 : 페이지에 있는 버퍼 풀의 전체 크기. 
Innodb_buffer_pool_read_ahead_rnd 
: InnoDB에 의해 초기화되는 “무작위(random)” 읽기 위주 (read-aheads) 숫자. 이것은 쿼리가 테이블의 많은 부분을 무작위 순서로 스캔 할 때 발생된다. MySQL 5.0.2에서 추가 됨. 
Innodb_buffer_pool_read_ahead_seq 
: InnoDB에 의해 초기화되는 시퀀셜 읽기 위주 (read-aheads) 숫자. 이것은 InnoDB가 시퀀셜로 전체 테이블을 스캔할 때 발생한다. 
Innodb_buffer_pool_read_requests : InnoDB가 실행한논리적인 읽기 요청의 숫자. 
Innodb_buffer_pool_reads : InnoDB가 버퍼 풀에서찾지 못해서 단일 페이지 읽기를 해야만 하는 논리적 읽기 횟수. 
Innodb_buffer_pool_wait_free : 일반적으로는, InnoDB 버퍼 풀에 대한 쓰기 연산은 백그라운드에 실행된다.를 한다. 하지만, 페이지 읽기 연산이나 또는 페이지 생성이필요하지만 클린 (clean) 페이지를 사용할 수 없는 경우에는, 페이지가 우선 플러시 되는 것을기다려야 한다. 이 카운터는 이러한 대기 인스턴스를 카운트 한다. 버퍼 풀의 크기가 올바르게 설정 되었다면, 이 값은 작을 것이다. 
Innodb_buffer_pool_write_requests 
: InnoDB 버퍼 풀에서 실행된 쓰기 연산 수. 
Innodb_data_fsyncs 
: 지금까지 실행된 fsync() 연산 수. 
Innodb_data_pending_fsyncs 
: 현재 지연되고 있는 fsync() 연산 수. 
Innodb_data_pending_reads 
: 현재 지연되고 있는 읽기 연산 수. 
Innodb_data_pending_writes 
: 현재 지연되고 있는 쓰기 연산 수. 
Innodb_data_read 
: 지금까지 읽은 데이터의 양 (바이트 단위). 
Innodb_data_reads 
: 데이터 읽기 연산의 전체 숫자. 
Innodb_data_writes 
: 데이터 쓰기 연산의 전체 숫자. 
Innodb_data_written 
: 지금까지 기록한 데이터의 양 (바이트 단위). 
Innodb_dblwr_writes, Innodb_dblwr_pages_written 
: 실행을 마친 중복 기록 (doublewrite) 연산 숫자와 이러한 목적으로 작성된 페이지의 숫자. Section 14.5.14.1,“InnoDB 디스크 I/O”를 참조할것. 
Innodb_log_waits 
: 로그 버퍼가 너무 작아서 계속 진행을 하기 전에 플러시 되기를 요청 받은 대기횟수. 
Innodb_log_write_requests 
: 로그 기록 연산 요청 숫자. 
Innodb_log_writes 
: 로그 파일 대한 물리적 기록 연산 수. 
Innodb_os_log_fsyncs 
: 로그 파일에서 실행된 fsync() 쓰기 연산 수. 
Innodb_os_log_pending_fsyncs 
: 지연되고 있는 로그 파일 fsync() 연산의 수. 
Innodb_os_log_pending_writes 
: 지연되고 있는 로그 파일 쓰기 연산의 수. 
Innodb_os_log_written 
: 로그 파일에 기록된 바이트 숫자. 
Innodb_page_size 
: 컴파일 된 InnoDB 페이지의 크기 (디폴트는 16KB). 페이지에서는 많은 값들이 카운트 된다; 페이지 크기는 이러한 것들이 손쉽게 바이트 단위로 변환되도록 해준다. 
Innodb_pages_created 
: 생성된 페이지의 숫자. 
Innodb_pages_read 
: 읽혀진 페이지 숫자. 
Innodb_pages_written 
: 기록된 페이지의 숫자. 
Innodb_row_lock_current_waits 
: 현재 대기 상태에 있는 열 잠금의 숫자. 
Innodb_row_lock_time 
: 열 잠금을 얻기 위해 소비한 전체 시간 (밀리 초 단위). 
Innodb_row_lock_time_avg 
: 열 잠금을 얻기 위한 평균 시간 (밀리 초 단위). 
Innodb_row_lock_time_max 
: 열 잠금을 얻기 위한 최대 소비 시간 (밀리 초 단위). 
Innodb_row_lock_waits 
: 열 잠금을 기다려야만 하는 횟수. 
Innodb_rows_deleted 
: InnoDB 테이블에서 삭제된 열의 숫자. 
Innodb_rows_inserted 
: InnoDB 테이블에 삽입된 열의 숫자. 
Innodb_rows_read 
: InnoDB 테이블에서 읽은 열의 숫자. 
Innodb_rows_updated 
: InnoDB 테이블에 업데이트 된 열의 숫자. 
Key_blocks_not_flushed 
: 변경은 되었으나 아직까지는 디스크에 플러시 되지 않은 키 캐시 안에 있는 키블록의 숫자. 
Key_blocks_unused 
: 키 캐시에 있는 아직 사용되지 않은 블록의 숫자. 이 값을 사용해서 얼마나 많은 키 캐시가 사용 중에 있는지를 알아낼 수가 있다; Section 5.2.3,“시스템 변수”에서 key_buffer_size를 참조하기바란다. 
Key_blocks_used 
: 키 캐시에 있는 이미 사용된 블록의 숫자. 이 값은 하이-워터 마크 (high-water mark)로서, 동시에 사용될 수 있는 블록의 최대 숫자를 가리키게 된다. 
Key_read_requests 
: 키 블록을 캐시로부터 읽기 위한 요청 숫자. 
Key_reads 
: 디스크에서 키 블록을 물리적으로 읽는 횟수. 만약에 Key_reads의 값이 크다면, key_buffer_size 값은 아마도 매우 작게 된다. 캐시가 안 되는 비율 (miss rate)은 Key_reads/Key_read_requests로 계산할 수 있다. 
Key_write_requests 
: 키 블록을 캐시에 기록하기 위한 요청 횟수. 
Key_writes 
: 키 블록을 디스크에 물리적으로 기록하는 횟수. 
Last_query_cost 
: 쿼리 옵티마이저가 계산한 최종 컴파일 쿼리의 전체 가격. 이것은 동일 쿼리에 대한 서로 다른 쿼리 플랜간의 비용을 비교할 때 유용하다. 디폴트 값은 0 이며, 이것은 어떠한 쿼리도 아직 컴파일 되지 않았음을 가리킨다. Last_query_cost는 세션 변수이다. 
Max_used_connections 
: 서버가 구동된 이후에 사용 중에 있는 동시 최대 연결 수. 
Ndb_cluster_node_id 
: 서버가 MySQL 클러스터 노드로구동 중이라면, 이 변수의 값은 클러스터에 있는 자신의 노드 ID가 된다. 
서버가 MySQL 클러스터의일부분이 아닌 경우에는, 이 변수 값이 0이 된다. 
Ndb_config_from_host 
: 서버가 MySQL 클러스터의일부분이라면, 이 변수의 값은 호스트 이름 또는 클러스터 관리 서버의 IP 주소가 된다. 서버가 MySQL의 일부분이 아니라면, 변수 값은 빈 스트링 (empty string)이 된다. MySQL 5.1.12 이전에서는 이 변수를Ndb_connected_host라고 했다. 
Ndb_config_from_port 
: 서버가 MySQL 클러스터의 일부분이라면, 이 변수는 클러스터 관리 서버에 연결하는 포트 번호가 된다. 
서버가 MySQL 클러스터의 일부분이 아니라면, 이 변수는 0이 된다. MySQL 5.1.12 이전에는 이 변수를 Ndb_connected_port라고 했다. 
Ndb_number_of_data_nodes 
: 서버가 MySQL 클러스터의 일부분이라면, 이 변수는 클러스터의 데이터 노드가 된다. 
서버가 MySQL 클러스터의 일부분이 아니라면, 이 변수 값은 0이 된다. MySQL 5.1.12 이전에는 이 변수 Ndb_number_of_storage_nodes라고 했다. 
Not_flushed_delayed_rows 
: INSERT DELAY 쿼리에 쓰여지기를기다리고 있는 열의 숫자. 
Open_files 
: 열려 있는 파일의 숫자. 
Open_streams 
: 열려 있는 스트링의 숫자 (주로 로깅을 위해 사용되는). 
Open_tables 
: 열려 있는 테이블의 숫자. 
Opened_tables 
: 열린 적이 있는 테이블의 숫자. Opened_tables이 크다면, table_cache 값은 아마도매우 작게 된다. 
Prepared_stmt_count 
: 프리페어드 명령문의 현재 숫자. (명령문의 최대 개수는 max_prepared_stmt_count 시스템 변수로 지정한다.) 이 변수는 MySQL 5.1.14에서 추가되었다. 
Qcache_free_blocks 
: 쿼리 캐시에 있는 프리 메모리 블록의 숫자. 
Qcache_free_memory 
: 쿼리 캐시를 위한 프리 (free) 메모리의 양. 
Qcache_hits 
: 쿼리 캐시 히트 (hit) 숫자. 
Qcache_inserts 
: 쿼리 캐시에 추가된 쿼리의 숫자. 
Qcache_lowmem_prunes 
: 메모리 부족으로 인해 쿼리 캐시에서 삭제된 쿼리의 숫자. 
Qcache_not_cached 
: 캐시 되지 않은 (non-cached) 쿼리의 숫자 (캐시 할 수 없거나, 또는 query_cache_type 설정으로 인해 캐시 되지 않은). 
Qcache_queries_in_cache 
: 쿼리 캐시에 등록되어 있는 쿼리의 숫자. 
Qcache_total_blocks 
: 쿼리 캐시에 있는 블록의 전체 숫자. 
Questions 
: 클라이언트가 서버에 보낸 명령문의 숫자. 
Rpl_status 
: 페일-세이프 (fail-safe) 리플리케이션의 상태 (아직 구현되지 않음). 
Select_full_join 
: 인덱스를 사용하지 않기 때문에 테이블을 스캔 하는 조인 (join)의 숫자. 이 값이 0 이면, 테이블에 있는 인덱스를 조심스럽게 검사하기 바란다. 
Select_full_range_join 
: 참조 테이블에서 범위 검색을 사용하는 조인 (join)의 숫자. 
Select_range 
: 첫 번째 테이블에서 범위를 사용한 조인 (join)의 숫자. 이것은 일반적으로 값이 상당히 크다고 하더라도치명적인 문제는 아니다. 
Select_range_check 
: 각 열을 사용한 이후에 키 사용량을 체크하는 키가 없는 조인의 숫자. 이것의 값이 0 이 아니면, 테이블에 있는 인덱스를 주의 깊게 살펴 보아야 한다. 
Select_scan 
: 첫 번째 테이블의 전체 스캔을 행한 조인의 숫자. 
Slave_open_temp_tables 
: 슬레이브 SQL 쓰레드가 현재 오픈한 임시 테이블의숫자. 
Slave_running 
: 서버가 마스터에 연결되어 있는 슬레이브라면, 이 값은 ON. 
Slave_retried_transactions 
: 서버 스타트업 이후에 리플리케이션 슬레이브 SQL 쓰레드가 트랜젝션을 재 시도한 전체 횟수. 
Slow_launch_threads 
: slow_launch_time 시간보다 더많은 생성 시간이 필요한 쓰레드의 숫자. 
Slow_queries 
: long_query_time 시간보다 오래걸리는 쿼리의 숫자. Section 5.11.5,“슬로우 쿼리 로그”를 참조할 것. 
Sort_merge_passes 
: 정렬 알고리즘을 사용해야만 하는 병합 패스 (merge pass)의 숫자. 이 값이 크다면, 여러분은 sort_buffer_size 시스템 변수의 값을 늘리는 것을 고려해야 한다. 
Sort_range 
: 범위를 사용해서 실행된 정렬의 숫자. 
Sort_rows 
: 정렬된 열의 숫자. 
Sort_scan 
: 테이블 스캔에 의해 실행된 정렬의 숫자. 
Ssl_xxx 
: SSL 접속을 위해 사용된 변수들. 
Table_locks_immediate 
: 테이블 잠금을 즉시 획득한 횟수. 
Table_locks_waited 
: 테이블 잠금을 즉시 획득하지 못하고 대기가 필요했던 횟수. 이 값이 크고 성능상에 문제가 있다면, 여러분은 우선 쿼리를 최적화 하여야 하고, 그 다음에 테이블을 분리하거나 또는 리플리케이션을사용해야 한다. 
Tc_log_max_pages_used 
: mysqld가 내부 XA 트랜젝션을 위한 트랜젝션 코디네이터로구동을 할 때 이것에 의해 사용되는 로그의 메모리-맴을 구현하는 경우, 이 변수는 서버가 시작된 이후 로그가 사용했던 가장 큰 페이지를 가리킨다. Tc_log_max_pages_used Tc_log_page_size의 결과가로그 크기보다 항상 중요하지 않다면, 이 변수의 크기는 필요한 것 보다 크며 이것을 줄이는 것이 가능해진다. (이 변수의 크기는 --log-tc-size 옵션으로 설정할 수 있다. 현재, 이 변수는 사용되지 않는다: 이것은 바이너리 로그-기반 복구에 불필요한 것이며, 메모리-맵 복구 로그 방식은 2-단계 실행을 하나 이상의 스토리지 엔진이지원하지 않는 한 사용되지 않는다). (InnoDB만이 유일하게 이것을 지원하고 있다.) 
Tc_log_page_size 
: XA 복구 로그에 대한 메모리-맵을 구현하기위해 사용하는 페이지 크기. 디폴트 값은 getpagesize() 함수를 사용해서 결정한다. 현재, 이 변수는 Tc_log_max_pages_used 변수에 대해서위에서 설명한 것과 같은 이유로 사용되지 않고 있다. 
Tc_log_page_waits 
: 복구 로그에 대한 메모리-맵을 구현하는경우, 이 변수는 서버가 트랜젝션을 실행하지 못하고 로그에 있는 프리 페이지를 대기해야 하는 경우마다 하나씩 증가를한다. 만일 이 변수가 크다면, 로그 크기를 증가 시켜 보도록 한다 (--log-tc-size 옵션을 사용한다). 바이너리 로그-기반 복구의 경우에는, 이 변수는 2-단계 실행이 진행 중이기 때문에 바이너리로그를 닫을 수 없을 때마다 하나씩 증가한다. (닫기는 모든 이러한 트랜젝션이 완료 되기까지 대기를 한다.) 
Threads_cached 
: 쓰레드 캐시에 있는 쓰레드의 숫자. 
Threads_connected 
: 현재 열려 있는 연결 숫자. 
Threads_created 
: 연결을 처리하기 위해 생성된 쓰레드의 숫자. 만약에 Threads_created가 크다면, thread_cache_size 값을 늘려본다. 캐시 히트 비율은 Threads_created/Connections로 계산할 수가 있다. 
Threads_running 
: 슬리핑 (sleeping) 상태가 아닌쓰레드의 숫자. 
Uptime 
: 서버가 올라와 있는 시간.


---------------------------------------------------------------------------------------------


덧붙이자면 Questions는 MySQL Server에 발행된 쿼리(query)의 총수. 

COM_*은 발행된 커맨드라고할까 엔진 수준에서 가동한 것.
Query Cache가 효과적으로 움직이고 있을때는 COM_의 총수는 전혀 Questions의 값에 근접하지 않는다. 

Questions=Qcache_hits+Σ(COM_*)


스테이먼트계의 값으로 부터 lock상태를 확인하는 방법(도중)

[test]> show global status like '%lock%';
+-------------------------------+-------+

| Variable_name                 | Value | 

+-------------------------------+-------+ 

| Com_lock_tables               | 0     |

| Com_unlock_tables            | 0     |

| Innodb_row_lock_current_waits | 0     |

| Innodb_row_lock_time          | 0     |

| Innodb_row_lock_time_avg      | 0     |

| Innodb_row_lock_time_max      | 0     |

| Innodb_row_lock_waits         | 0     |

| Key_blocks_not_flushed        | 0     |

| Key_blocks_unused             | 7243  |

| Key_blocks_used               | 7248  |

| Qcache_free_blocks            | 0     |

| Qcache_total_blocks           | 0     |

| Table_locks_immediate         | 17    |

| Table_locks_waited            | 0     |

+-------------------------------+-------+ 

14 rows in set (0.00 sec)

스레드에 관한 파라미터 리스트
  • threads_connected (현재 연결된 스레드)
  • threads_cached (사용가능, 비동작중인 스레드의 수)
  • threads_created (작성된 스레드의 수)
  • threads_running (실행중 스레드의 수)
  • slow_launch_threads (스레드 생성시간 > slow_launch_time)
스레드 캐쉬의 히트율은 threads_created/connections 으로 계산
다수의 스레드가 만들어져 있는 경우(또는 히트율이 낮은) thread_cache_size를 크게 잡아 본다.

slow_launch_threads는 0이나, 0에 가까운 값이 아니면 안된다.

[world2]>show status like '%thread%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Delayed_insert_threads | 0     |
| Slow_launch_threads    | 0     |

| Threads_cached         | 2     |
| Threads_connected      | 1     |
| Threads_created        | 3     |
| Threads_running        | 1     |
+------------------------+-------+
6 rows in set (0.01 sec)

tmp_table_size

The maximum size of in-memory temporary tables. (The actual limit is determined as the smaller of max_heap_table_size andtmp_table_size.) If an in-memory temporary table exceeds the limit, MySQL automatically converts it to an on-disk MyISAM table. Increase the value of tmp_table_size (and max_heap_table_size if necessary) if you do many advanced GROUP BY queries and you have lots of memory.


http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

sudo: unable to resolve host 문제  (0) 2014.07.29
my.cnf  (0) 2014.07.29
MySQL 데이터 형식  (0) 2014.06.27
MySQL : GROUP_CONCAT 사이즈 조절하기  (0) 2014.06.25
Mysql bin-log 커졌을때 (bin-log 관리하기)  (0) 2014.05.23
반응형

------------------------------------------------------------------------------------------
MySQL 데이터 형식 (문자형)
CHAR[길이] : 0 ~ 255개의 고정길이 문자열 (정확히 그 길이 바이트)
VARCHAR[길이] : 0 ~ 65536개의 가변길이 문자열 (길이 + 1 또는 2바이트)

TINYTEXT : 0 ~ 255개의 문자로 된 문자열 (길이 + 1바이트)
TEXT : 0 ~ 약 7만개의 문자로 된 문자열 (길이 + 2바이트)
MEDIUMTEXT : 0 ~ 약 1700만개의 문자로 된 문자열 (길이 + 3바이트)
LONGTEXT : 0 ~ 약 430000만개의 문자로 된 문자열. 43억개 (길이 + 4바이트)
------------------------------------------------------------------------------------------
MySQL 데이터 형식 (숫자형)
TINYINT[길이] : -128 ~ +127 또는 0 ~ 255 (1바이트)
SMALLINT[길이] : -32768 ~ 32767 또는 0 ~ 65536 (2바이트)
MEDIUMINT[길이] : -800만 ~ +800만 또는 0 ~ 1600만 (3바이트)
INT[길이] : -21억 ~ +21억 또는 0 ~ 42억 (4바이트)
BIGINT[길이] : 무제한^^ 8바이트만큼 이라고 하면 맞음. (8바이트)
* [길이]는 zerofill을 위함이다. insert된 수의 자릿수가 적어야 효과가 나타나겠지..
* zerofill을 걸지 않았다면, [길이]는 넣지도 마라. zerofill 걸면 자동으로 unsigned가 된다.
* INT(4) ZEROFILL => 0005

FLOAT[길이, 소수] : 고정 소수점을 사용하는 작은 수 (4바이트)
DOUBLE[길이, 소수] : 고정 소수점을 사용하는 큰 수 (8바이트)
DECIMAL[길이,소수] : DOUBLE를 문자열로 저장 (길이 + 1 또는 2바이트)
* FLOAT(7,4) => -999.9999
------------------------------------------------------------------------------------------
MySQL 데이터 형식 (날짜형)
DATE : YYYY-MM-DD (3바이트)
DATETIME : YYYY-MM-DD HH:MM:SS (8바이트)
TIMESTAMP : insert나 update되면 자동으로 그 날짜와 시간이 저장됨.
TIME : HH:MM:SS (3바이트)
------------------------------------------------------------------------------------------
MySQL 데이터 형식 (열거형)
* 컬럼에 저장될 데이터가 몇가지로 정해져 있을 때(최대64개), 이를 저장하기 위한 데이터형이다.
ENUM : 정해진 몇가지의 값들 중, 하나만 저장 수 있다. (1 또는 2바이트)
SET : 정해진 몇가지의 값들 중, 여러 개를 저장할 수 있다. (1,2,3,4,8 바이트)
------------------------------------------------------------------------------------------
MySQL 데이터 형식 (이진 데이터 저장용 : 파일이나 암호화된 데이터 저장)
BINARY : 
VARBINARY : 
TINYBLOB : 
MEDIUMBLOB : 
LONGBLOB : 
------------------------------------------------------------------------------------------
속성 적용하기
cost DECIMAL(5, 2) NOT NULL
gender ENUM('M', 'F') default 'F'
------------------------------------------------------------------------------------------



반응형

'연구개발 > MYSQL' 카테고리의 다른 글

my.cnf  (0) 2014.07.29
show status로 mysql 모니터링 하기  (0) 2014.07.21
MySQL : GROUP_CONCAT 사이즈 조절하기  (0) 2014.06.25
Mysql bin-log 커졌을때 (bin-log 관리하기)  (0) 2014.05.23
slow query 분석  (0) 2014.05.23
반응형

MySQL

MySQL GROUP_CONCAT 사이즈 조절하기



GROUP_CONCAT 명령을 이용하여 데이터를 출력하기 위해 다음과 같은 쿼리를 사용했다. 


mysql> SELECT merge, title, GROUP_CONCAT(keyword SEPARATOR ';') FROM table_merge

_last GROUP BY merge, title into outfile "./table_merge_GROUP.txt";

Query OK, 43975 rows affected (6 min 31.93 sec)


워낙 데이터가 많아서시간이 꽤나 걸렸지만, 문제 없이 돌아갔고 생성된 파일을 확인해 보았다. 그런데.. 



GROUP_CONCAT으로 묶였던 데이터가...짤렸다. 


왜그런지 이유를 살펴보니, 바로 MySQL 세팅 상의 GROUP_CONCAT SIZE 문제.. 기본적인 사이즈가 어느정도로 설정되어 있는지 확인해 보자. 


mysql> show variables like "group_concat_max_len";

+------------------------------+-------+

| Variable_name              | Value |

+------------------------------+-------+

| group_concat_max_len | 1024  |

+------------------------------+-------+

1 row in set (0.00 sec)


기본적으로는 1024로 설정되어 있다. 따라서 그 이상의 크기를 갖는데이터는 짤렸던 것이다. 



  GROUP_CONCAT 사이즈 조절 명령


SET @@group_concat_max_len = 조절할 크기 ; 


mysql> set @@group_concat_max_len = 50240;

Query OK, 0 rows affected (0.00 sec)


mysql> show variables like "group_concat_max_len";

+------------------------------+--------+

| Variable_name               | Value |

+------------------------------+--------+

| group_concat_max_len | 50240 |

+------------------------------+--------+

1 row in set (0.00 sec)



사이즈가 변경된 것을 확인한후, 다시 GROUP_CONCAT을 사용하였고 그 결과는 



데이터가 많아서 그림에 다 나오진 않았지만 아무튼 또 하나 해결했다잉~  ㅋ. 



  SORT_BUFFER_SIZE 조절 명령


추가로 sort_buffer_size를 조절 하는 것을 적어 놓는다. 

sort_buffer_size 크기를 키우면, ORDER BY 나 GROUP BY 의 속도가 향상된다. 


mysql> show variables like "sort_buffer_size";

+------------------+--------+

| Variable_name      | Value  |

+------------------+--------+

| sort_buffer_size    | 524288 |

+------------------+--------+

1 row in set (0.00 sec)


기본값은 524288 이다. 


mysql> set @@sort_buffer_size = 924288;

Query OK, 0 rows affected (0.00 sec)


mysql> show variables like "sort_buffer_size";

+------------------+--------+

| Variable_name      | Value  |

+------------------+--------+

| sort_buffer_size   | 924288 |

+------------------+--------+

1 row in set (0.00 sec)


반응형

+ Recent posts

반응형