mysql增量备份

小量的数据库我们可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,我们就不太可能每天进行一次完整备份了,而且改成每周一次完整备份,每天一次增量备份类似这样的备份策略。增量备份的原理就是使用了mysql的二进制日志,所以我们必须启用二进制日志功能。

一、增量备份

1、比如我们在星期天下午11点做一次完整备份:

  1. mysqldump –single-transaction –flush-logs –master-data=2 –all-databases > fullbackup_sunday_11_PM.sql

在sql文件中我们会看到两行:
— Position to start replication or point-in-time recovery from
— CHANGE MASTER TO MASTER_LOG_FILE=’bin-log.000002′, MASTER_LOG_POS=107;
第二行包含了我们需要的信息,是指备份后所有的更改将会保存到bin-log.000002二进制文件中。
2、然后在星期一下午11点我们来做一次增量备份:

  1. mysqladmin flush-logs

这时将会产生一个新的二进制日志文件bin-log.000003,bin-log.000002则保存了自星期天下午11点到现在的所有更改,我们只需要把这个文件备份到安全的地方就行了。然后星期二我们又做增量备份,还是执行同样的命令,这时我们保存bin-log.000003文件。

二、恢复备份

比如星期三中午12点出现了故障,这时需要恢复,我们首先导入星期天的完整备份:

  1. mysql < fullbackup_sunday_3_AM.sql

接着我们导入星期一和星期二的增量备份:

  1. mysqlbinlog bin-log.000002 bin-log.000003 | mysql

这时我们已经恢复了所有备份数据,我们还可以找到bin-log.000004,进一步恢复最新的数据。

shell脚本每天自动统计网站访问日志

写了个shell脚本,可以用来统计每天的访问日志,并发送到电子邮箱,方便每天了解网站情况。
脚本统计了:
1、总访问量
2、总带宽
3、独立访客量
4、访问IP统计
5、访问url统计
6、来源统计
7、404统计
8、搜索引擎访问统计(谷歌,百度)
9、搜索引擎来源统计(谷歌,百度)
继续阅读shell脚本每天自动统计网站访问日志

Windows 2008配置IIS PHP MySQL

一、下载软件
1、php-5.3.18-Win32-VC9-x86.msi
下载地址:http://windows.php.net/downloads/releases/php-5.3.18-Win32-VC9-x86.msi
2、mysql-5.5.28-win32.msi
下载地址:http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.28-win32.msi
二、IIS安装
1、打开开始-管理工具-服务器管理
2、单击“角色”,在右边点击“添加角色”
3、勾选“Web 服务器(IIS)”
Windows
4、角色服务勾选”CGI”
Windows
5、在浏览器中输入http://localhost/,如果出现如下页面,则表示iis正常。
Windows
二、MySQL安装
1、运行mysql-5.5.28-win32.msi程序。
2、在Choose Setup Type选择Typical。
Windows
3、这里选择”standard configuration”
Windows
4、勾选“Include Bin Directory in Windows PATH”
Windows
5、输入mysql root用户密码。
Windows
6、点击Execute开始配置。
三、测试MySQL
1、在cmd里输入mysql -uroot -p,输入密码能登录的就表示正常。
2、启动和停止MySQL的命令是:net start mysql和net stop mysql
四、安装PHP服务
1、运行php-5.3.18-Win32-VC9-x86.msi程序。
2、定义安装的目录。
Windows
3、勾选”IIS FastCGI”
Windows
4、选择需要安装的模块,一般默认就行。
Windows
5、在网站目录新建index.php,内容为:

用浏览器打开如出现如下界面,则正常。
Windows

MySQL集群安装与配置

MySQL Cluster 是 MySQL 适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上做这个最简单。下面我们简单介绍MySQL Cluster如何安装与配置。
基本设定
管理(MGM)节点:192.168.0.111
MySQL服务器(SQL)节点:192.168.0.110
数据(NDBD)节点”A”:192.168.0.112
数据(NDBD)节点”B”:192.168.0.113

一、mysql集群安装

