mysql-5.7.26 解压安装教程

1、官网下载:https://downloads.mysql.com/archives/community/

11

2、解压到D:\mysql-5.7.26,并添加data目录及my.ini文件

22

3、编辑my.ini

[code]
[client]
port=3306
default-character-set=utf8
[mysqld]
# 设置mysql的安装目录
basedir=D:/netljc/mysql-5.7.26
# 设置mysql的数据目录
datadir=D:/netljc/mysql-5.7.26/data
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 开启查询缓存
explicit_defaults_for_timestamp=true
skip-grant-tables
[/code]

4、设置环境变量:D:\netljc\mysql-5.7.26\bin

5、以管理员身份打开cmd命令行执行安装命令

[code]
// 安装
mysqld -install

// 初始化
mysqld –initialize-insecure

// 启动
net start mysql

// 更改密码
set password for root@localhost = password(‘123456′)

// 登陆
mysql -u root -p[/code]

mysql视图

#概念
数据库视图是虚拟表或逻辑表;
因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据;
允许通过先决条件的数据库视图来更新基础表中的数据;
当基础表的数据发生变化时,视图也反映了这些数据的变化;

#优点
简化查询:使用数据库视图可隐藏最终用户和程序基础表的复杂性;只需要简单的sql语句就能拿到想要的结果;
权限控制:可以限制用户对数据的访问权限,不暴露敏感数据;创建只读视图用户只能看不能改;
计算列:可创建实时统计字段
向后兼容:从新设计数据库基础表,不需要修改应用程序,只需要修改视图即可

#缺点
性能低:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
高耦合:与基础表高耦合,如果更改了表结构同时需要更改视图

#视图的限制:
不能在视图上创建索引,查询的时候会使用mysql底层表的索引。
MySQL 5.7.7之前,不能在SELECT语句的FROM子句中使用子查询来定义视图。
删除或重命名视图所基于的表,MySQL会使视图无效,可以使用CHECK TABLE语句来检查视图是否有效。
简单的视图可以更新表中数据,基于具有连接,子查询等的复杂SELECT语句创建的视图无法更新。
MySQL是不支持物理视图

#创建视图
MySQL提供了三种算法:MERGE,TEMPTABLE和UNDEFINED,默认是UNDEFINED;
UNDEFINED算法使MySQL可以选择使用MERGE或TEMPTABLE算法。
MySQL优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。
TEMPTABLE算法创建的视图将不能更新

[code]CREATE OR REPLACE ALGORITHM = UNDEFINED VIEW showTestTable AS
SELECT * FROM test LIMIT 2;[/code]

#基于另一个视图创建视图
[code]CREATE OR REPLACE VIEW showTest AS
SELECT * FROM showTestTable WHERE id=1;[/code]

#创建一个数据一致性的视图,WITH CHECK OPTION子句创建的视图在插入、更新、删除的时候会检查数据是否符合视图的定义,不符合的将拒绝执行
[code]CREATE OR REPLACE VIEW showTestTable4 AS
SELECT * FROM test WHERE id<10
WITH CHECK OPTION;[/code]

#查询视图
[code]SELECT * FROM showTestTable2;[/code]

#通过视图修改数据
[code]UPDATE showTestTable3 SET created=2 WHERE id=1;[/code]

#通过视图删除数据
[code]DELETE FROM showTestTable2 WHERE id=1;[/code]

#通过视图插入数据,使用了WITH CHECK OPTION语句的视图,不满足视图数据一致性的数据无法插入
[code]INSERT INTO showTestTable4 VALUES(10,11111);[/code]

#查询可以update的视图
[code]SELECT table_name, is_updatable FROM information_schema.views WHERE table_schema = ‘demo';[/code]

#查看所有的表,视图属于表
[code]SHOW TABLES;[/code]

#查看哪些是表,哪些是视图
[code]SHOW FULL TABLES;[/code]

#查看视图的定义
[code]SHOW CREATE VIEW showTestTable;[/code]

#修改视图
[code]ALTER VIEW showTestTable4 AS
SELECT * FROM test WHERE id=8;

SELECT * from showTestTable4;[/code]

#删除视图
[code]DROP VIEW IF EXISTS showTestTable;[/code]

mysql储存过程

#概念

存储过程是存储在数据库目录中的一段声明性SQL语句。

#优点

