Archive: 2016年9月26日

destoon文件目录详解

这是目前找到最详细的Destoon程序文件及目录说明
( /代表的是目录 ├ 代表的是文件 )

/about关于我们页面
├index.html关于我们
├copyright.html版权隐私
├contact.html联系方式
├agreement.html用户协议
/ad广告
├index.php广告入口
/admin系统核心后台管理
/image后台风格
/template后台模板
├404.tpl.php404日志管理模板文件
├admin.tpl.php管理员管理-管理员管理模板文件
├admin_add.tpl.php管理员管理-添加管理员模板文件
├admin_edit.tpl.php管理员管理-修改管理员模板文件
├admin_right.tpl.php管理员管理-权限&面板模板文件
├area.tpl.php地区管理-地区管理模板文件
├area_add.tpl.php地区管理-地区添加模板文件
├banip.tpl.php禁止IP-IP禁止模板文件
├banip_ban.tpl.php禁止IP-IP解锁模板文件
├banword.tpl.php词语过滤模板文件
├category.tpl.phpXX分类-管理分类模板文件
├category_add.tpl.phpXX分类-添加分类模板文件
├category_copy.tpl.phpXX分类-分类复制模板文件
├category_edit.tpl.phpXX分类-分类修改模板文件
├city.tpl.php城市分站-分站管理模板文件
├city_edit.tpl.php城市分站-分站修改模板文件
├count.tpl.php系统首页-统计信息模板文件
├data.tpl.php数据维护-数据导入模板文件
├data_config.tpl.php数据维护-数据导入-配置修改模板文件
├data_view.tpl.php新数据模板文件
├database.tpl.php数据维护-数据库备份模板文件
├database_comment.tpl.php数据维护-修改表注释模板文件
├database_execute.tpl.php数据维护-执行SQL模板文件
├database_import.tpl.php数据维护-数据库恢复模板文件
├database_move.tpl.php数据维护-数据互转模板文件
├database_open.tpl.php数据维护-数据库恢复模板文件
├database_process.tpl.php数据维护-显示进程模板文件
├database_replace.tpl.php数据维护-备份文件内容替换模板文件
├dialog.tpl.php提示信息模板文件
├doctor.tpl.php系统体检模板文件
├fetch.tpl.php单页采编-采编规则模板文件
├fetch_edit.tpl.php单页采编-添加规则模板文件
├fields.tpl.phpXX模块设置-定义字段-管理字段模板文件
├fields_add.tpl.phpXX模块设置-定义字段-添加字段模板文件
├fields_edit.tpl.phpXX模块设置-定义字段-修改字段模板文件
├footer.tpl.php公共页脚模板文件
├header.tpl.php公共页头模板文件
├index.tpl.php后台首页框架模板文件
├ip.tpl.phpip转地址模板文件
├keylink.tpl.phpXX模块设置-管理链接模板文件
├keyword.tpl.php搜索记录模板文件
├left.tpl.php后台左侧分页模板文件
├log.tpl.php后台日志模板文件
├login.tpl.php后台登录模板文件
├main.tpl.php系统首页模板文件
├md5.tpl.php文件校验结果模板文件
├md5_add.tpl.php添加文件校验模板文件
├menu.tpl.php右上角菜单模板文件
├module.tpl.php模块管理模板文件
├module_add.tpl.php添加模块模板文件
├module_edit.tpl.php修改模块模板文件
├msg.tpl.php系统提示信息模板文件
├mymenu.tpl.php定义面板模板文件
├password.tpl.php修改密码模板文件
├product.tpl.php
├property.tpl.php
├property_edit.tpl.php
├question.tpl.php问题验证模板文件
├repeat.tpl.php重名检测模板文件
├scan.tpl.php木马扫描模板文件
├search.tpl.php后台搜索模板文件
├setting.tpl.php网站设置模板文件
├side.tpl.php侧边栏模板文件
├skin.tpl.php模板风格-风格管理模板文件
├skin_add.tpl.php模板风格-风格管理-添加css模板文件
├skin_edit.tpl.php模板风格-风格管理-修改css模板文件
├tag.tpl.php模板风格-标签向导模板文件
├tag_dict.tpl.php
├tag_preview.tpl.php模板风格-标签向导-标签预览模板文件
├template.tpl.php模板风格-模板管理模板文件
├template_add.tpl.php模板风格-模板管理-添加模板模板文件
├template_edit.tpl.php模板风格-模板管理-修改模板模板文件
├type.tpl.php分类管理模板文件
├upload.tpl.php上传记录-选择分表模板文件
├upload_part.tpl.php上传记录-上传记录模板文件
├word.tpl.php编辑助手模板文件

├404.inc.php404日志配置文件
├admin.class.php后台sql操作配置文件
├admin.inc.php管理员管理配置文件
├admin_check.inc.php后台权限判断配置文件
├area.inc.php地区管理配置文件
├banip.inc.php禁止IP管理配置文件
├banword.inc.php词语过滤管理配置文件
├category.inc.phpXX分类管理配置文件
├city.inc.php城市分站配置文件
├config.inc.php后台管理配置文件
├data.inc.php数据维护-数据导入配置文件
├database.inc.php数据维护备份配置文件
├destoon.inc.php系统信息配置文件
├doctor.inc.php系统体检配置文件
├fetch.inc.php单页采编配置文件
├fields.inc.phpXX模块设置-定义字段配置文件
├global.func.php后台全局函数配置文件
├html.inc.php站点更新配置文件
├index.inc.php系统首页配置文件
├ip.inc.phpIP配置文件
├keylink.inc.phpXX模块设置-管理链接配置文件
├keyword.inc.php搜索记录配置文件
├log.inc.php后台日志配置文件
├login.inc.php后台登录配置文件
├logout.inc.php后台退出配置文件
├md5.inc.php木马扫描-文件校验配置文件
├menu.inc.php后台菜单配置文件
├module.inc.php模块管理配置文件
├mymenu.inc.php自定义面板配置文件
├property.inc.php
├question.inc.php问题验证配置文件
├repeat.inc.php重名检测配置文件
├scan.inc.php木马扫描-木马扫描配置文件
├search.inc.php后台搜索配置文件
├setting.inc.php基本设置配置文件
├skin.inc.php模板风格-风格管理配置文件
├split.inc.php
├tag.inc.php模板风格-标签向导配置文件
├template.inc.php模板风格配置文件
├type.inc.php
├unzip.class.phpzip解压
├update.inc.php系统更新配置文件
├upload.inc.php上传记录配置文件
├word.inc.php编辑助手配置文件

