目 录
2.3新建用户whoever和/etc/vsftpd.chroot_list文件... 4
4.5主库做快照,即操作系统层面tar整个数据目录... 6
4.9主备架构(镜像或者说数据库复制主备机)的验证... 8
一、安装debian
1.1 vmware准备
为了vmware中的debian能dhcp:
vmware 在windows网上邻居属性中的两个虚拟网卡:设为dhcp.
c:>ipconfig /renew
1.2 vmware新建虚拟机
vmware中:
operating system设为: Linux (Ubuntu) 或者other linux.
Network connection设为: Use bridged networking
disk capacity设为: 10G (大于10G好象很容易坏)
内存设为:680M
CD-ROM:Use ISO image:debian-40r0-i386-CD-1
注意,安装程序一定要顺利走过DHCP detect,否则,考虑重建、另命新名debian虚拟机、重启windows OS等。
安装过程中:
键入 hostname, domain name (如liukan.com)
Guided - use entire disk...
Separate /home,/usr,/var, and /tmp partitions (磁盘空间划分)
除Web server外,各组件全都安装。因为apache等下再装新版本。
Modify smb.conf to use WINS settings from DHCP?选YES
X server:设为1280X768
Install the GRUB boot load to the master boot record? 选YES
debian图形界面的进入:startx 回车即可。
1.3 vmware debian安装验证
以root身份进入terminal,
# ifconfig
如果能自动分到一个与主机同一网段的IP。说明OK。
二、安装ftp
2.1 改/etc/apt/sources.list
debian1:/etc/apt# vim sources.list
/
deb http://debian.cn99.com/debian/ etch main contrib
deb-src http://debian.cn99.com/debian/ etch main contrib
deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib
2.2 安装vsftpd
//更新debian OS 数据库
debian1:/etc/apt# apt-get update
///看有没有vsftp程序包可以用来安装,有可能会出错,但没问题,照样可以下载
debian1:/etc/apt# apt-cache search vsftpd
下载vsftpd程序:
debian1:/etc/apt# apt-get install vsftpd
debian1:/etc/apt# vim /etc/vsftpd.conf
listen=YES
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
dirmessage_enable=YES
chown_uploads=YES
chown_username=whoever
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
//
/etc/init.d/vsftpd restart ----重启ftp
debian1:/etc/apt# netstat -an|grep 21 ----查ftp 21号端口是否已工作
2.3新建用户whoever和/etc/vsftpd.chroot_list文件
尝试在本虚拟机上登录ftp:
debian1:/etc/apt# ftp 192.168.22.55(localhost)
结果报错:
Connected to 192.168.22.55.
500 OOPS: vsftpd: cannot locate user specified in 'chown_username':whoever
那么 :
debian1:/etc/apt# useradd -g root -d /home/whoever whoever
再尝试登录ftp:
debian1:/etc/apt# ftp 192.168.22.55(localhost)
还是报错:
could not open chroot() list file:/etc/vsftpd.chroot_list
那么:
debian1:/etc/# vim vsftpd.chroot_list ----在/etc/目录下
#
root
#
///OK!!!
三、安装mysql
通过ftp把mysql-5.0.45-linux-i686.tar.gz传入debian中(/home/oracle)
# cp mysql-5.0.45-linux-i686.tar.gz /usr/local/
# groupadd mysql
# useradd mysql -g mysql
#passwd mysql
# tar xfv mysql-5.0.45-linux-i686.tar.gz
# mv mysql-5.0.45-linux-i686 mysql
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
# cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql ----安装
# chown -R root .
# chown -R mysql data
# chown -R mysql data/.
# chgrp -R mysql .
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
如果不能启动,查看/usr/local/mysql/data/主机名.err
在另一虚拟机也装上mysql
主机上建一库,建一表,插数据(用于等下的镜像验证)。
四、架设镜像(mysql数据库复制)
4.1架设镜像的前提
……所有参与镜像的数据库,各表都要有主键,否则可能一夜间数据全丢。
……有瞬间大规模DML操作的应用,其数据库不适合做镜像,因为当大规模DML时,如果是单机,只需10分钟跑完所有过程,但镜像则要1小时,还很可能死机,mysql会死掉。所以,象报表这样的数据库不适合做镜像,只能采用定时的增量恢复。
4.2主库/etc/my.cnf文件修改
主库:
[mysqld]
server-id=1
log-bin=/usr/local/mysql/log-bin/bin_db
----指定mysql二进制日志文件存放的路径/usr/local/mysql/log-bin/,指定二进制文件名的前缀bin_db(全名是形如:bin_db.000001),指定它即表启用二进制日志
//
重启主库服务器的mysql.
4.3主库建账号、锁表、全备份
主机建一用户,用于从备机登录到主机
mysql> grant replication slave, reload, super, select on *.* to lk@"%" identified by 'lk';
mysql>flush privileges;
/用户是否建好,可在从机上验证:
//usr/local/mysql/bin/mysql –ulk –p –h 主机IP ----能在从机上登录主机,则OK,例:
# /usr/local/mysql/bin/mysql -ulk -plk -h192.168.22.140
/
主机中执行下面语句:
mysql> flush tables with read lock; ---此时不能写数据库了
mysql> show master status;
记下file position字段值
形如:
#mysql>exit
#mysqladmin –uroot –ppwd shutdown ---停掉主库mysql,以便OS考贝。
4.4从库/etc/my.cnf文件修改
从库为了各项配置与主库一致(尤其是innodb方面的参数必须一致,否则就乱),需把主库my.cnf考至从机/etc/目录,且改一个参数:
[mysqld]
server-id=2
OK
锦上添花1:
为了更好的安全性,让从机的非supper级用户即普通用户不能直接在备机上做任何DML、DDL操作,可以加入:
read-only = 1 -----中间是中划线
等下进入备机的mysql后,可能通过以下方式验证是否是真的read only了:
mysql> show variables;
…
read_only ON -----中间是下划线。对于普通用户已是read only了
…
但一般用处不大,因为一般程序都通过supper级用户连mysql,还是可以DML、DDL。
锦上添花2:
transaction_isolation = READ-UNCOMMITTED
把从库的事务隔离级别设为它(READ-UNCOMMITTED即脏读),可以防止从库的读与从库的应用从主库来的事务日志之间抢夺table锁的冲突。
4.5主库做快照,即操作系统层面tar整个数据目录
主机中:
#cd /usr/local/mysql
#tar cvzf mysqldata.gz data (把data目录全tar下)
4.6上述gz文件ftp至备服务器
备机中:
先停备机mysql:
#/usr/local/mysql/bin/mysqladmin –uroot –p shutdown
# ftp 主服务器名(IP)
ftp>bin
ftp>get data.gz
data.gz文件考至/usr/local/mysql/下,
//不需要了:再把主机的数据库全备份文件也ftp过来
#mv data data_pre (原来data/的改名)
#tar xvzf data.gz
#cd data
#find .|grep master.info
#find .|grep relay-log.info
找到后全删。
4.7备服务器启动、恢复数据库、设为SLAVE
备机上,启动mysql:
#/usr/local/mysql/bin/mysqld_safe –user=mysql &
如果以前是别的机的slave,则:
mysql> reset slave;
mysql> stop slave;
设为slave:
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.22.74',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password_for_repl',
-> MASTER_LOG_FILE=' masterbin.000001', ----4.3节mysql>show master status;的数据
-> MASTER_LOG_POS=98;
----以上两参数值对应4.1节show master status;所得的值。
Query OK, 0 rows affected (0.05 sec)
备服务器设为SLAVE:
mysql> start slave; -----适应于所有类型mysql表,如innodb、myISAM表等。
进入/usr/local/mysql/data/中,看是不是新生成了一个文件:
master.info
有才正常。且此文本文件中的内容与上面几行配置的值是一样的。
mysql> show slave status \G ---从库中看slave相关属性的值。有才正确。
/OK大功告成!
别忘了,主库中:
#/usr/local/mysql/bin/mysqld_safe –user=mysql & ----因为先前被关掉服务了
mysql> unlock tables; --此时又开始能写数据库
但此时不能忙着启动相应的web、应用服务器,不能对外提供服务。因为还没验证好。
4.8部分数据库、数据表的镜像(复制)
//如果是mysql数据库服务器上的所有库、表都参与镜像,此节完全跳过,直接进入4.9节。
备服务器先停mysql:
#/usr/local/mysql/bin/mysqladmin –uroot –p shutdown
备服务器再以启某库某表复制、禁某库某表复制的选项,启动mysql:
禁某一库:
#/usr/local/mysql/bin/mysqld_safe --user=mysql --replicate_ignore_db=db1 &
禁某两库:
#/usr/local/mysql/bin/mysqld_safe --user=mysql --replicate_ignore_db=db1
--replicate_ignore_db=db2 &
也可在my.cnf配置文件中设定:
replicate-do-db = db1 #同步的数据库,如果有多个数据库,每个数据库一行
replicate-do-db = db2 #同步db2数据库
replicate-ignore-db = mysql #不同步的数据库,如果有多个数据库,每个数据库一行
///OK了!就这么简单!
4.9主备架构(镜像或者说数据库复制主备机)的验证
-----A方式验证,主库中:
mysql> use test; ---进入test数据库
mysql> create table tb1 (c1 char(10));
mysql> insert into tb1 values(‘aa’);
从库中看有无反应:
mysql>use test;
mysql>show tables; ---看是否有相应的新表存在,存在才是对的,因为镜像就是自动复制主库的东西。
mysql>select * from tb1; ----看到的记录集应该与主服务器完全一致才是。
此时可以启动相应的web、应用服务器,开始对外提供服务。
-----B验证方式:
主库:
mysql> show master status \G; ------留意其:
File: bin.000014
Position: 615281967
从库马上:
mysql> show slave status \G; ------留意其:
Master_Log_File: bin.000014
Read_Master_Log_Pos: 615281967
主从在此两值上能完全对应,或从库因后敲,所以Read_Master_Log_Pos略大。而从库的:
Last_Errno: 0 ----非0则已不同步
Last_Error: ----非空则有某处同步错
4.10最实用的架mysql镜像(复制)的步骤
1、屏蔽告警
2、在40.6窗口一上锁住所有表:FLUSH TABLES WITH READ LOCK;
3、在40.6窗口二上备份5个数据库,
/usr/local/mysql/bin/mysqldump -uroot -p'rOOt@ys@))&' --single-transaction -R --master-data=2 --databases Dev_authserver Dev_dataserver kd_admin mysql youshangportal ys_org > mysql_db_mirror_20090901.sql
并记下同步位置:
mysql> show master status; -----记下file position字段值
形如:
masterbin.000001 98
4、在40.8上恢复5个数据库。
5、在40.6窗口一上解锁表:UNLOCK TABLES
6、配置同步。
7、修改原备份IP为40.20
8、40.8加上40.5的IP地址。
五、镜像的mysql,日常管理。
5.1主库管理
主库因为没有任何设置,所以主库无需任何特别的管理。
例:
停止再启动主库(类比主服务器死机、重启等情况)
#/usr/local/mysql/bin/mysqladmin –uroot –p shutdown
#/usr/local/mysql/bin/mysqld_safe –user=mysql &
进入主库并作DML操作:
#/usr/local/mysql/bin/mysql –uroot –p
mysql> use test;
mysql> insert into tb1 values(‘bb’);
进入从机的mysql看是否已正常把主库的最新信息复制过来:
#/usr/local/mysql/bin/mysql –uroot –p
mysql> use test;
mysql> select * from tb1 ;
OK,结果集中出现了最新的记录行’bb’.
同样地,可在主库上作DDL操作,看从库的反应,是否与主库同步了。
5.2从库管理
日常查看:
Mysql>show slave status \G
如果Last_Errno不为0, Last_Error字段显示有东西,那就是有问题了。
其实从库也不用进行任何特别的管理工作。
例,停从库,主库作DML、DDL操作,再启从库(类比从库各类故障,未能与主库持续地通信):
从库:
#/usr/local/mysql/bin/mysqladmin –uroot –p shutdown
确认从库mysql已停:
# netstat –antl | grep 3306 ---应该找不到相应的行了
主库:
mysql> use test;
mysql> create table tb2 (c1 char(10));
mysql> insert into tb2 values(‘111’);
从库再启mysql:
#/usr/local/mysql/bin/mysqld_safe –user=mysql &
进入从机的mysql
#/usr/local/mysql/bin/mysql –uroot –p
mysql> use test;
mysql> show tables; ----刚在主库建的表tb2看到了!
mysql> select * from tb2; ---刚在主库新表tb2加入的数据看到了!
在从库的错误日志中,出现类似的:
080710 5:44:29 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=/usr/local/mysql/data/ysdb-B-relay-bin' to avoid this problem.
080710 5:44:29 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
……
这是正常的。不必理会。
太简了。呵呵。。。。so easy!
5.3镜像中的mysql主从不同步
从库中:
SQL> show slave status \G
如果有Error,则停从库的slave,等两分钟再启slave:
SQL> stop slave;
1--2分钟后又启从库slave:
SQL> start slave;
如果还不行,如果是主键重复造成不能同步,即从库相应表已有相应记录行,又要应用与此记录行主键相重复的insert语句,则可跳过当前的DML:
SQL> stop slave;
SQL> set global sql_slave_skip_counter=1;
SQL> start slave;
有可能要反复两次才能OK。直至SQL>show slave status \G 没有错才行。
可以考虑停从库slave功能半天时间。
5.4镜像中的mysql二进制日志安全地清理
自动:
vim /etc/my.cnf
【msyqld】
expire_logs_day=20 -----保留近20天的日志文件,系统自动清理
手动:
#date
----获服务器当前时间
mysql>PURGE MASTER LOGS BEFORE '2008-09-22 12:00:00' ;
-----此时间是当前删除动作执行的前一天。因为隔了一天时间,相关日志早已同步至slave机了。是安全的。
-----如果有slave服务器正在读取我们正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。
------自动清理二进制日志的shell脚本:
##########Start clear the binlog before five days:
syear=`date -d '-5 day' +%Y`
smonth=`date -d '-5 day' +%m`
sday=`date -d '-5 day' +%d`
sdate=`echo "$syear"-"$smonth"-"$sday" "23:59:59"`
echo $sdate
/usr/local/mysql/bin/mysql -uroot -p020674 <
PURGE MASTER LOGS BEFORE '$sdate'
EOF
####END
注意从库日志删除:
有可能从库的二进制日志用上面的语句删不掉,此时可以直接删操作系统文件:
进入binlog所在目录,mv相关文件至另一目录,如果没有任何问题,过两天删掉。
# mv bin.0* ./prelog_dir/ ----一次移多文件。
不可随意直接删除binlog!,小心mysql起不来!
5.5镜像中的mysql错误日志安全地清理
一般错误日志在/usr/local/mysql/data/下,文件名为:机器名.err
此文件名不可随意删除。
只能 # tail –n100机器名.err >机器名.err 以瘦身。实际上 机器名.err会变成0字节。
5.6镜像中的mysql慢日志安全地清理
文件名不能删。否则mysql可能下次起动不了。
只能 # tail –n100 slow.log > slow.log 以瘦身。实际上slow.log会变成0字节。
六、镜像的mysql的异动管理
6.1不想镜像了
主库因为没作任何设置,所以可以不动,当然,为镜像而建的数据库用户,可以delete掉它。
从库改主库(主库被洪水冲了),从库中:
Mysql>show slave status; ----如果不是”Empty set……” ,表明此库为slave库。
mysql>stop slave ;
mysql>reset slave ; ----清理从库的slave.
重启mysql
mysql>show slave status; ----什么都看不到了,清掉了。
/此时从库彻底摘掉从库、备机的帽子,作为独立的主机了。
如果上述方法出问题,可以再考虑下面的,下面的方法并不是很可取:
mysql> stop slave;
#/usr/local/mysql/bin/mysqladmin –uroot –p shutdown
#cd /usr/local/mysql/data
#mv master.info master.info_pre
#mv relay-log.info relay-log.info_pre
重启mysql.
七、互为镜像的mysql
7.1主服务器设为SLAVE,作备库的备库。
其实只需在4.7节的基础上做以下一步就好:
主库机上先确定没有从库的相关配置:
Mysql>show slave status;
输出结果要是Empty set….才是对的。否则执行6.1节的操作.或者:
Mysql>stop slave;
备库机上获得下面信息:
Mysql> show master status;
mysql-bin.000007 383378
记下从库log file和log pos以便下面用。
主库机,设为备库的备库(slave):
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.22.26', -----一定要是从库的IP,别写错了。
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password_for_repl',
-> MASTER_LOG_FILE='mysql-bin.000007',
-> MASTER_LOG_POS=383378;
----以上两参数值对应本节先前show master status;所得的值。
Query OK, 0 rows affected (0.05 sec)
mysql> start slave;
进入/usr/local/mysql/data/中,看是不是新生成了一个文件:
master.info
有才正常。且此文本文件中的内容与上面几行配置的值是一样的。
mysql> show slave status; ---从库中看slave相关属性的值。有才正确。
/OK大功告成!
别忘了如同4.8节,验证。看主库是不是备库的备库。
……
7.2双向复制的镜像环境,备份与恢复
试验如:
先在其中一机(主库机)中备份db1数据库
#/usr/local/mysql/bin/mysqldump –uroot –p020674 -R db1 >db1_bak.sql
再在主库机insert一记录,并在从库上也看一下是否同步过去了。再在主库上恢复成原来的:
#/usr/local/mysql/bin/mysql –uroot –p020674 db1
看主、从库是否没有了刚才插入的那条记录。
果然没了,即主库机和从库机都恢复成原状了。。。。好简单!!!!!
7.3两台镜像服务器虚拟出一个服务IP
在OS层实现(高可用集群),而非mysql应用层。
-----------mysql高手就是这样炼成的!
///The end.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15119715/viewspace-677117/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15119715/viewspace-677117/