mysql的集群安装可以有三种方式,一是直接下载二进制使用,二是使用rpm安装,三是源码编译。我们这里使用第一种安装。
1、每个节点做相同的操作

  1. cd /tmp
  2. wget http://cdn.mysql.com/Downloads/MySQL-Cluster-7.2/mysql-cluster-gpl-7.2.8-linux2.6-i686.tar.gz
  3. tar xzf mysql-cluster-gpl-7.2.8-linux2.6-i686.tar.gz
  4. mv mysql-cluster-gpl-7.2.8-linux2.6-i686 /usr/local/mysql

注意:这里下载的是32位的二进制包,如果你的系统是64位,需要下载64位的包。
2、存储节点和SQL节点安装

  1. groupadd mysql
  2. useradd -g mysql mysql
  3. /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql
  4. chown -R root /usr/local/mysql
  5. chown -R mysql /usr/local/mysql/data
  6. chgrp -R mysql /usr/local/mysql
  7. cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

二、节点配置

1、配置存储节点和SQL节点

  1. vi /etc/my.cnf
  2. 类似于:
  3. # Options for mysqld process:
  4. [MYSQLD]                       
  5. ndbcluster                      # run NDB engine
  6. ndb-connectstring=198.168.0.111  # location of MGM node
  7.  
  8. # Options for ndbd process:
  9. [MYSQL_CLUSTER]                 
  10. ndb-connectstring=198.168.0.111  # location of MGM node

2、配置管理节点

  1. mkdir /var/lib/mysql-cluster
  2. cd /var/lib/mysql-cluster
  3. vi config.ini
  4.  
  5. config.ini文件应类似于:
  6.  
  7. # Options affecting ndbd processes on all data nodes:
  8. [NDBD DEFAULT]   
  9. NoOfReplicas=2    # Number of replicas
  10. DataMemory=80M    # How much memory to allocate for data storage
  11. IndexMemory=18M   # How much memory to allocate for index storage
  12.                   # For DataMemory and IndexMemory, we have used the
  13.                   # default values. Since the "world" database takes up
  14.                   # only about 500KB, this should be more than enough for
  15.                   # this example Cluster setup.
  16.  
  17. # TCP/IP options:
  18. [TCP DEFAULT]     
  19. portnumber=2202   # This the default; however, you can use any
  20.                   # port that is free for all the hosts in cluster
  21.                   # Note: It is recommended beginning with MySQL 5.0 that
  22.                   # you do not specify the portnumber at all and simply allow
  23.                   # the default value to be used instead
  24.  
  25. # Management process options:
  26. [NDB_MGMD]                     
  27. hostname=198.168.0.111           # Hostname or IP address of MGM node
  28. datadir=/var/lib/mysql-cluster  # Directory for MGM node logfiles
  29.  
  30. # Options for data node "A":
  31. [NDBD]                         
  32.                                 # (one [NDBD] section per data node)
  33. hostname=198.168.0.112         # Hostname or IP address
  34. datadir=/usr/local/mysql/data   # Directory for this data node’s datafiles
  35.  
  36. # Options for data node "B":
  37. [NDBD]                         
  38. hostname=198.168.0.113       # Hostname or IP address
  39. datadir=/usr/local/mysql/data   # Directory for this data node’s datafiles
  40.  
  41. # SQL node options:
  42. [MYSQLD]                       
  43. hostname=198.168.0.110           # Hostname or IP address
  44.                                 # (additional mysqld connections can be
  45.                                 # specified for this node for various
  46.                                 # purposes such as running ndb_restore)

三、首次启动节点

1、启动管理节点

  1. /usr/local/mysql/bin/ndb_mgmd –configdir=/var/lib/mysql-cluster -f /var/lib/mysql-cluster/config.ini

2、启动数据节点
首次启动需要–initial参数初始化,下一次启动就不需要了。

  1. /usr/local/mysql/bin/ndbd –initial

3、启动SQL节点

  1. /usr/local/mysql/bin/mysqld_safe  &

4、检查状态
如果一切正常,执行命令 /usr/local/mysql/bin/ndb_mgm -e show应该会输出类似信息:

[root@localhost mysql-cluster]# /usr/local/mysql/bin/ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.112 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0, Master)
id=3 @192.168.0.113 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.111 (mysql-5.5.27 ndb-7.2.8)

[mysqld(API)] 1 node(s)
id=4 @192.168.0.110 (mysql-5.5.27 ndb-7.2.8)

