mysql镜像搭建

 

  

 

一、安装debian. 2

1.1 vmware准备... 2

1.2 vmware新建虚拟机... 2

1.3 vmware debian安装验证... 2

二、安装ftp.. 3

2.1 /etc/apt/sources.list 3

2.2 安装vsftpd. 3

2.3新建用户whoever/etc/vsftpd.chroot_list文件... 4

三、安装mysql 4

四、架设镜像(mysql数据库复制) 5

4.1架设镜像的前提... 5

4.2主库/etc/my.cnf文件修改... 5

4.3主库建账号、锁表、全备份... 5

4.4从库/etc/my.cnf文件修改... 6

4.5主库做快照,即操作系统层面tar整个数据目录... 6

4.6上述gz文件ftp至备服务器... 6

4.7备服务器启动、恢复数据库、设为SLAVE. 7

4.8部分数据库、数据表的镜像(复制) 8

4.9主备架构(镜像或者说数据库复制主备机)的验证... 8

4.10最实用的架mysql镜像(复制)的步骤... 9

五、镜像的mysql,日常管理。... 9

5.1主库管理... 9

5.2管理... 10

5.3镜像中的mysql主从不同步... 11

5.4镜像中的mysql二进制日志安全地清理... 11

5.5镜像中的mysql错误日志安全地清理... 12

5.6镜像中的mysql慢日志安全地清理... 12

六、镜像的mysql的异动管理... 12

6.1不想镜像了... 12

七、互为镜像的mysql 13

7.1主服务器设为SLAVE,作备库的备库。... 13

7.2双向复制的镜像环境,备份与恢复... 14

7.3两台镜像服务器虚拟出一个服务IP. 14

 

 

 

 

一、安装debian

 1.1 vmware准备

为了vmware中的debiandhcp:

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

通过ftpmysql-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字段值

形如:

masterbin.000001       98

#mysql>exit

#mysqladmin –uroot –ppwd shutdown    ---停掉主库mysql,以便OS考贝。

4.4从库/etc/my.cnf文件修改

从库为了各项配置与主库一致(尤其是innodb方面的参数必须一致,否则就乱),需把主库my.cnf考至从机/etc/目录,且改一个参数:

[mysqld]

server-id=2

 

OK

 

锦上添花1

为了更好的安全性,让从机的非supper级用户即普通用户不能直接在备机上做任何DMLDDL操作,可以加入:

read-only = 1      -----中间是划线

等下进入备机的mysql后,可能通过以下方式验证是否是真的read only了:

mysql>  show variables;

read_only     ON   -----中间是划线。对于普通用户已是read only

但一般用处不大,因为一般程序都通过supper级用户连mysql,还是可以DMLDDL

 

锦上添花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.3mysql>show master status;的数据

          -> MASTER_LOG_POS=98;  

----以上两参数值对应4.1show master status;所得的值。

Query OK, 0 rows affected (0.05 sec)

 

备服务器设为SLAVE:

mysql> start slave;        -----适应所有类型mysql表,如innodbmyISAM表等。

进入/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、修改原备份IP40.20

840.8加上40.5IP地址。

 

 

五、镜像的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字段显示有东西,那就是有问题了。

 

其实从库也不用进行任何特别的管理工作。

例,停从库,主库作DMLDDL操作,再启从库(类比从库各类故障,未能与主库持续地通信)

 

从库:

#/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 filelog 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值