Mysql Databases/Tables 자동으로 최적화(Optimize)하기

Mysql 데이터베이스/테이블을 자동으로 최적화(Optimize) 하기

Mysql을 사용하다 보면 종종 최적화 되지 않은 테이블을 발견할 때가 있습니다.

일일이 command line에서 `optimize table tablename`을 하는것이 귀찮았었는데,

구글링을 하다 보니 역시나 방법이 있더군요

 

1. 리눅스 스케줄러 데몬(Crond)을 사용

먼저 리눅스에서 제공하는 cron을 사용해서 특정한 시간에 최적화를 시작하도록 설정합니다.

 

2. mysqlcheck 명령

mysqlcheck 명령을 이용해서 특정 테이터베이스나 테이블 혹은 전체 데이터베이스에 대해서 analyze 또는 optimize가 가능합니다.

– 옵션

-o : optimize

-A : 전체 데이터베이스

-a : analyze

 

3. 사용방법

– 먼저 스케줄러를 수정합니다.

# crontab -e

– 적당한 줄에 아래 내용을 추가합니다.

0 1 * * * /usr/bin/mysqlcheck -o -uroot -p(비밀번호) (데이터베이스명) > /dev/null

 

– 예를들어 비밀번호가 1234, abc라는 데이터베이스를 최적화 하려면

0 1 * * * /usr/bin/mysqlcheck -o -uroot -p1234 abc > /dev/null

– 모든 데이터베이스를 최적화

0 1 * * * /usr/bin/mysqlcheck -A -o -uroot -p1234 > /dev/null

fax – res_fax_digium 설치 및 라이선스 획득

res_fax_digium 모듈 설치

 

asterisk 11.7.0을 기본설치하면 fax 를 사용하는 모듈이 없으므로 서비스가 불가능합니다.

fax를 서비스하기 위해서 해당 모듈을 다운로드 하고 라이선스를 등록하는 방법을 알아봅니다.

 

1. 라이선스

https://my.digium.com/en/login/register/ 로 이동해서 이메일 주소를 이용해 사용자 등록을 합니다.

에메일주소 인증을 해야 하기 때문에 사용하는 이메일을 정확히 입력합니다.

인증이 끝나고 http://www.digium.com/en/products/software/fax-for-asterisk 페이지로 이동합니다.

윗쪽에 Get 1 Free License 를 찾아서 클릭합니다.

fax
Checkout 을 누르면 0$에 구매가 가능합니다.

구매를 완료하면 주문내역 메일이 오고 잠시후에

Digium Free Fax For Asterisk License for Order: W???????? 이런제목의 메일이 오는데

내용을 살펴보면

Hello Digium Customer,

 

The following is your Free key for one (1) channel of Free Fax For Asterisk:

Key :

F??-N?????????

 

Instructions for using your key may be found at:

http://downloads.digium.com/pub/telephony/fax/README

 

If you require additional channels of fax capability within Asterisk, or if you require technical support, you may purchase paid keys of the Fax For Asterisk product from Digium.  Digium does not provide technical support of any kind for Free Fax For Asterisk.

Thank you for using Asterisk.

 

저기 중간에 키가 무료 라이선스 키입니다.

라이선스키를 얻었으면 등록을 시작합니다.

 

# cd /root
# wget http://downloads.digium.com/pub/register/x86-32/register
# chmod 500 register
# ./register

Digium Product Registration – Version 3.0.5
Copyright (C) 2004-2007, Digium, Inc.
Use the ‘-l’ option to see license information for software
included in this program.

Please select a category

1 – Digium Products
2 – Cepstral Products

0 – Quit

Your Choice: 1

 

You selected 1, Digium Products
Please select a product

1 – Asterisk Business Edition
2 – Asterisk Business Edition C Expansion
3 – Asterisk For Smart Cube
4 – Asterisk For Smart Cube Expansion
5 – G.729 Codec
6 – High Performance Echo Can
7 – Skype For Asterisk
8 – Fax for Asterisk
9 – Free Fax for Asterisk
10 – Vestec Speech Engine
11 – Digium Phone Module for Asterisk

0 – Quit

Your Choice: 9

 

You selected 9, fax for Asterisk