四、测试服务是否正常

在SQL节点上执行如下数据库操作:

  1. /usr/local/mysql/bin/mysql -uroot -p
  2. mysql> create database clusterdb;use clusterdb;
  3. mysql> create table simples (id int not null primary key) engine=ndb;
  4. mysql> insert into simples values (1),(2),(3),(4);
  5. mysql> select * from simples;

如果出现:
+—-+
| id |
+—-+
| 1 |
| 2 |
| 4 |
| 3 |
+—-+
则表示工作正常。

五、安全关闭和重启

1、关闭mysql集群,可在管理节点在执行如下命令:

  1. /usr/local/mysql/bin/ndb_mgm -e shutdown

2、重启管理节点

  1. /usr/local/mysql/bin/ndb_mgmd –configdir=/var/lib/mysql-cluster -f /var/lib/mysql-cluster/config.ini

3、重启数据节点

  1. /usr/local/mysql/bin/ndbd

参考:http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html

使用shell脚本自动配置mysql主从

一直觉得配置mysql的主从挺费时间,现在花了一点时间写了个全自动配置mysql主从的shell脚本。如有什么错误,欢迎提出。
1、在使用之前需要在主服务器上编辑/etc/my.cnf文件,在[mysqld]的下面加入下面代码:

  1. log-bin=mysql-bin
  2. server-id=1
  3. innodb_flush_log_at_trx_commit=1
  4. sync_binlog=1
  5. binlog-do-db=centos
  6. binlog_ignore_db=mysql

server-id=1中的1可以任定义,只要是唯一的并且比从服务器的server-id小就行。
binlog-do-db=centos是表示binlog只记录centos数据库的日志,即只同步centos。
binlog_ignore_db=mysql表示忽略备份mysql。
不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。
2、在从服务器编辑配置文件my.cnf,在[mysqld]下面加入:

  1. server-id=2

2可以自己定义,只要保证唯一的并且比主的server-id大就行。
3、脚本分为两个,一个是配置mysql主服务器的shell脚本,另一个是远程连接mysql从服务器的exp脚本。
bash shell脚本:master.sh

  1. #!/bin/bash
  2.  
  3. export mysqlbinpath="/usr/bin" #mysql路径
  4.  
  5. #variables for master
  6. export master_mysql_root_passwd="root"  #mysql主数据库的root密码
  7. export replication_user="copydb"  #用于复制的mysql用户
  8. export replication_passwd="123456" #mysql用户copydb的密码
  9. export replication_db="centos" #需要同步的数据库名
  10. export master_ip="8.8.8.8"    #mysql主服务器IP
  11.  
  12. #variables for slave
  13. export slave_mysql_root_passwd="123456" #mysql从数据库的root密码
  14. export slave_ip="8.8.4.4"               #从服务器IP地址
  15. export slave_ssh_root_passwd="123456"  #mysql从数据库的ssh的root密码
  16.  
  17. #create replication user
  18. {
  19. ${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} <<EOF
  20. CREATE USER ‘$replication_user’@’$slave_ip’ IDENTIFIED BY ‘$replication_passwd’;
  21. GRANT REPLICATION SLAVE ON *.* TO ‘$replication_user’@’$slave_ip’ IDENTIFIED BY ‘$replication_passwd’;
  22. FLUSH TABLES WITH READ LOCK;
  23. select sleep(10);
  24. EOF
  25. } &
  26.  
  27. #export the database sql data.
  28. ${mysqlbinpath}/mysqldump -uroot -p${master_mysql_root_passwd} ${replication_db} > ${replication_db}.sql
  29.  
  30. #get the master status info.
  31. export status=`${mysqlbinpath}/mysql -uroot -p${master_mysql_root_passwd} -e"show master statusG"`
  32. export binlogname=`echo "$status" | grep "File" | awk ‘{print $2}’`
  33. export position=`echo "$status" | grep "Position" | awk ‘{print $2}’`
  34.  
  35. #create database on slave server.
  36. export createdb="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} -e’drop database if exists ${replication_db};create database ${replication_db};’"
  37.  
  38. #import database sql data on slave server.
  39. export importsql="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} ${replication_db} < /root/${replication_db}.sql"
  40.  
  41. #deploy the slave mysql server.
  42. export change_master="${mysqlbinpath}/mysql -uroot -p${slave_mysql_root_passwd} -e’stop slave;CHANGE MASTER TO MASTER_HOST="${master_ip}",MASTER_USER="${replication_user}",MASTER_PASSWORD="${replication_passwd}",MASTER_PORT=3306,MASTER_LOG_FILE="${binlogname}",MASTER_LOG_POS=${position},MASTER_CONNECT_RETRY=10;start slave;select sleep(3);show slave statusG’"
  43.  
  44. yum -y install expect
  45. ./slave.exp