/announce
/api系统及第三方接口
/kf在线客服
/map电子地图
/oauth一键登录
/pay支付接口
/stats第三方统计
/trade担保交易
/ucenterUCenter
/archiver档案文件
/brand品牌
/buy求购
/comment用户
/company公司
/down下载
/exhibit展会
/extend扩展
/feedrss订阅
/file文件
├backup数据库备份
├cache缓存
├captcha验证码字体
├chat聊天记录
├config配置
├data导数据导入
├email邮件列表
├flashFlash文件
├font中文字体
├image公用图片
├ipdataIP数据库
├log日志
├md5MD5镜像
├mobile手机列表
├scriptjavascript
├sessionSESSION
├setting配置数据
├temp临时目录
├update系统更新
├upload上传文件
/gift积分换礼
/group团购
/guestbook留言本
/include核心类库
├bmp.func.php缩略图
├cache_eaccelerator.class.php缓存加速
├cache_file.class.php生成缓存文件 $dc = new dcache;$dc->pre;$dc->time;
├cache_memcache.class.phpmemcache缓存文件
├cache_shmop.class.phpshmop缓存文件
├cache_xcache.class.phpxcache缓存文件
├cache.func.php从数据库查询到数据并写入缓存
├captcha.class.php验证码
├city.inc.php城市
├convert.func.php字符转义
├db_access.class.phpaccess数据库
├db_mssql.class.phpmssql数据库
├db_mysql.class.phpmysql数据库
├db_mysqli.class.phpmysqli数据库
├db_mysqlirw.class.php读取mysqli缓存数据库
├db_mysqlrw.class.php读取mysql缓存数据库
├defend.inc.php防护配置文件
├fields.func.php字段函数文件
├file.func.php文件及文件夹的操作函数
├ftp.class.phpftp类文件
├global.func.php全局函数
├image.class.php图像相关类(包括验证码)
├index.htm.php引导后台首页
├ip.func.phpip相关类
├mail.func.php邮件相关函数
├module.func.php模块函数文件
├post.func.phppost传递验证
├property.func.php财务函数文件
├remote.class.php文件转存类
├rewrite.inc.php重写相关
├seo.inc.phpseo相关
├session.class.phpsession
├sphinx.class.phpsphinx
├sql.func.phpsql一些方法
├tag.func.php标签
├template.func.php生成模板
├tree.class.php树函数
├type.class.php类型函数
├update.inc.php更新点击文件
├upload.class.php上传类
/install安装程序
/invest招商
/jc集采
/job人才
/know知道
/lang语言包
/link友情链接
/mall商城
/member会员
/news咨询
/photo图库
/poll行业票选
/quote行情
/sell供应
/module功能模块
/article文章模块
/brand品牌模块
/buy求购模块
/company公司模块
/down下载模块
/exhibit展会模块
/extend扩展模块
/group团购模块
/info信息模块
/job人才模块
/know知道模块
/mall商城模块
/member会员模块
/photo图库模块
/quote行情模块
/sell供应模块
/special专题模块
/video视频模块
/jc集采模块 [以此为例]
/admin集采管理
/template集采管理模板
├edit.tpl.php添加修改集采模板文件
├html.tpl.php生成静态网页模板文件
├index.tpl.php生成动态网页模板文件
├move.tpl.php移动分类模板文件
├setting.tpl.php模块设置模板文件

├config.inc.php模块配置文件配置文件
├html.inc.php页面生成配置文件
├index.inc.php后台模块首页配置文件
├install.inc.php安装文件配置文件
├menu.inc.php模块菜单配置文件
├remkdir.inc.php创建模块配置文件
├setting.inc.php模块更新配置文件
├uninstall.inc.php模块卸载配置文件

├common.inc.php公共配置配置文件
├global.func.php集采公共函数
├index.htm.php静态首页
├index.inc.php动态首页配置文件
├jc.class.php集采数据库操作类
├list.htm.php静态列表页
├list.inc.php动态列表页配置文件
├my.inc.php集采函数文件配置文件
├price.inc.php询价价格配置文件
├search.inc.php搜索配置文件
├show.htm.php静态展示页
├show.inc.php动态展示页配置文件
├task.inc.php任务分配文件配置文件

/sitemap网站地图
/skin风格皮肤
├default默认风格
├default/image图片文件
├default/style.cssCSS文件
/special专题
/spread推广
/template模板文件
├default默认模板
├default/index.htm首页模板
/video视频
/vote投票
/wap手机网
/upgrade系统升级
├404.php404错误入口
├admin.php后台入口
├ajax.phpajax入口
├city.php城市获取入口
├common.inc.php系统初始化
├config.inc.php系统配置
├index.php动态首页
├index.html静态首页
├search.php搜索入口
├upload.php上传入口
├version.inc.php版本控制

CentOS上如何把Web服务器从Apache换到Nginx

阿里云服务器上, 1G内存的配置,但用了一段时间,感觉Apache有些撑不出,想了想,还是换到目前最热门的Nginx吧。 这里把整个过程记录下来,与大家共享。

Nginx简介:

Nginx是一个高性能的HTTP服务器和反向代理服务器, 最大的优点是节省资源,适用于处理高并发的请求。

1. Nginx最初是按照反向代理设计的,和Apache不同, nginx关心如何处理url,而不是文件!