Please enter your Key-ID: (여기에 키를 입력)

 

2. res_fax

# wget http://downloads.digium.com/pub/telephony/fax/res_fax/asterisk-1.6.2.0/x86-64/res_fax-1.6.2.0_1.3.0-x86_64.tar.gz
# tar xfz res_fax-1.6.2.0_1.3.0-x86_64.tar.gz
# cd res_fax-1.6.2.0_1.3.0-x86_64
# cp res_fax.so /usr/lib/asterisk/modules
# cp res_fax.conf /etc/asterisk/

 

3. 파일다운로드(res_fax_digium)

 

fax

 

http://downloads.digium.com/pub/telephony/fax/res_fax_digium/asterisk-11.0/x86-64/

위 링크에서 시스템에 맞는 파일을 다운로드 합니다.

이전에 포스팅 대로 ubuntu 12.04버전이라면 res_fax_digium-11.0_1.3.1-generic_64.tar.gz 파일을 다운로드 합니다.

 

4. 압축해제/복사

# wget http://downloads.digium.com/pub/telephony/fax/res_fax_digium/asterisk-11.0/x86-64/res_fax_digium-11.0_1.3.1-generic_64.tar.gz
# tar xfz res_fax_digium-11.0_1.3.1-generic_64.tar.gz
# cd res_fax_digium-11.0_1.3.1-generic_64
# cp res_fax_digium.so /usr/lib/asterisk/modules
# cp res_fax_digium.conf /etc/asterisk/

asterisk 11.7.0 소스 컴파일 및 라이브러리 설치 등

asterisk 11.7.0 소스 컴파일 및 라이브러리 설치

 

asterisk 11.7.0 을 설치하기 위해 소스를 다운로드하고 컴파일을 합니다.

홈페이지는 http://www.asterisk.org/ 이곳이며,

현재 공식버전은 13 까지 나왔습니다만, 여기서는 11.7을 기준으로 합니다.

 

asterisk 11.7.0

 

1. asterisk 11.7.0 다운로드

모든 버전의 asterisk를 확인하기 위해서 다운로드 페이지의 All Asterisk Versions 를 클릭합니다.

http://www.asterisk.org/downloads/asterisk/all-asterisk-versions

필요한 버전을 찾아 설치할 서버에 다운로드 합니다.

 

#cd /usr/local/src

#wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz

#tar xfzp asterisk-11-current.tar.gz

 

2. 설치시 필요한 패키지 추가설치

apt-get install ncurses-base ncurses-bin ncurses-term libncurses5-dev

apt-get install libxml2 libxml2-dev

apt-get install sqlite3 libsqlite3-dev

 

3. 소스 컴파일

#./configure

asterisk2

이렇게 나오면 성공~

#make

#make install

+—- Asterisk Installation Complete ——-+
+ +
+ YOU MUST READ THE SECURITY DOCUMENT +
+ +
+ Asterisk has successfully been installed. +
+ If you would like to install the sample +
+ configuration files (overwriting any +
+ existing config files), run: +
+ +
+ make samples +
+ +
+—————– or ———————+
+ +
+ You can go ahead and install the asterisk +
+ program documentation now or later run: +
+ +
+ make progdocs +
+ +
+ **Note** This requires that you have +
+ doxygen installed on your local system +
+——————————————-+

#make samples

 

4. 시작

#asterisk -cvvv

 

5. /etc/init.d/asterisk 서비스 등록

설치폴더에 보면 contrib/init.d/ 가 있는데 살펴보면 rc.debian.asterisk 파일이 있다

이 파일을 /etc/init.d/로 복사를 한다.

#cp contrib/init.d/rc.debian.asterisk /etc/init.d/asterisk

#chmod 755 /etc/init.d/asterisk

#/etc/init.d/asterisk start

 

asterisk 11 운영을 위한 Ubuntu 12.10 설치

asterisk 환경을 위한 우분투 12.10 설치

 

asterisk-ubuntu

 

asterisk를 Centos 5.x, Centos 6.3, ubuntu 12.10 등에 설치해 보았는데

패키지로 설치하기에는 우분투 12.10 의 apt-get 이 너무 편했으므로 우분투로 운영을 하기로 했습니다.