expect脚本:slave.exp

  1. #!/usr/bin/expect -f
  2. spawn scp $env(replication_db).sql root@$env(slave_ip):/root
  3. expect {
  4.     "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)r";}
  5.     "yes/no" {send "yesr"; exp_continue;}
  6.   }
  7. expect eof
  8.  
  9. spawn ssh root@$env(slave_ip) "$env(createdb);$env(importsql);$env(change_master)"
  10. expect {
  11.     "*assword" {set timeout 300; send "$env(slave_ssh_root_passwd)r";}
  12.     "yes/no" {send "yesr"; exp_continue;}
  13.       }
  14. expect eof

使用方法:
上传master.sh和slave.exp两个文件到mysql主服务器,执行master.sh脚本开始配置mysql主从。最后执行完输出的从服务器状态中的 Slave_IO_Running和Slave_SQL_Running都为Yes的话,则说明主从已经配置成功,否则失败。

使用注意:
master.sh文件中的23行有一个select sleep(10)语句,10是指锁表10秒,这个时间根据导出sql数据所需时间定,如果导出sql数据超过10秒,则需要调大锁表时间,否则可能会有用户写入数据而使导致主从配置失败。

监控mysql主从健康状态shell脚本

  1. #!/bin/bash
  2. #define mysql variable
  3. mysql_user="root"
  4. mysql_pass="123456"
  5. email_addr="[email protected]"
  6.  
  7. mysql_status=`netstat -nl | awk ‘NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}’`
  8. if [ "$mysql_status" == "Yes" ];then
  9.         slave_status=`mysql -u${mysql_user} -p${mysql_pass} -e"show slave statusG" | grep "Running" | awk ‘{if ($2 != "Yes") {print "No";exit 1}}’`
  10.         if [ "$slave_status" == "No" ];then
  11.                 echo "slave is not working!"
  12.                 [ ! -f "/tmp/slave" ] && echo "Slave is not working!" | mail -s "Warn!MySQL Slave is not working" ${email_addr}
  13.                 touch /tmp/slave
  14.         else
  15.                 echo "slave is working."
  16.                 [ -f "/tmp/slave" ] && rm -f /tmp/slave
  17.         fi
  18.         [ -f "/tmp/mysql_down" ] && rm -f /tmp/mysql_down
  19. else
  20.         [ ! -f "/tmp/mysql_down" ] && echo "Mysql Server is down!" | mail -s "Warn!MySQL server is down!" ${email_addr}
  21.         touch /tmp/mysql_down
  22. fi

此脚本首先判断mysql服务器是否运行,如果正常,继续判断主从,否则发邮件告警,只发一次。
判断主从状态是判断IO和SQL线程是否都为yes,如果不是则发邮件通知,只发一次。

利用mysql二进制日志进行mysql数据库的恢复

对于需要确保mysql数据库完整性的网站,mysql的二进制日志至关重要。比如你做了mysql数据库的主从备份,你认为这应该能确保mysql从数据库是最新的内容了,这的确没错,但有一种情况,比如你误删除了数据,或者被黑客入侵而清除了数据库,这时mysql从服务器也会跟主数据库同步,这是你不想看到的,但数据确实没了。但是如果你每天进行了数据库的完整备份,而且mysql的二进制日志还在的话,这将有可能恢复最新的数据。下面介绍方法。
1、开启二进制日志
在使用二进制日志恢复数据库时,请确保你已经开启二进制日志,检查my.cnf文件是否存在log-bin=mysql-bin。
2、定期完整备份
你还需要间隔一定的时间做数据库的完整备份,只有这样你才有可能快速的恢复最新数据。
3、查看备份时间
查看你备份的时间,如dedecmsv57gbksp1.sql,取最后一行:– Dump completed on 2012-11-08 11:11:48。
4、导出二进制日志
暂时关闭网站,防止新数据写入,导出二进制日志:

  1. mysqlbinlog mysql-bin.000001 -d dedecmsv57gbksp1 –start-datetime="2012-11-08 11:11:48" >binlog.sql