2. Apache 是个基于进程处理的web服务器,如果同时有多个请求,必须要启动多个进程来处理。 这样在高负载的情况下,资源的消耗和响应的速度都会有很大的问题。 而Nginx是个基于事件(event)的异步处理模式, 下面是Nginx的一个简单的示意图,有一个Master进程,Maste进程负责系统配置,管理socket,以及管理一个或是多个Worker进程。 而Worker进程接收和处理来自用户(浏览器)的请求。一般来讲,一个worker进程可以同时处理上千个用户的连接请求。每个worker进程采用异步的,基于event的方式来处理用户的请求。对于HTML的静态页面,Nginx会自行来处理,但对于PHP,JSP, Python等动态页面,Nginx是通过FastCGI(或者SCGI,UWSGI)来把动态页面的请求交给相应的处理程序来处理。

nginx

安装Nginx

需要注意的是,在CentOS的YUM的基础的容器中,并没有nginx和php-fpm的RPM包。这两个RMP包在epel的容器中, 虽然你可以从官网下载RPM包来安装,但我个人建议,如果你的CentOS/Redhat中没有加入YUM的epel容器,还是先把这个yum容器加上去比较好,以后可以省无数的折腾。epel具体的安装方法,我在 Redhat/CentOS 软件安装之RPM和YUM 这篇文章中有介绍。

yum的容器库中加入了epel容器后,在CentOS上安装Nginx就非常简单,运行下面的命令就可以了。

1
1
yum install nginx

安装玩以后,会发现Nginx的配置文件放在 /etc/nginx目录下, 一般在缺省的情况下,web的root目录会在/usr/share/ngxin/html中。

安装完nginx以后,我们要测试一下是否安装成功了.

如果之前已经安装过Apache的话,先要把Apache的服务停掉。

1
2
1
/etc/init.d/httpd stop            #停掉apache服务
1
chkconfig httpd off              #开机重启后,apache服务不再启动

这时候你在浏览器上输入 http://主机ip, 如果能出现nginx的测试页面 “Test page for the nginx http server on EPEL”就说明nginx已经正常运行了。

安装php-fpm

PHP-FPM (PHP-FastCGI Process Manager) 是目前最常用的一个PHP FastCGI的实现。通俗的讲,这个模块在Nginx和PHP之间桥梁,使之可以互相通信和交换。

安装及启动过程如下:

1
2
3
4
5
1
yum install php-fpm
 
1
/etc/init.d/php-fpm start
 
1
chkconfig php-fpm on

下一步是确认一下,nginx和php-fpm是否已经正常运行. 执行 netstat -tunlp 命令,会看到大约如下的一个界面。

可以看到nginx在监听80端口,而php-fpm在监听9000端口。

Screenshot

设置Nginx 和 PHP-FPM

我们假定这个主机上有两个网站,一个是aaa.com, 普通的PHP站点, 一个是bbb.com,为wordpress的博客。 我们就讨论一下在这种情况下,如何设置nginx.

首先为站点建立相应的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
mkdir

 

1
-p  /
1
var
1
/www/aaa/html
 
1
mkdir

 

1
-p /
1
var
1
/www/bbb/html
 
1
mkdir

 

1
-p /
1
var
1
/log/nginx/aaa
 
1
mkdir

 

1
-p /
1
var
1
/log/nginx/bbb
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/www/aaa/html
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/wwww/bbb/html
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/log/nginx/aaa
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/log/nginx/bbb

为了保证整个配置更加清晰,我们尽量不修改主配置文件/etc/nginx/nginx.conf , 而是在在/etc/nginx/conf.d目录下建立两个文件,一个是aaa.conf, 一个是bbb.conf

其中aaa.conf的内容如下 (aaa是一个普通的php网站): 参考于: http://wiki.nginx.org/PHPFcgiExample

查看源代码打印帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
1
server {
1
 
1
listen 80 default_server;                 #当输入ip时,会访问aaa.com
1
 
1
server_name www.aaa.com aaa.com *.aaa.com;  #这个应该是最好的写法了         
 
1
 
1
access_log /
1
var
1
/log/nginx/aaa/access.log;   #access_log属于ngx_http_log_module的设置, 缺省level为info
1
 
1
error_log

 

1
/
1
var
1
/log/nginx/aaa/error.log;     #
1
error_log
1
属于core module, 缺省的level是error 
 
1
 
1
location / {
1
    
1
root /
1
var
1
/www/aaa/html;
1
    
1
index index.php index.html index.htm;     #由于是PHP类型的动态页面为主,所以把index.php放在前面效率会更高些
1
   
1
# try_files 
1
$uri

 

1
$uri
1
/ /index.php?
1
$args
1
;   #普通php网站因为没有rewrite的话,这个不需要
1
 
1
}
 
1
 
1
error_page 404 /404.html;         #error_page errcode uri (也就是说出现了404错误,会请求/404.html)
1
 
1
location = /404.html {            #这是一个典型的location
1
   
1
root /
1
var
1
/www/aaa/html;
1
 
1
}
 
1
 
1
# redirect server error pages to the 
1
static

 

1
page /50x.html
1
 
1
#
1
 
1
error_page 500 502 503 504 /50x.html;
1
 
1
location = /50x.html {
1
 
1
root /
1
var
1
/www/aaa/html;
1
 
1
}
 
1
 
1
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
1
 
1
# 因为我们不用Nginx做Apache的反向代理,所以不需要这个
1
 
1
#location ~ \.php$ {
1
 
1
# proxy_pass http:
1
//127.0.0.1;
1
 
1
#}
 
1
 
1
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
1
 
1
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
1
 
1
# 这种写法可以防止把恶意程序伪装成.jpg之类的攻击,(其实有个更简单的方法,就是把php.ini中的cgi.fix_pathinfo=0,但有时候简单的修改cgi.fix_pathinfo会造成有的php脚本出错)
 
1
 
1
location ~ [^/]\.php(/|$) {
1
   
1
root /
1
var
1
/www/aaa/html;
1
   
1
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
1
   

 

1
   
1
if

 

1
(!-f 
1
$document_root
1
$fastcgi_script_name
1
) {
1
     
1
return

 

1
404;
1
   
1
}
1
   
1
#try_files 
1
$uri

 

1
=404;         #这个try_files说明:对于.php文件,直接执行
1
$uri
1
, 如果找不到这个
1
$uri
1
,直接给出404错误,(和 location / 定义不同!),主要是为了防止 伪装成图片的攻击  (目前看,最安全的方式,是用上面那一句话,官方推荐的)
 
1
   
1
fastcgi_pass 127.0.0.1:9000;
1
   
1
fastcgi_index index.php;
1
   
1
fastcgi_param SCRIPT_FILENAME 
1
$document_root
1
$fastcgi_script_name
1
;
1
   
1
include

 

1
fastcgi_params;
1
 
1
}
 
1
 
1
# deny access to .htaccess files, 
1
if

 

1
Apache's document root
1
 
1
# concurs with nginx's one
1
 
1
#
1
 
1
location ~ /\.ht {
1
   
1
deny all;
1
 
1
}

设置完aaa.com的环境后,还需要设置bbb.com的 nginx的配置,因为bbb.com是wordpress的站点, 除了和aaa.com相同的设置外,还有些特殊的设置,具体设置请参考 http://codex.wordpress.org/Nginx

至此,从Apache向Nginx的移植基本完成。

MySQL 配置优化

安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分别对应大中小型数据库应用的配置。win环境下即存在于MySQL安装目录中的.ini文件。

下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量。

1. 连接请求的变量:

1) max_connections
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。

