版权声明:可以任意转载,转载时请务必标明原始出处和作者
信息
3 C5 ~. X, i$ d; Shttp://www.chedong.com/tech/mysql.html
% M1 _4 m, A% _
( [" P7 [5 i. f3 L s9 y% A
使用MY
SQL服务的一些经验,主要从以下几个方面考虑的MYSQL服务规划设计。
- ]+ L$ k% m: Q3 s* ^) [* \
1MYSQL服务的安装/配置的通用性;
1 t) V! u! E q2
系统的升级和
数据迁移方便性;
# K, m5 w0 }6 ~. d3 X7 g3备份和系统快速恢复;
) \7 J) _8 w/ `. I; d9 A" ]# s
8 T2 ?6 I, N1 J, o7 qMYSQL
服务器的规划
1 w* `. w# D: l( N* O4 U
=================
5 {5 ^/ }) n" x( k为了以后维护,升级备份的方便和数据的
安全性,最好将MYSQL
程序文件和数据分别安装在“不同的
硬件”上。
0 D6 s. B8 Q2 ]5 M+ C3 \) v
/
k2 Y* O% ~8 v& g- O( a
/usr%26lt;==
操作系统}==%26gt;
硬盘1
' `3 X+ h- j$ L4 K8 l! \
/home/mysql%26lt;==mysql应用程序
8 k* A: c% O7 h- M...
! q4 q. a. c, W" B: |1 }7 x# G; V* E
/data/app_1/%26lt;==应用数据和脚本}==%26gt;硬盘2
. L, `. O* n4 J: \0 R! a( l& g/data/app_2/
8 |3 f1 P% Q: Z/ J
/data/app_3/
{5 f* b/ j. ?. Y) |# W& h
% j1 m- d* v ~* O
mysql服务的安装和服务的启动:
7 y( X9 ]+ C% f; [+ \MYSQL一般使用当前STABLE的版本,尽量不使用--with-charset=选项,我感觉with-charset只在按字母排序的时候才有用,这些选项会对数据的迁移带来很多麻烦。
+ y4 @. t8 H2 q1 E8 Z
configure--prefix=/home/mysql
2 B2 {3 C! \9 |
make
, D3 r$ D/ j* _$ D8 v2 X, nmakeinstall
& J1 ~# X% v8 f2 n
+ b: q3 j8 I3 k V4 F1 s- A
服务的启动和停止
7 d. m6 C' k) {, t$ k, k: \# A
================
& b2 N1 _! B* q2 G5 V0 G! n
1复制缺省的mysql/var/mysql到/data/app_1/目录下,
2 ^9 j" T; S1 _" ^
2MYSQLD的启动脚本:start_mysql.sh
. k# q) r; Y, F! T
#!/bin/sh
8 _0 ]: H- ]1 h2 [3 _
rundir=`dirname"$0"`
! N U3 F- x- G* q& |* e
echo"$rundir"
* {! Z* w7 B9 `$ H/home/mysql/bin/safe_mysqld--user=mysql--pid-file="$rundir"/mysql.pid--datadir="$rundir"/var"$@"\
& d/ C! D0 ?% R; d-Omax_connections=500-Owait_timeout=600-Okey_buffer=32M--port=3402--socket="$rundir"/mysql.sock%26
& u( V$ e/ S$ B. x @0 ?2 ^! B
) x$ P/ [5 Z' I4 L" ~
注释:
) E9 \1 _& o: G1 d--pid-file="$rundir"/mysql.pid--socket="$rundir"/mysql.sock--datadir="$rundir"/var
?' \# d3 u$ E8 ^7 b目的都是将相应数据和应用临时文件放在一起;
+ X! t$ A6 B. l3 k2 ?' A
-O后面一般是服务器启动全局变量优化参数,有时候需要根据具体应用调整;
7 [2 e% w3 a+ S--port:不同的应用使用PORT参数分布到不同的服务上去,一个服务可以提供的连接数一般是MYSQL服务的主要瓶颈;
" x k6 c& F" U) M4 {' g9 F8 P6 ^2 J- l
修改不同的服务到不同的
端口后,在rc.local文件中加入:
; E7 l3 Y& S, _ \' W
/data/app_1/start_mysql.sh
8 y9 |* U" B% L! \) |/ K) p/data/app_2/start_mysql.sh
$ v N/ `2 B! {$ H5 c) [
/data/app_3/start_mysql.sh
6 }; e5 j' y" C
注意:必须写全路径
: X) R! c( J1 v" a& S6 q' p( r* L
( {+ X. p) A0 ]6 g* D' X4 z! ?3MYSQLD的停止脚本:stop_mysql.sh
' D2 u' {. c: U
#!/bin/sh
. \6 J( \. Y* i" V! ~) irundir=`dirname"$0"`
8 W( X& S2 ?. g2 E8 A/ f
echo"$rundir"
8 Q. K& a/ Q1 G6 p- v
/home/mysql/bin/mysqladmin-umysql-S"$rundir"/mysql.sockshutdown
. ~# n/ H' Q% x
! C/ \; x# H5 t5 M9 y, j5 G使用这个脚本的好处在于:
7 v% E: J+ Q+ Z3 |8 F6 m6 T) h( B) H1多个服务启动:只需要修改脚本中的--port=参数。单个目录下的数据和服务脚本都是可以独立打包的。
2 H5 E1 U1 {4 t, h; M8 v5 P% R% H% C2所有服务相应文件都位于/data/app_1/目录下:比如:mysql.pidmysql.sock,当一台服务器上启动多个服务时,多个服务不会互相影响。但都放到缺省的/tmp/下则有可能被其他应用误删。
* F7 R8 K+ c9 K! ]: {, n7 n. |3当硬盘1出问题以后,直接将硬盘2放到一台装好MYSQL的服务器上就可以立刻恢复服务(如果放到my.cnf里则还需要备份相应的配置文件)。
! f4 c( U O, A: Q5 m: B) i9 L- E2 U
服务启动后/data/app_1/下相应的文件和目录分布如下:
% P m2 g0 C% [5 L8 P \$ }
/data/app_1/
- M: j+ W V* u d8 d0 hstart_mysql.sh服务启动脚本
5 A# i% J' Y: J, J' ?9 i9 i
stop_mysql.sh服务停止脚本
! W7 G4 w/ }- `1 J. G4 xmysql.pid服务的进程ID
5 Q. ` J7 m+ U* K0 u- k; A
mysql.sock服务的SOCK
: F3 b8 j- d* ?2 I" `. _var/数据区
; `5 T, _% B+ r7 E* Y* amysql/用户库
# h& k3 }6 ?: e; X3 \7 Papp_1_db_1/应用库
0 u2 z$ {. \; _ w# d' m# Uapp_2_db_2/
1 n/ P7 o, ]. ]* _5 a& h
...
; R+ I0 x& b% N# M8 c/data/app_2/
5 a2 [! a1 _6 ?' h
...
! ~* v! Q% c w0 K- B- X: D; y8 i5 Q
% H. v$ B! F2 @" b( j
查看所有的应用进程ID:
. a; b! T. E8 O8 ?; y+ _8 _6 P
cat/data/*/mysql.pid
+ R( h. r1 M& L$ b& f% h* z/ R0 ?$ z: a4 |# y& c
查看所有
数据库的错误日志:
* F& Q$ B1 H3 [cat/data/*/var/*.err
' q. |: u0 D r9 ^/ _7 p$ X( V
9 ~4 k% i3 A+ V4 k* J+ I个人建议:MYSQL的主要瓶颈在PORT的连接数上,因此,将表
结构优化好以后,相应单个MYSQL服务的
CPU占用仍然在10%以上,就要考虑将服务拆分到多个PORT上运行了。
! i8 B& \7 [# W! X+ J* y
% q4 G1 M6 m4 r$ W2 B2 V% N4 A4 [- Y服务的备份
# S# s0 t+ J8 ?( v==========
/ p1 P. w' Y4 e4 @6 a0 e `
尽量使用MYSQLDUMP而不是直接备份数据文件,以下是一个按weekday将数据轮循备份的脚本:备份的间隔和
周期可以根据备份的
需求确定
4 ~+ P' N" C5 ^1 W. {$ W
/home/mysql/bin/mysqldump-S/data/app_1/mysql.sock-umysqldb_name│gzip-f%26gt;/path/to/backup/db_name.`data+%w`.dump.gz
/ X, v8 R4 ]0 c因此写在CRONTAB中一般是:
; d5 i4 _% J8 p. f3 ~7 o; q+ D/ j*6***/home/mysql/bin/mysqldump-S/data/app_1/mysql.sock-umysqldb_name│gzip-f%26gt;/path/to/backup/db_name.`data+\%w`.dump.gz
2 `* `/ T o: a5 B, {! q! a
注意:
/ S( n+ K" t- M1在crontab中'%'需要转义成'\%'
3 E$ L6 g9 n3 F, O6 M* B Q- O2根据日志统计,应用负载最低的时候一般是在早上6点
0 X: J& p& z$ H- s0 r" K/ v) L+ n- L* u, Z0 K a1 Q- T
先备份在本地然后传到远程的备份服务器上,或者直接建立一个数据库备份帐号,直接在远程的服务器上备份,远程备份只需要将以上脚本中的-S/path/to/msyql.sock改成-hIP.ADDRESS即可。
4 m% Y' S! m9 S: {) v9 ^3 c; n7 y" ^+ T8 m
数据的恢复和系统的升级
6 Q! l9 @( {! W% c
======================
: J% t8 | P ^. C" z2 n: {- E
日常维护和数据迁移:在数据盘没有被破坏的情况下硬盘一般是系统中寿命最低的硬件。而系统(包括操作系统和MYSQL应用)的升级和硬件升级,都会遇到数据迁移的问题。只要数据不变,先装好服务器,然后直接将数据盘(硬盘2)安装上,只需要将启动脚本重新加入到rc.local文件中,系统就算是很好的恢复了。
" _9 p5 J- v. s! z% o% b
1 j A) n* s, ~, A% {灾难恢复:数据本身被破坏的情况下确定破坏的
时间点,然后从备份数据中恢复。