前提
在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要。
但是每次都直接导出整个数据库的sql文件,显然是不现实的。对数据库的性能影响比较大。
## mysql备份的三种方式
- 热备 : 不关闭mysql服务的情况下,请求可以继续操作数据库,实现备份
- 温备 : 不关闭mysql服务的情况下,支持读,不支持写,实现备份
- 冷备 : 关闭mysql服务的情况下,实现备份
备份的类型
* 全量备份 : 一次性备份整个数据库的数据结构为sql文件
* 增量备份 : 备份增量的日志文件,日志文件中有操作数据库数据结构的记录,我们可以使用这个来作为增量备份的恢复文件
问题
mysql mysqladmin: command not found
解决方案: ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin
原因是此命令没有在系统默认的默认目录下
说明:/usr/local/mysql/bin/mysqladmin 是mysql安装目录得bin/mysqladmin
mysqldump: command not found mysqldump命令不存在的问题
Linux中找不到mysqldump命令的原因:系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令。
解决方法:1、知道mysql命令或mysqldump命令的完整路径,可以使用find命令查找
# find / -name mysqldump -print
比如mysql的路径是:/usr/local/mysql/bin/mysqldump
2、映射一个链接到/usr/bin目录下,相当于建立一个软链接文件
# ln -s /usr/local/mysql/bin/mysqldump /usr/bin
此时再使用mysqldump命令就可以了
方案
1.mysqldump 是mysql中自带的一个备份工具
使用mysqldump备份数据库,使用mysqladmin备份数据日志,编写两个脚本一个全量备份数据库的脚本databak.sh,一个增量备份日志的脚本binlogbak.sh,使用crontab定时任务,每个星期日凌晨3:00执行完全备份脚本,周一到周六凌晨3:00做增量备份。
实践
1.mysql开启增量备份,在my.cnf添加 : log-bin=/usr/local
/mysql/mysql-bin
vim /usr/local/mysql/my.cnf
my.cof :
[mysqld]
port = 13336
skip-name-resolve
lower_case_table_names=1
tmp_table_size = 32M
max_connections=2000
max_allowed_packet=80M
wait_timeout=250
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#datadir=/mnt/www/data
#socket=/usr/local/mysql/mysql.sock
log-bin=/usr/local/mysql/mysql-bin
[mysqldump]
max_allowed_packet= 400M
user=xxx
password="xxx"
[mysqladmin]
max_allowed_packet= 400M
user=xxx
password="xxx"
2.创建备份文件存放的路径
mkdir -p /mnt/www/mysql/backup
3.创建mysql全量备份的脚本
vim /mnt/www/mysql/databak.sh
databak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
#生成备份存放的目录
BakDir=/mnt/www/mysql/backup
LogFile=/mnt/www/mysql/backup/bak.log
#数据库名称
db_name='welfare_matchmaker'
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H时%M分%S秒"`
current_time=$(date +'%Y年%m月%d日 %H时%M分%S秒')
filepath=$BakDir$current_time'.sql.gz'
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
#此处没有使用 $db_password $db_user, 已经写入到配置文件中
echo '开始导出数据库...'
#/usr/local/mysql/my.cnf这个是mysql具体的配置文件,根据自己实际安装路径填写
mysqldump --defaults-extra-file=/usr/local/mysql/my.cnf $db_name > $DumpFile
echo '导出成功,文件名为: '$filepath
tar -czvf $GZDumpFile $DumpFile
rm $DumpFile
count=$(ls -l *.tgz |wc -l)
if [ $count -ge 5 ]
then
file=$(ls -l *.tgz |awk '{print $9}'|awk 'NR==1')
rm -f $file
fi
#只保留过去四周的数据库内容
Last=`date +"%Y年%m月%d日 %H时%M分%S秒"`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
cd $BakDir/daily
rm -f *
4.创建mysql增量备份的脚本
vim
/mnt/www
/mysql/binlogbak.sh
binlogbak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
BakDir=/mnt/www/mysql/backup/daily
BinDir=/usr/local/mysql
LogFile=/mnt/www/mysql/backup/binlog.log
BinFile=/usr/local/mysql/mysql-bin.index
mysqladmin -uroot -p123456 flush-logs
#这个是用于产生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的。
for file in `cat $BinFile`
do
base=`basename $file`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $Counter ]
then
echo $base skip! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BakDir
echo $base copying >> $LogFile
fi
fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` Bakup succ! >> $LogFile
5.为databak.sh和binlogbak.sh添加执行权限
cd /mnt/www/mysql
chmod 777 binlogbak.sh databak.sh
6.开启定时任务
vi /etc/crontab
crontab:
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /mnt/www/mysql/databak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /mnt/www/mysql/binlogbak.sh >/dev/null 2>&1
使上述定时任务生效
crontab /etc/crontab
查看定时任务
crontab -l
标签:bin,usr,备份,mysqldump,mysql,local,全量 From: https://www.cnblogs.com/wjsqqj/p/17126119.html