show variables like ‘max_connections’ 最大连接数

show status like ‘max_used_connections’响应的连接数

如下:

mysql> show variables like ‘max_connections‘;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| max_connections | 256  |

+———————–+——-+

mysql> show status like ‘max%connections‘;

+———————–+——-+

| Variable_name  | Value |

+—————————-+——-+

| max_used_connections | 256|

+—————————-+——-+

max_used_connections / max_connections * 100% (理想值≈ 85%)

如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

2) back_log
MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。

当观察你主机进程列表(mysql> show full processlist),发现大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大back_log 的值了。

默认数值是50,可调优为128,对于Linux系统设置范围为小于512的整数。

3) interactive_timeout
一个交互连接在被服务器在关闭前等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE 选项的客户。

默认数值是28800,可调优为7200。

2. 缓冲区变量

全局缓冲:

4) key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。

key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

举例如下:

mysql> show variables like ‘key_buffer_size‘;

+——————-+————+

| Variable_name | Value |

+———————+————+

| key_buffer_size | 536870912 |

+———— ———-+————+

key_buffer_size为512MB,我们再看一下key_buffer_size的使用情况:

mysql> show global status like ‘key_read%‘;

+————————+————-+

| Variable_name  | Value |

+————————+————-+

| Key_read_requests| 27813678764 |

| Key_reads   | 6798830 |

+————————+————-+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate =Key_reads / Key_read_requests * 100%,设置在1/1000左右较好

默认配置数值是8388600(8M),主机有4GB内存,可以调优值为268435456(256MB)。

5) query_cache_size
使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。

通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。

举例如下:

mysql> show global status like ‘qcache%‘;

+——————————-+—————–+

| Variable_name | Value  |

+——————————-+—————–+

| Qcache_free_blocks  | 22756  |

| Qcache_free_memory  | 76764704 |

| Qcache_hits      | 213028692 |

| Qcache_inserts     | 208894227 |

| Qcache_lowmem_prunes | 4010916 |

| Qcache_not_cached | 13385031 |

| Qcache_queries_in_cache | 43560 |

| Qcache_total_blocks | 111212  |

+——————————-+—————–+

mysql> show variables like ‘query_cache%‘;

+————————————–+————–+

| Variable_name      | Value  |

+————————————–+———–+

| query_cache_limit      | 2097152 |

| query_cache_min_res_unit  | 4096   |

| query_cache_size      | 203423744 |

| query_cache_type      | ON  |

| query_cache_wlock_invalidate | OFF  |

+————————————–+—————+

查询缓存碎片率= Qcache_free_blocks / Qcache_total_blocks * 100%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。

查询缓存利用率= (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

查询缓存命中率= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

示例服务器查询缓存碎片率=20.46%,查询缓存利用率=62.26%,查询缓存命中率=1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

每个连接的缓冲

6) record_buffer_size
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。

默认数值是131072(128K),可改为16773120 (16M)

7) read_rnd_buffer_size
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

一般可设置为16M

8) sort_buffer_size
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。

默认数值是2097144(2M),可改为16777208 (16M)。

9) join_buffer_size
联合查询操作所能使用的缓冲区大小

record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size为每个线程独占,也就是说,如果有100个线程连接,则占用为16M*100

10) table_cache
表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

1G内存机器,推荐值是128-256。内存在4GB左右的服务器该参数可设置为256M或384M。

11) max_heap_table_size
用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#

这个变量和tmp_table_size一起限制了内部内存表的大小。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。

12) tmp_table_size
通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。

mysql> show global status like ‘created_tmp%‘;

+——————————–+———+

| Variable_name   | Value |

+———————————-+———+

| Created_tmp_disk_tables | 21197 |

| Created_tmp_files   | 58  |

| Created_tmp_tables  | 1771587 |

+——————————–+———–+

每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100%

数据库还原xtrabackup自动还原脚本v2

xtrabackup自动还原
************************************************************************************************
应用场景:
************************************************************************************************
1.备份目录为/backup/full和/backup/incre的架构,前者保存全备,后者保存增量备份
2.如全备为/backup/full/2015-04-08_15-14-33则将全备的目录名2015-04-08_15-14-33
作为/backup/incre/下增量备份的目录名。这样设计的初衷在于只要全备不过期,那么
这个全备文件之后的增量备份也不过期.
3.还原时,脚本会自动找到最新的全备和最新全备命名的增量备份目录,并将增量备份
按照先后顺序应用日志到全备中,最后完成还原.
4.该版本增加了是否恢复所有增量备份,默认是全部增量备份.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
1
************************************************************************************************
1
脚本
1
************************************************************************************************
1
#!/bin/sh
1
#xiaohuai@xiaohuai.org
1
#xtrabackup 2.3.3
1
# 使用方法:
1
# ./restore.sh /增量备份父目录或全备的父目录名
1
#eg1:./restore.sh /data/backup/full/
1
#eg2:./restore.sh /data/backup/incre/
1
#NOTICE:增量备份还原如果指定文件,则还原到指定文件名的上一个文件末截止.
1
#即输入的增量文件名应为需要截止的增量文件名的下一个文件
1
  

 