高性能:MySQL存储过程按需编译,在编译存储过程之后,MySQL将其放入缓存中,应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。
节约流量:应用程序不必发送多个冗长的SQL语句,而只能发送存储过程的名称和参数。
重用性:存储过程将数据库接口暴露给所有应用程序,开发人员不必开发存储过程中已支持的功能。
安全性:数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。

#缺点

消耗内存和CPU:大量存储过程会导致每个连接的内存使用量将会大大增加;存储过程中过度使用大量逻辑操作,则CPU使用率也会增加。
开发维护成本高
很难调试
存储过程的构造不利于复杂的业务逻辑开发

#创建一个储存过程
[code]
DELIMITER //
CREATE PROCEDURE procedureName()
BEGIN
SELECT * FROM test;
END //
DELIMITER ;
CALL procedureName();
[/code]

#创建一个带参数的储存过程 in
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11))
BEGIN
SELECT * FROM test WHERE id=p_id;
END //
DELIMITER ;
CALL procedureName(1);
[/code]

#创建一个带参数的储存过程 out
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT total int)
BEGIN
SELECT count(*) INTO total FROM test;
END //
DELIMITER ;
CALL procedureName(@total);
SELECT @total;
[/code]
#创建一个带参数的储存过程 inout
[code]
DELIMITER //
CREATE PROCEDURE procedureName(INOUT total int)
BEGIN
SET total=total+1;
END //
DELIMITER ;

SET @countTotal=1;
CALL procedureName(@countTotal);
SELECT @countTotal;
[/code]

#创建一个带参数的储存过程 返回多个值
[code]
DELIMITER //
CREATE PROCEDURE procedureName(
OUT idcount1 int,
OUT idcount2 int,
OUT idcount3 int,
OUT idcount4 int
)
BEGIN
SELECT COUNT(*) INTO idcount1 FROM test WHERE id>=1;
SELECT COUNT(*) INTO idcount2 FROM test WHERE id>=2;
SELECT COUNT(*) INTO idcount3 FROM test WHERE id>=4;
SELECT COUNT(*) INTO idcount4 FROM test WHERE id>=4;
END //
DELIMITER ;
CALL procedureName(@idcount1,@idcount2,@idcount3,@idcount4)
SELECT @idcount1,@idcount2,@idcount3,@idcount4
[/code]

#IF 判断
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
if(p_id>0 and p_id<=2) THEN
SET res=’aaa';
ELSEIF(p_id>2 and p_id<=4) THEN
SET res=’bbb';
ELSE
SET res=’ggg';
END IF;
END //
DELIMITER ;
CALL procedureName(5,@res);
SELECT @res
[/code]

#CASE WHEN 单条件
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
CASE p_id
WHEN 1 THEN
SET res=’aaa';
WHEN 2 THEN
SET res=’bbb';
WHEN 3 THEN
SET res=’ccc';
ELSE
SET res=’no';
END CASE;
END //
DELIMITER ;
CALL procedureName(1,@res);
SELECT @res
[/code]

#CASE WHEN 多条件
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
CASE
WHEN p_id>=1 AND p_id<=5 THEN
SET res=’aaa';
WHEN p_id>=6 AND p_id<=10 THEN
SET res=’bbb';
WHEN p_id>=11 AND p_id<=15 THEN
SET res=’ccc';
ELSE
SET res=’no';
END CASE;
END //
DELIMITER ;
CALL procedureName(44,@res);
SELECT @res
[/code]

#WHILE DO 满足条件的循环
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

WHILE x <= 5 DO
SET res = CONCAT(res,x,’,’);
SET x = x + 1;
END WHILE;
#SELECT res;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#REPEAT UNTIL 不满足条件的循环
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

REPEAT
SET res = CONCAT(res,x,’,’);
SET x = x + 1;
UNTIL x > 5
END REPEAT;
#SELECT res;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#loop LEAVE等于break ITERATE等于continue
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF;

SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
SET res = CONCAT(res,x,’,’);
END IF;
END LOOP;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#创建一个存储过程来获取用户的电子邮箱
[code]
DELIMITER //
CREATE PROCEDURE procedureName (INOUT email_list varchar(4000))
BEGIN
— 声明两个变量,是否是末尾,当前的邮箱账号
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_email varchar(100) DEFAULT "";

— 声明游标
DEClARE email_cursor CURSOR FOR SELECT email FROM users_info;

— 游标找不到数据的时候设置v_finished=1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

— 打开游标
OPEN email_cursor;

— LOOP 循环
get_email: LOOP

— 读取游标中的电子邮箱账号
FETCH email_cursor INTO v_email;