5、调整binlog.sql
编辑binlog.sql,删除误操作的语句。
6、导入数据
重建数据库dedecmsv57gbksp1,导入dedecmsv57gbksp1.sql,接着导入binlog.sql。

使用expect实现scp ssh自动输入密码登录

expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录。
下面给出scp和ssh的使用示例:
1、scp

  1. expect -c "
  2.   spawn scp [email protected]:/root/1.log /root
  3.   expect {
  4.     "*assword" {set timeout 300; send "passwordr";}
  5.     "yes/no" {send "yesr"; exp_continue;}
  6.   }
  7.   expect eof"

2、ssh

  1. #!/bin/bash
  2. expect -c "
  3. spawn ssh [email protected] "ls;"
  4. expect {
  5.     "*assword" {set timeout 300; send "passwordr";}
  6.     "yes/no" {send "yesr"; exp_continue;}
  7.       }
  8. expect eof
  9.             "

nagios监控mysql主从状态

使用nagios监控mysql主从可以有两种方法,一种是使用nagios的nrpe插件来执行远程的shell脚本,并把数据发回监控服务器分析,二种方法是使用snmp的extend功能来执行远程脚本。我们这里介绍后一种方法。

一、mysql从服务器设置

1、mysql从服务器用户添加
执行如下语句添加用户:

  1. mysql> GRANT REPLICATION CLIENT ON *.* TO monitor@localhost IDENTIFIED BY ‘PassWord’;

2、下载check-mysql-slave.pl脚本

  1. cd /usr/local/bin/
  2. wget http://devops.webres.wang/wp-content/uploads/2012/10/check-mysql-slave.pl
  3. chmod +x check-mysql-slave.pl

3、在mysql从服务器上配置extend mysql-slave
在/etc/snmp/snmpd.conf文件的末尾添加如下代码:

  1. extend mysql-slave /usr/local/bin/check-mysql-slave.pl –user monitor –pass PassWord –sock /var/lib/mysql/mysql.sock

注意相关参数修改为自己的。
之后重载snmp:

  1. service snmpd reload

二、监控服务器设置

1、下载check_snmp_extend.sh脚本

  1. mkdir /usr/local/nagios/libexec.local
  2. cd /usr/local/nagios/libexec.local
  3. wget http://devops.webres.wang/wp-content/uploads/2012/10/check_snmp_extend.sh
  4. chmod +x check_snmp_extend.sh

2、定义USER10变量
在文件/usr/local/nagios/etc/resource.cfg添加如下变量:

  1. $USER10$=/usr/local/nagios/libexec.local

3、定义check_snmp_extend命令
在/usr/local/nagios/etc/objects/commands.cfg添加:

  1. define command{
  2. command_name check_snmp_extend
  3. command_line $USER10$/check_snmp_extend.sh $HOSTADDRESS$ $ARG1$
  4. }

4、定义监控mysql主从服务
在主机配置文件,如/usr/local/nagios/etc/objects/devops.webres.wang.cfg中添加如下service(注意,此www.cnetos.bz.cfg文件已经在nagios.cfg配置文件中包含)

  1. define host{
  2.         use                     linux-server
  3.         host_name               devops.webres.wang
  4.         alias                   devops.webres.wang
  5.         address                 142.4.33.74
  6.         }
  7. ……
  8. ……
  9. define service{
  10. ## This is an example service configured as
  11. ## extend servicename /path/to/service-check.sh
  12. ## on remote.server in /etc/snmp/snmpd.conf
  13. use generic-service
  14. host_name devops.webres.wang
  15. service_description mysql slave status
  16. check_command check_snmp_extend!mysql-slave
  17. }

参考:http://www.logix.cz/michal/devel/nagios/