1
  

 

1
#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
1
# rm -rf /usr/local/mysql/innodb_data/*
1
# rm -rf /usr/local/mysql/data/*
1
# rm -rf /usr/local/mysql/innodb_log/*
1
  

 

1
  

 

1
echo 
1
"*************************************************************************"
1
echo -e 
1
'\e[32m 提示:mysql端口根据实际环境修改. \e[m'

 

1
#红色
1
echo 
1
"*************************************************************************"
1
  

 

1
  

 

1
  

 

1
INNOBACKUPEX=innobackupex
1
INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX
1
TMP_LOG=
1
"/var/log/restore.$$.log"
1
MY_CNF=/etc/my.cnf
1
BACKUP_DIR=/home/xtrabackup 
1
# 你的备份主目录
1
FULLBACKUP_DIR=$BACKUP_DIR/full 
1
# 全库备份的目录
1
INCRBACKUP_DIR=$BACKUP_DIR/incre 
1
# 增量备份的目录
1
MEMORY=2048M 
1
# 还原的时候使用的内存限制数
1
ERRORLOG=`grep -i 
1
"^log-error"

 

1
$MY_CNF |cut -d = -f 2`
1
MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe
1
MYSQL_PORT=3306
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
#显示错误
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
error()
1
{
1
    
1
echo 
1
"$1"

 

1
1>&2
1
    
1
exit 1
1
}
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
# 检查innobackupex错误输出
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
check_innobackupex_fail()
1
{
1
    
1
if

 

1
[ -z 
1
"`tail -2 $TMP_LOG | grep 'completed OK!'`"

 

1
] ; then
1
    
1
echo 
1
"$INNOBACKUPEX命令执行失败:"
1
; echo
1
    
1
echo 
1
"---------- $INNOBACKUPEX的错误输出 ----------"
1
    
1
cat $TMP_LOG
1
    
1
#保留一份备份的详细日志
1
    
1
logfiledate=restore.`date +%Y%m%d%H%M`.txt
1
    
1
cat $TMP_LOG>/backup/$logfiledate  
1
    
1
rm -f $TMP_LOG
1
    
1
exit 1
1
  
1
fi
1
}
1
  

 

1
  

 

1
  

 

1
# 选项检测
1
if

 

1
[ ! -x $INNOBACKUPEX_PATH ]; then
1
  
1
error 
1
"$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."
1
fi
1
  

 

1
  

 

1
if

 

1
[ ! -d $BACKUP_DIR ]; then
1
  
1
error 
1
"备份目录$BACKUP_DIR不存在.请新建备份主目录$BACKUP_DIR"
1
fi
1
  

 

1
  

 

1
if

 