— 未找到数据的时候跳槽循环
IF v_finished = 1 THEN
LEAVE get_email;
END IF;

— 拼接邮箱账号
SET email_list = CONCAT(v_email,";",email_list);

END LOOP get_email;
CLOSE email_cursor;
END//
DELIMITER ;

CALL procedureName(@res);
SELECT @res;
[/code]

#删除一个储存过程
[code]
DROP procedure IF EXISTS `procedureName`;
[/code]

#查询demo库中的存储过程
[code]
SHOW PROCEDURE STATUS WHERE db=’demo';
[/code]

#查询存储过程的创建语句
[code]
SHOW CREATE PROCEDURE `procedureName`;
[/code]

#储存过程中的异常处理
[code]
DELIMITER $$
CREATE PROCEDURE procedureName(IN article_id INT, IN tag_id INT)
BEGIN

— 主键冲突的时候抛出异常提示,并继续执行CONTINUE 终止执行EXIT
DECLARE CONTINUE HANDLER FOR 1062
SELECT CONCAT(‘duplicate keys (‘,article_id,’,’,tag_id,’) found’) AS msg;

INSERT INTO article_tags(article_id,tag_id) VALUES(article_id,tag_id);

SELECT COUNT(*) FROM article_tags;
END$$
DELIMITER ;

CALL procedureName(1,2);
CALL procedureName(1,3);
CALL procedureName(1,2);
[/code]

#mysql自定义函数
自定义函数可以在sql中调用,而存储过程只能在单独调用;下面是一个返回用户等级的函数
[code]
DELIMITER $$
CREATE FUNCTION CustomerLevel(p_creditLimit double) RETURNS VARCHAR(10) DETERMINISTIC
BEGIN
DECLARE lvl varchar(10);

IF p_creditLimit > 50000 THEN
SET lvl = ‘1’;
ELSEIF (p_creditLimit <= 50000 AND p_creditLimit >= 10000) THEN
SET lvl = ‘2’;
ELSEIF p_creditLimit < 10000 THEN
SET lvl = ‘3’;
END IF;
RETURN (lvl);
END $$
DELIMITER ;

SELECT CustomerLevel(100000);
[/code]

#删除函数
[code]
DROP FUNCTION IF EXISTS `CustomerLevel`;
[/code]

#预先执行的建表预计
[code]
CREATE TABLE `article_tags` (
`article_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`created` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `users_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
[/code]

nginx配置https

1、申请ssl证书
ssl证书是收费的,当然对于个人而言用免费版的就好了,免费版可在:https://freessl.cn/申请
2、下载并上传你申请的证书到服务器
3、配置nginx,并将http跳转到https
[code]
server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*)$ https://$host$1 permanent;
}