기존 centos만 사용하다가 우분투로 패키지 관리를 하니 신세계네요

 

1. 우분투 12.10 LTS 파일 받기

– http://ftp.daum.net/ubuntu-releases/12.10/ubuntu-12.10-server-amd64.iso

– 위 경로로 iso 파일을 받아 CD로 굽거나 부팅가능한 USB를 생성시켜준다. USB 생성시에는 아래 URL에서 프로그램을 다운받아 사용해도 된다.

http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

– OPENSSH, LAPM 패키지만 선택 후 설치를 진행

– 설치시에는 한국어 지원을 선택하지 않았습니다. 개발을 UTF-8 환경으로 하기 때문에 필요가 없었습니다.

 

2. root 로 접속하기 위해서 비번변경, 접속

– sudo passwd root

– logout

 

3. ssh 포트 변경

– 기본포트인 22번을 그냥 놔두면 귀찮은 일이 생기므로 일단 변경한다.

– vim /etc/ssh/sshd_config

– Port 2222

– /etc/init.d/ssh restart

– 방화벽에 해당 포트를 등록합니다.

#ufw allow 2222

 

4. 리눅스 사용자/그룹 추가

– groupadd erpgroups -g 1002

– useradd asterisk -u 1001 -g 1002

 

5. 추가 패키지 설치

– asterisk 운영과 함께 개발한 그룹웨어를 운영하기 위한  부분으므로 생략 가능합니다.

– apt-get install build-essential

– apt-get install imagemagick

– apt-get install php-pear php5-mcrypt php5-dev

– php용 메일파서(mailparse) 설치

a) wget http://pecl.php.net/get/mailparse-2.1.6.tgz

b) cd mailparse-2.1.6

c) phpize

d) make && make install

e) vim /etc/php5/mods-available/mailparse.ini

+ 아래 내용 추가

+ extension=mailparse.so

f) cd /etc/php5/conf.d

g) in -s ../mods-available/mailparse.ini 30-mailparse.ini

+ 링크명을 30-mailparse.ini 으로 하는 이유는 해당 익스텐션을 가장 마지막에 로드하기 위해서이다. 30- 은 적절하게 늘려야한다.

+ mailparse 라이브러리가 사용하는 함수가 있는데, 메일파서가 먼저 로드되면 해당 라이브러리를 찾을 수 없다는 오류가 발생하여 php가 중단된다

6. 아파치 설정

– apache2.conf를 열어서 ServerName abc.domain.com 추가(해당 시스템에 맞는 도메인을 추가)합니다.

– vim /etc/apache2/envvars

a) export APACHE_RUN_USER=asterisk

b) export APACHE_RUN_GROUP=erpgroups

apt-get update :: Err http://kr.archive.ubuntu.com/…

우분투에서 apt-get update 를 실행했는데,

Err http://kr.archive.ubuntu.com/ubuntu/dists/….

W: Failed to fetch http://security.ubuntu.com/…

이런 오류가 출력된다면 /etc/apt/sources.list 파일을 수정한다.

 

우분투 버전이 14.10 이상 나온 시점에서 12.10을 사용하려니 이런 오류가 나오는 것 같다

지금 시점에서는 12.10은 old-releases 이니깐

 

1. 기존 파일 백업

# cd /etc/apt

# cp sources.list sources.list.bak

 

2. URL을 수정해준다

# sed -i ‘s,http://.*ubuntu.com,http://old-releases.ubuntu.com,g’ sources.list

 

3. apt-get update

패키지 업데이트를 다시한다.

# apt-get update

lftp를 이용한 백업과 미러링(mirror), 한글파일명 전송

rsync를 이용해서 미러링이 불가능한 상황에 lftp를 사용해서 미러링이 가능하여 찾아보았다.

 

아래와 같이 디렉토리가 있다 가정한 상황에서

A서버의 /home/source_dir

B서버의 /home/target_dir

 

1. A서버 -> B서버로 mirror, A서버에서 실행

lftp -u (username) ftp://(address) (-p포트) -e “mirror –reverse /home/source_dir /home/target_dir”

 

2. A서버 -> B서버로 mirror, B서버에서 실행