1
[ $
1
# != 1 ] ; then
1
  
1
error 
1
"使用方法: $0 使用还原目录的绝对路径"
1
fi
1
  

 

1
  

 

1
  

 

1
if

 

1
[ ! -d $1 ]; then
1
  
1
error 
1
"指定的备份目录:$1不存在."
1
fi
1
  

 

1
  

 

1
  

 

1
PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
1
if

 

1
[ $PORTNUM00 = 1  ];
1
then
1
echo -e 
1
"\e[31m NOTE:------------------------------------------.\e[m"

 

1
#红色
1
echo -e 
1
"\e[31m mysql处于运行状态,请关闭mysql. \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m NOTE:------------------------------------------.\e[m"

 

1
#红色
1
exit 0
1
fi
1
  

 

1
  

 

1
################判断还原增量备份部分还是所有################
1
echo 
1
"*************************************************************************"
1
echo -e 
1
"\e[31m 输入的增量文件名应为截止的增量文件名的下一个文件.\e[m"

 

1
#红色
1
echo 
1
"*************************************************************************"
1
ipname=
1
''
1
read -p 
1
"输入截止增量备份名[默认所有]:"

 

1
ipname
1
echo
1
  

 

1
  

 

1
echo 
1
"输入截止增量备份名为:$ipname"
1
  

 

1
  

 

1
  

 

1
input_value=$1
1
intpu_res=`echo ${input_value%/*}` 
1
  

 

1
  

 

1
  

 

1
  

 

1
# Some info output
1
echo 
1
"----------------------------"
1
echo
1
echo 
1
"$0: MySQL还原脚本"
1
START_RESTORE_TIME=`date +%F
1
' '
1
%T
1
' '
1
%w`
1
echo 
1
"数据库还原开始于: $START_RESTORE_TIME"
1
echo
1
  

 

1
  

 

1
  

 

1
#PARENT_DIR=`dirname ${intpu_res}`
1
PARENT_DIR=${intpu_res}
1
  

 

1
  

 

1
if

 

1
[ $PARENT_DIR = $FULLBACKUP_DIR ]; then
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=${intpu_res}/$FULL
1
echo 
1
"还原完全备份:`basename $FULLBACKUP`"
1
echo
1
  

 

1
  

 

1
else
1
  

 

1
################判断还原部分增量备份还是所有增量备份################
1
if

 

1
[ 
1
"$ipname"

 

1
= 
1
''

 

1
];then
1
 
1
if

 

1
[ $PARENT_DIR = $INCRBACKUP_DIR ]; then
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
1
if

 

1
[ ! -d $FULLBACKUP ]; then
1
error 
1
"全备:$FULLBACKUP不存在."
1
fi
1
INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1 ` 
1
#查找最后一个增量备份文件
1
echo 
1
"还原将从全备全备$FULL开始,到增量$INCR结束."
1
echo
1
echo 
1
"Prepare:完整备份..........."
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
     

 

1
  

 

1
  

 

1
# Prepare增量备份集,即将增量备份应用到全备目录中,按照增量备份顺序即按照时间从旧到最新
1
for

 

1
i 
1
in

 

1
`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n `;
1
do
1
  

 

1
  

 

1
#判断最新全备的lsn
1
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
1
     

 

1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
  

 

1
  

 

1
######判断增量备份中第一个增量备份的LSN
1
#check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`
1
       

 

1
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
1
       

 

1
fetch_incre_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_incre_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "
1
echo 
1
"增量备份$i的LSN值:${fetch_incre_lastlsn} "
1
  

 

1
if

 

1
[ 
1
"${fetch_incre_lastlsn}"

 

1
-eq 
1
"${fetch_full_lastlsn}"

 

1
];then
1
echo 
1
"*****************************************"
1
echo 
1
"LSN相等,不需要prepare!"
1
echo 
1
"*****************************************"
1
echo
1
break
1
  

 

1
  

 

1
  

 

1
else
1
echo 
1
"Prepare:增量备份集$i........"
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
   

 

1
if

 

1
[ $INCR = $i ]; then
1
break
1
fi
1
      

 

1
fi
1
######判断LSN
1
done
1
  

 

1
else
1
error 
1
"未知的备份类型"
1
  
1
fi
1
  

 

1
  

 

1
else
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
1
echo 
1
"Prepare:完整备份..........."
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
  

 

1
  

 

1
  

 

1
ipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`
1
echo 
1
"还原的指定增量目录文件$ipname的纪元时间为:$ipt"
1
for

 

1
i 
1
in

 

1
`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n `;
1
do
1
#判断for循环取到的文件名是否为输入的文件名,如果是则停止循环
1
if

 

1
[ 
1
"$i"

 

1
=  
1
"$ipname"

 

1
]; then
1
break
1
;
1
else
1
f01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`
1
if

 

1
[ 
1
"$f01"

 

1
-le 
1
"$ipt"

 

1
]; then
1
  

 

1
  

 

1
if

 

1
[ $PARENT_DIR = $INCRBACKUP_DIR ]; then
1
if

 

1
[ ! -d $FULLBACKUP ]; then
1
error 
1
"全备:$FULLBACKUP不存在."
1
fi
1
#INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1`
1
echo 
1
"还原将从全备$FULL开始,到增量$ipname结束."
1
echo
1
  

 

1
  

 

1
#判断最新全备的lsn
1
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
1
     

 

1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
  

 

1
  

 

1
######判断增量备份中第一个增量备份的LSN
1
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n |  head -1`
1
       

 

1
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
1
       

 

1
fetch_incre_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_incre_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份的LSN:${fetch_full_lastlsn} "
1
echo 
1
"增量备份的LSN:${fetch_incre_lastlsn} "
1
if

 

1
[ 
1
"${fetch_incre_lastlsn}"

 

1
-eq 
1
"${fetch_full_lastlsn}"

 

1
];then
1
echo 
1
"*****************************************"
1
echo -e 
1
"\e[31m LSN不需要prepare或备份间隔期间无数据变化 \e[m"

 

1
#红色
1
echo 
1
"*****************************************"
1
  

 

1
  

 

1
  

 

1
fi
1
  

 

1
  

 

1
echo
1
echo 
1
"Prepare:增量备份集$i........"
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
######判断LSN
1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份当前的LSN:${fetch_full_lastlsn}"
1
  

 

1
  

 

1
else
1
error 
1
"未知的备份类型"
1
fi
1
else
1
echo 
1
"查找增量备份文件完成."
1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
echo -e 
1
"\e[31m -------------------------------------------- \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m 完全备份最终的LSN:${fetch_full_lastlsn} \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m -------------------------------------------- \e[m"

 

1
#红色
1
break
1
fi
1
fi
1
done
1
  

 

1
  

 

1
fi
1
################判断还原部分增量备份还是所有增量备份################
1
  

 

1
  

 

1
fi
1
  

 

1
echo
1
echo 
1
"prepare:完整备份以及回滚那些未提交的事务..........."
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
  

 

1
echo 
1
"*****************************"
1
echo 
1
"数据库还原中 ...请稍等"
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
    

 

1
rm -f $TMP_LOG
1
echo 
1
"1.恭喜,还原成功!."
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
#修改目录权限
1
echo 
1
"修改mysql目录的权限."
1
mysqlcnf=
1
"/etc/my.cnf"
1
mysqldatadir=`grep -i 
1
"^basedir"

 

1
$mysqlcnf |cut -d = -f 2`
1
`echo 
1
'chown -R mysql:mysql'

 

1
${mysqldatadir}`
1
echo 
1
"2.权限修改成功!"
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
#自动启动mysql
1
  

 

1
  

 

1
INIT_NUM=1
1
if

 

1
[ ! -x $MYSQLD_SAFE ]; then
1
  
1
echo 
1
"mysql安装时启动文件未安装到$MYSQLD_SAFE或无执行权限"
1
  
1
exit 1  
1
#0是执行成功,1是执行不成功
1
else
1
echo 
1
"启动本机mysql端口为:$MYSQL_PORT的服务"
1
$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/
1
null

 

1
&
1
while

  

1
[ $INIT_NUM  -le 10 ]
1
      
1
do
1
        
1
PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
1
        
1
echo 
1
"mysql启动中....请稍等..."
1
        
1
sleep 10
1
        
1
if

 

1
[ $PORTNUM = 1  ];
1
        
1
then
1
echo -e 
1
"\e[32m mysql                                      ****启动成功**** \e[m"
1
        
1
exit 0
1
        
1
fi
1
        
1
INIT_NUM=$(($INIT_NUM +1))
1
      
1
done
1
echo -e 
1
"\e[31m mysql启动失败或启动时间过长,请检查错误日志 `echo 'cat ' ${ERRORLOG}` \e[m"
1
echo 
1
"*****************************************"
1
exit 0
1
fi
1
  

 

1
  

 

1
  

 

1
END_RESTORE_TIME=`date +%F
1
' '
1
%T
1
' '
1
%w`
1
echo 
1
"数据库还原完成于: $END_RESTORE_TIME"
1
exit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
1
************************************************************************************************
1
执行结果:
1
************************************************************************************************
1
  

 

1
# ./restore.sh /backup/incre/ 
1
输入截止增量备份名[默认所有]:2015-04-10_14-10-49
1
 

 

1
 

 

1
输入截止增量备份名为:2015-04-10_14-10-49
1
----------------------------
1
 

 

1
 

 

1
./restore.sh: MySQL还原脚本
1
数据库还原开始于: 2015-04-10 14:24:51 5
1
 

 

1
 

 

1
Prepare:完整备份...........
1
*****************************
1
还原的指定增量目录文件2015-04-10_14-10-49的纪元时间为:1428646269
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 344693290 
1
增量备份的LSN: 413297865 
1
Prepare:增量备份集2015-04-10_14-08-19........
1
*****************************
1
完全备份当前的LSN: 413297865
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 413297865 
1
增量备份的LSN: 481905295 
1
Prepare:增量备份集2015-04-10_14-09-07........
1
*****************************
1
完全备份当前的LSN: 481905295
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 481905295 
1
增量备份的LSN: 550515490 
1
Prepare:增量备份集2015-04-10_14-10-49........
1
*****************************
1
完全备份当前的LSN: 550515490
1
查找增量备份文件完成.
1
 
1
-------------------------------------------- 
1
 
1
完全备份最终的LSN: 550515490 
1
 
1
-------------------------------------------- 
1
 

 

1
 

 

1
prepare:完整备份以及回滚那些未提交的事务...........
1
*****************************
1
数据库还原中 ...请稍等
1
*****************************
1
1.恭喜,还原成功!.
1
*****************************
1
修改mysql目录的权限.
1
2.权限修改成功!
1
*****************************
1
启动本机mysql端口为:3306的服务
1
mysql启动中....请稍等...
1
mysql启动中....请稍等...
1
mysql启动中....请稍等...
1
 
1
mysql                                      ****启动成功**** 

本文转自坏总的:小坏天空

数据库备份xtrabackup自动备份脚本

一、安装xtrabackup
见centos下使用yum 安装percona xtrabackup
二、安装脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
1
#backup.sh  
1
#!/bin/sh  
1
#on xtrabackup 2.2.8  
1
# 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份  
1
# 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份  
1
#xiaohuai@xiaohuai.org  
1
   

 

1
INNOBACKUPEX_PATH=innobackupex  
1
#INNOBACKUPEX的命令  
1
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX_PATH  
1
#INNOBACKUPEX的命令路径  
1
   

 

1
#mysql目标服务器以及用户名和密码  
1
MYSQL_CMD=
1
"--host=localhost --user=root --password=123456 --port=3306"

   

1
   

 

1
MYSQL_UP=
1
" --user=root --password='123456' --port=3306 "

  

1
#mysqladmin的用户名和密码  
1
   

 

1
TMPLOG=
1
"/tmp/innobackupex.$$.log"

 

1
   

 

1
MY_CNF=/etc/my.cnf 
1
#mysql的配置文件  
1
   

 

1
MYSQL=/usr/local/mysql/bin/mysql 
1
   

 

1
MYSQL_ADMIN=/usr/local/mysql/bin/mysqladmin
1
   

 

1
BACKUP_DIR=/data/xtrabackup 
1
# 备份的主目录  
1
   

 

1
FULLBACKUP_DIR=$BACKUP_DIR/full 
1
# 全库备份的目录  
1
   

 

1
INCRBACKUP_DIR=$BACKUP_DIR/incre 
1
# 增量备份的目录  
1
   

 

1
FULLBACKUP_INTERVAL=86400 
1
# 全库备份的间隔周期,时间:秒  
1
   

 

1
KEEP_FULLBACKUP=1 
1
# 至少保留几个全库备份  
1
   

 

1
logfiledate=backup.`date +%Y%m%d%H%M`.txt  
1
   

 

1
#开始时间  
1
STARTED_TIME=`date +%s`  
1
   

 

1
   

 

1
   

 

1
#############################################################################  
1
   

 

1
# 显示错误并退出  
1
   

 

1
#############################################################################  
1
   

 

1
error()  
1
{  
1
    
1
echo 
1
"$1"

 

1
1>&2  
1
    
1
exit 1  
1
}  
1
   

 

1
    

 

1
   

 

1
# 检查执行环境  
1
   

 

1
if

 

1
[ ! -x $INNOBACKUPEXFULL ]; then 
1
  
1
error 
1
"$INNOBACKUPEXFULL未安装或未链接到/usr/bin."

 

1
fi 
1
   

 

1
    

 

1
   

 

1
if

 

1
[ ! -d $BACKUP_DIR ]; then 
1
  
1
error 
1
"备份目标文件夹:$BACKUP_DIR不存在."

 

1
fi 
1
   

 

1
    

 

1
   

 

1
mysql_status=`netstat -nl | awk 
1
'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'
1
`  
1
   

 

1
if

 

1
[ 
1
"$mysql_status"

 

1
!= 
1
"Yes"

 

1
];then 
1
    
1
error 
1
"MySQL 没有启动运行."

 

1
fi 
1
   

 

1
   

 

1
   

 

1
    

 

1
   

 

1
if

 

1
! `echo 
1
'exit'

 

1
| $MYSQL -s $MYSQL_CMD` ; then 
1
 
1
error 
1
"提供的数据库用户名或密码不正确!"

 

1
fi 
1
   

 

1
    

 

1
   

 

1
# 备份的头部信息  
1
   

 

1
echo 
1
"----------------------------"

 

1
echo 
1
echo 
1
"$0: MySQL备份脚本"

 

1
echo 
1
"开始于: `date +%F' '%T' '%w`"

 

1
echo 
1
   

 

1
    

 

1
   

 

1
#新建全备和差异备份的目录  
1
   

 

1
mkdir -p $FULLBACKUP_DIR  
1
mkdir -p $INCRBACKUP_DIR  
1
   

 

1
   

 

1
   

 

1
#查找最新的完全备份  
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    

 

1
   

 

1
# 查找最近修改的最新备份时间  
1
   

 

1
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`  
1
   

 

1
   

 

1
#如果全备有效进行增量备份否则执行完全备份  
1
if

 

1
[ 
1
"$LATEST_FULL_BACKUP"

 

1
-a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then 
1
    
1
# 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录  
1
    
1
echo -e 
1
"完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"

 

1
    
1
echo 
1
"                     "

 

1
    
1
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
1
    
1
mkdir -p $NEW_INCRDIR  
1
   

 

1
    
1
# 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础  
1
    
1
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

  

1
| sort -nr | head -1`  
1
        
1
if

 

1
[ ! $LATEST_INCR_BACKUP ] ; then 
1
            
1
INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP  
1
            
1
echo -e 
1
"增量备份将以$INCRBASEDIR作为备份基础目录"

 

1
            
1
echo 
1
"                     "

 

1
        
1
else

 

1
            
1
INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}  
1
            
1
echo -e 
1
"增量备份将以$INCRBASEDIR作为备份基础目录"

 

1
            
1
echo 
1
"                     "

 

1
        
1
fi 
1
   

 

1
    
1
echo 
1
"使用$INCRBASEDIR作为基础本次增量备份的基础目录."

 

1
    
1
$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1  
1
   

 

1
    
1
#保留一份备份的详细日志  
1
   

 

1
    
1
cat $TMPLOG>/backup/$logfiledate  
1
   

 

1
    
1
if

 

1
[ -z 
1
"`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`"

 

1
] ; then 
1
     
1
echo 
1
"$INNOBACKUPEX命令执行失败:"
1
; echo 
1
     
1
echo -e 
1
"---------- $INNOBACKUPEX_PATH错误 ----------"

 

1
     
1
cat $TMPLOG  
1
     
1
rm -f $TMPLOG  
1
     
1
exit 1  
1
    
1
fi 
1
   

 

1
    
1
THISBACKUP=`awk -- 
1
"/Backup created in directory/ { split( \\\$0, p, "'" ) ; print p[2] }"

 

1
$TMPLOG`  
1
    
1
rm -f $TMPLOG  
1
   

 

1
   

 

1
    
1
echo -n 
1
"数据库成功备份到:$THISBACKUP"

 

1
    
1
echo 
1
   

 

1
    
1
# 提示应该保留的备份文件起点  
1
   

 

1
    
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    
1
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
1
   

 

1
    
1
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

  

1
| sort -nr | head -1`  
1
   

 

1
    
1
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
1
   

 

1
    
1
RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`  
1
   

 

1
    
1
echo 
1
    
1
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m
1
' #红色  
1
    
1
echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份." 
1
    
1
echo -e '
1
\e[31m NOTE:---------------------------------------------------------------------------------.\e[m
1
' #红色  
1
    
1
echo 
1
   

 

1
   

 

1
   

 

1
else 
1
    
1
echo  "*********************************" 
1
    
1
echo -e "正在执行全新的完全备份...请稍等..." 
1
    
1
echo  "*********************************" 
1
    
1
$INNOBACKUPEXFULL --defaults-file=$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1   
1
    
1
#保留一份备份的详细日志  
1
   

 

1
    
1
cat $TMPLOG>/backup/$logfiledate  
1
   

 

1
   

 

1
    
1
if [ -z "`tail -1 $TMPLOG | grep '
1
innobackupex: completed OK!
1
'`" ] ; then 
1
     
1
echo "$INNOBACKUPEX命令执行失败:"; echo 
1
     
1
echo -e "---------- $INNOBACKUPEX_PATH错误 ----------" 
1
     
1
cat $TMPLOG  
1
     
1
rm -f $TMPLOG  
1
     
1
exit 1  
1
    
1
fi 
1
   

 

1
        

 

1
    
1
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, "'
1
" ) ; print p[2] }" $TMPLOG`  
1
    
1
rm -f $TMPLOG  
1
   

 

1
    
1
echo -n 
1
"数据库成功备份到:$THISBACKUP"

 

1
    
1
echo 
1
   

 

1
    
1
# 提示应该保留的备份文件起点  
1
   

 

1
    
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    
1
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
1
   

 

1
    
1
echo 
1
    
1
echo -e 
1
'\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'

 

1
#红色  
1
    
1
echo -e 
1
"无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."

 

1
    
1
echo -e 
1
'\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'

 

1
#红色  
1
    
1
echo 
1
   

 

1
fi 
1
   

 

1
   

 

1
   

 

1
#删除过期的全备  
1
   

 

1
echo -e 
1
"find expire backup file...........waiting........."

 

1
echo -e 
1
"寻找过期的全备文件并删除"
1
>>/backup/$logfiledate  
1
for

 

1
efile 
1
in

 

1
$(/usr/bin/find $FULLBACKUP_DIR/ -mtime +6)  
1
do

 

1
    
1
if

 

1
[ -d ${efile} ]; then 
1
    
1
rm -rf 
1
"${efile}"

 

1
    
1
echo -e 
1
"删除过期全备文件:${efile}"

 

1
>>/backup/$logfiledate  
1
    
1
elif [ -f ${efile} ]; then 
1
    
1
rm -rf 
1
"${efile}"

 

1
    
1
echo -e 
1
"删除过期全备文件:${efile}"

 

1
>>/backup/$logfiledate  
1
    
1
fi;  
1
       

 

1
done 
1
   

 

1
if

 

1
[ $? -eq 
1
"0"

 

1
];then 
1
   
1
echo 
1
   
1
echo -e 
1
"未找到可以删除的过期全备文件"

 

1
fi 
1
   

 

1
   

 

1
   

 

1
echo 
1
echo 
1
"完成于: `date +%F' '%T' '%w`"

 

1
exit 0  

本文转自坏总的: 小坏天空