server {
#listen 80;
listen 443;
server_name xxx.com www.xxx.com;
ssl on;
ssl_certificate /home/wwwroot/nginx/conf/full_chain.pem;
ssl_certificate_key /home/wwwroot/nginx/conf/private.key;
access_log /home/wwwroot/nginx/logs/xxx.log;

location / {
root /home/wwwroot/www/xxx/;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /home/wwwroot/www/xxx/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[/code]

mongodb在命令行下的基础用法

#进入mongodb
/home/wwwroot/mongodb/bin/mongo 127.0.0.1:27017

#关闭mongodb服务
db.shutdownServer()

#查看有多少个数据库
show dbs

#使用指定的数据库(数据库不需要预先创建,在使用use参数后对数据库进行操作的时候会自己创建)
use test

#查看表
show tables

#删除数据库(需要先use才能删除)
db.dropDatabase()

#向集合中写入数据,mongodb中的集合与mysql的表差不多是一个概念
db.user.insert({x:1})

#查询数据库中已经创建的集合(表)
show collections

#查询集合中的数据,user集合,find中可以加条件,条件为json格式
db.user.find()

#查询一条数据
db.user.findOne()

#js语法插入多条数据
for(i=3;i<100;i++)db.user.insert({x:i})

#计数
db.user.find().count()

#调过前面三条取出两条按x排序
db.user.find().skip(3).limit(2).short({x:1})

#更新数据
db.user.find({x:1});
db.user.update({x:1},{x:999});

#部分更新,只更新y=99
db.user.insert({x:100,y:100,z:100})
db.user.update({z:100},{$set:{y:99}})

#更新一条不存在的数据时自动创建,第三个参数为true
db.user.update({z:10000},{z:1000},true)

#更新多条数据,update默认只会更新找到的第一条数据
db.user.insert({c:1})
db.user.insert({c:1})
db.user.insert({c:1})
db.user.update({c:1},{$set:{c:2}},false,true)

#删除数据,删除数据必须传递参数
db.user.remove({c:2})

#删除表
db.user.drop()

centos环境安装mongodb

#下载mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.4.tgz
#解压
tar -zvxf mongodb-linux-x86_64-4.0.4.tgz
#进入源码目录
cd mongodb-linux-x86_64-4.0.4
#创建安装目录
mkdir -p /home/wwwroot/mongodb/data/
mkdir -p /home/wwwroot/mongodb/log/
mkdir -p /home/wwwroot/mongodb/bin/
#复制源码目录下的文件到安装目录
cp bin/* /home/wwwroot/mongodb/bin/
#编辑配置文件
vi /home/wwwroot/mongodb/mongodb.conf

port=27017 #端口
bind_ip=0.0.0.0 #默认是127.0.0.1
dbpath=/home/wwwroot/mongodb/db #数据库存放
logpath=/home/wwwroot/mongodb/log/mongodb.log #日志文件
fork=true #设置后台运行
#auth=true #开启认证

#启动服务
/home/wwwroot/mongodb/bin/mongod –config /home/wwwroot/mongodb/mongodb.conf

#客户端连接mongodb

/home/wwwroot/mongodb/bin/mongo 127.0.0.1:27017

命令行使用mongodb请参考:
http://www.netljc.com/?p=1202

shell函数读取ini配置文件中的配置项

ini文件的格式,中括号里面是节,name是键名,value是键值
[code]
[section1]
name1 = value1
name2 = value2

[section2]
name3 = value3
[/code]
实现读取ini文件的函数代码看起来比较简单:
[code]
function readINI()
{
FILENAME=$1;
SECTION=$2;
KEY=$3
RESULT=`awk -F ‘=’ ‘/\[‘$SECTION’\]/{a=1}a==1&&$1~/’$KEY’/{print $2;exit}’ $FILENAME`
echo $RESULT
}
[/code]

调用方法(从名为Filename的文件中读取Section节中的Key键值保存到变量Value中):
[code]Value=$(readINI Filename Section Key)[/code]

解析:
readINI()函数接收三个参数分别传给FILENAME、SECTION和KEY,然后调用awk命令在文件中查找指定键值。这里最重要的就是awk命令:

awk -F ‘=’ ‘/\[‘$SECTION’\]/{a=1}a==1&&$1~/’$KEY’/{print $2;exit}’ $FILENAME
-F ‘=’ 表示用“=”作为分割符(多余的空格同样会被忽略);
/\[‘$SECTION’\]/ 和 /’$KEY’/ 是正则表达式,用于匹配节名和键名,注意在awk正则表达式中参数要用单引号括起来;
/\[‘$SECTION’\]/{a=1} 表示逐行搜索到目标节时用变量a标记下来;
a==1&&$1~/’$KEY’/{print $2;exit} 表示当目标节已找到(a==1)并且当前行第一个参数匹配键名时,打印第二个参数(键值)并退出,这里exit是为了防止后面其它节有相同的键名。

注意:
该方法的一个缺陷是,如果节名和键名都存在但目标键并不在目标节下时会返回错误的搜索结果,因此在写ini文件的时候需要注意。

shell基础语法

[code]
#!/bin/bash
# 上面中的 #! 是一种约定标记, 它可以告诉系统这个脚本需要什么样的解释器来执行;</code>

echo "Hello, world!"

#变量赋值
bianliang="aaa"

#删除变量
unset bianliang

#输出变量
echo ${bianliang}

#输出当前脚本的文件名
echo $0

#输出脚本传递的第一个参数
echo $1

#输出脚本传递参数的个数
echo $#

#脚本传递的所有参数
echo $*
echo $@

#当前脚本的进程ID
echo $$

#上一条命令返回的退出状态,执行成功返回0,失败返回1
echo $?

#命令替换———————————————-
#它的意思就是说我们把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来
directory=`ls`
echo $directory

#变量替换———————————————
a=’123456′
#原样输出
echo $a
#如果变量存在则返回word
echo ${a:+word}
unset a
#变量不存在返回word,但不改变a的值
echo ${a:-word}
#变量不存在返回word,并给a赋值
echo ${a:=word}

#echo $a

#Shell运算符—————————————
#注意运算符两边一定要要空格,不然就是在拼接字符串,不会执行运算
a=2
b=9
#加
echo `expr $a + $b`
echo $[$a+$b]
#减
echo `expr $a – $b`
echo $[$a-b]
#乘
echo `expr $a \* $b`
echo $[$a*$b]
#关系运算符
[ $a -eq $b ] #相等
[ $a -ne $b ] #不相等
[ $a -gt $b ] #&gt;
[ $a -ge $b ] #&gt;=
[ $a -lt $b ] #&lt;
[ $a -le $b ] #&lt;= #字符串运算符 [ $a = $b ] #相等 [ $a != $b ] #不相等 [ -z $a ] #字符串长度为0,返回true [ -n $a ] #长度不为0返回true [ $a ] 不为空返回true #文件测试运算符 file=/home/wwwroot/www/shellstudy.sh if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi #字符串———————————- #拼接字符串 a=’abcde'; echo "aaaa${a}aaaaaa" #获取字符串长度 echo ${#a} #截取字符串 echo ${a:0:2} #查找字符串 echo `expr index $a cde` #数组————————————– a=(1 2 3 4 5) a[0]=1 a[1]=2 a[2]=3 a[3]=4 #读取下标为2的值 echo ${a[2]} #读取数组的全部元素 echo ${a[*]} #获取数组的长度 length=${#a[*]} echo $length #获取数组全部下标 xb=${!a[*]} echo $xb #流程控制语句———————————- #if语句 a=2 b=3 if [ $a -eq $b ] then echo "===" else echo "!=" fi if [ $a -eq $b ] then echo "相等" elif [ $a -gt $b ] then echo "$a&gt;$b"
elif [ $a -lt $b ]
then
echo "$a&lt;$b"
fi

#for循环
arr=(1 2 3 4)
for i in ${arr[*]}
do
echo "${i}"
done

for((i=1;i&lt;=5;i++));do
echo "这是第 $i 次调用";
done;

while
int=1
while(( $int&lt;=5 ))
do
echo $int
let "int++"
done

echo ‘按下 退出’
echo -n ‘输入你最喜欢的网站名: ‘
while read FILM
do
echo "是的!$FILM 是一个好网站"
done

#until循环
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done

#case命令
a=1
read a
case ${a} in
1) echo ‘aaaaa’
;;
2) echo ‘bbbbb’
;;
3) echo ‘ccccc’
;;
*) echo ‘error’
;;
esac

#死循环 break
while true
do
read a
case ${a} in
1|2|3|4) echo "你输入了${a}"
;;
*) echo "你要输入1-4之间的数字"
break
;;
esac
done

#死循环 continue
while true
do
read a
case ${a} in
1|2|3|4) echo "你输入了${a}"
;;
*) echo "你要输入1-4之间的数字"
continue
;;
esac
done

#shell函数——————————————-
#注意:1. 调用函数只需要给出函数名,不需要加括号。
#2. 函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
#3. Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。
#4. 函数的参数可以通过 $n 得到.如:
function testF(){
echo "hell world $1 $2"
}
testF a b

#删除函数
unset .f testF
[/code]

linux中 vi / vim显示行号或取消行号命令

1. 显示行号

:set number

或者

:set nu

2. 取消行号显示

:set nu!

3. 每次打开都显示行号

修改vi ~/.vimrc 文件,添加:set number

centos下mysql自动备份(全量)

1、新建mysql的备份目录
[code]mkdir -p /home/wwwroot/mysql/backup/[/code]

2、新建备份脚本
[code]
vi /home/wwwroot/mysql/backup/backup.sh
#!/bin/bash
backupdir=/home/wwwroot/mysql/backup/
time=` date +%Y%m%d `
db_user=root
db_pass=123456
db=demo
/home/wwwroot/mysql/bin/mysqldump -u $db_user -p$db_pass -S /home/wwwroot/mysql/mysql.sock –databases $db | gzip > $backupdir/demo$time.sql.gz
find $backupdir -name "*.gz" -type f -mtime +180 -exec rm -rf {} \; > /dev/null 2>&1
[/code]

3、添加脚本的可执行权限
[code]chmod 755 /home/wwwroot/mysql/backup/backup.sh[/code]

4、在crontab中添加计划任务
crontab的使用请参考:http://www.netljc.com/?p=1186
[code]
crontab -e
#每5分钟执行一次
*/5 * * * * /home/wwwroot/mysql/backup/backup.sh

#每月8号10点30分执行一次
30 10 8 * * /home/wwwroot/mysql/backup/backup.sh

service crond restart
[/code]