lftp -u (username) ftp://(address) (-p포트) -e “mirror /home/source_dir /home/target_dir”

 

3. 옵션

–delete 리모트 사이트에 없는 파일은 삭제한다

–only-existing 타겟 사이트에 존재하는 파일만 다운로드한다

–only-newer 새로운 파일만 다운로드한다

–no-recursion 서브디렉토리를 무시한다

-reverse 역방향 mirror

 

4. 한글문제(euc-kr)

utf-8 환경에서 한글파일명을 전송할 경우 문제가 발생되었다.

해결을 위해서 /etc/lftp.conf 파일을 수정한다.

man lftp 로 찾아보면 아래와 같은 설정이 있다.

set file:charset utf-8
set ftp:charset euc-kr

위 두줄을 /etc/lftp.conf 파일에 추가해준다.

mysql strip_tags

delimiter ||

DROP FUNCTION IF EXISTS strip_tags||
CREATE FUNCTION strip_tags( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE sstart INT UNSIGNED;
DECLARE ends INT UNSIGNED;
SET sstart = LOCATE(‘<‘, x, 1);
REPEAT
SET ends = LOCATE(‘>’, x, sstart);
SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ;
SET sstart = LOCATE(‘<‘, x, 1);
UNTIL sstart < 1 END REPEAT;
return x;
END;
||
delimiter ;

웹에 있는 이미지를 읽어서 ImageView에 출력

[code java]
package yell.exam01;

import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import yell.exam01.R;

public class test_network extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_network);
}

public void mOnClick(View v) {

EditText et = (EditText) findViewById(R.id.textURL);
ImageView iv = (ImageView) findViewById(R.id.imageview1);

if (et.getText().toString() != null) {
try {
HttpGet httpget = new HttpGet(et.getText().toString());
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpget);
InputStream is = new BufferedHttpEntity(response.getEntity()).getContent();

Bitmap bit = BitmapFactory.decodeStream(is);
iv.setImageBitmap(bit);

String path = Environment.getDataDirectory().getAbsolutePath();
path += “/data/yell.exam01/files/test.png”;

Log.d(“YELL”, path);
FileOutputStream fos = new FileOutputStream(path);
bit.compress(Bitmap.CompressFormat.PNG, 100, fos);
}
catch (Exception e) {
// TODO: handle exception
Log.d(“YELL”, e.getMessage());
}
}
}
}
[/code]

쓰레드를 사용해서 웹페이지 소스 가져오기

[code java]
package yell.exam01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import yell.exam01.R;

public class test_network extends Activity {

downloadThread mThread;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_network);
}

public void mOnClick(View v) {

EditText et = (EditText) findViewById(R.id.textURL);
ImageView iv = (ImageView) findViewById(R.id.imageview1);

if (et.getText().toString() != null) {
mThread = new downloadThread(et.getText().toString());
mThread.start();
}
}

class downloadThread extends Thread {
String mAddr;

public downloadThread(String addr) {
// TODO Auto-generated constructor stub
mAddr = addr;
}

@Override
public void run() {
// TODO Auto-generated method stub
HttpGet httpget = new HttpGet(mAddr);
DefaultHttpClient client = new DefaultHttpClient();
try {
client.execute(httpget, mResHandler);
}
catch (Exception e) {
// TODO: handle exception
}
}

ResponseHandler mResHandler = new ResponseHandler() {
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
// TODO Auto-generated method stub

Log.d(“YELL”, “읽기 스트림 시작”);

StringBuilder html = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = null;
while ((line = br.readLine()) != null) {
html.append(line + “\n”);
}
br.close();

Log.d(“YELL”, “끗~ 메시지 보냄”);
Log.d(“YELL”, html.substring(0, 1000).toString());

Message message = mAfterDown.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString(“result”, html.toString());
message.setData(bundle);
mAfterDown.sendMessage(message);
}
catch (Exception e) {
// TODO: handle exception
}

return html.toString();
}
};

Handler mAfterDown = new Handler() {
public void handleMessage(android.os.Message msg) {
String sResult = msg.getData().getString(“result”);
TextView tv = (TextView) findViewById(R.id.textview_result);
tv.setText(sResult);
};
};
}
}
[/code]