在Linux服务器上自动备份MySQL数据库

uklbhaso  于 2023-01-20  发布在  Mysql
关注(0)|答案(7)|浏览(166)

我需要一个脚本,自动备份的MySql数据库。我知道有很多职位和脚本有关于这个主题已经,但这里是我的不同之处。
1.该脚本需要在托管MySql数据库的计算机上运行(这是一台Linux计算机)。
1.备份必须保存到数据库所在的服务器上。
1.需要每30分钟进行一次备份。
1.当备份超过一周时,将删除该备份,除非它是该周创建的第一个备份。例如,在这些备份中,backup_1_12_2010_0-00_Mon.db、backup_1_12_2010_0-30_Mon.db备份_1_12_2010_1-00_Mon.db...备份_7_12_2010_23-30_Sun.db等仅保留备份_1_12_2010_0-00_Mon.db。
有人有类似的想法吗?或者从哪里开始?

jw5wzhpr

jw5wzhpr1#

  • 答案 *:一个cron

产品名称 *:
尝试使用以下内容创建文件something.sh:

#!/bin/sh
 mysqldump -u root -p pwd --opt db1.sql > /respaldosql/db1.sql
 mysqldump -u root -p pwd --opt db2.sql > /respaldosql/db2.sql
 cd /home/youuser/backupsql/
 tar -zcvf backupsql_$(date +%d%m%y).tgz *.sql
 find -name '*.tgz' -type f -mtime +2 -exec rm -f {} \;

为文件给予足够的权限

chmod 700 mysqlrespaldo.sh

sudo chmod 700 something.sh

然后创建一个cron

crontab -e

把它设置成

**0 1 * * *** /home/youruser/coolscripts/something.sh

请记住,数字或“*”字符具有以下结构:

Minutes (range 0-59)
Hours (0-23)
Day of month (1-31)
Month (1-12)
Day of the week (0-6 being 0=Domingo)
Absolute path to script or program to run

您也可以使用较新版本的linux发行版中提供的helper文件夹,在那里您可以找到/etc/cron.daily/etc/cron.hourly/etc/cron.weekly等。在这种情况下,您可以在所选文件夹中创建一个指向脚本的符号链接,操作系统将负责以承诺的重复性(来自@Nick的一个强大评论)运行它。

q5lcpyga

q5lcpyga2#

创建如下所示的shell脚本:

#!/bin/bash
mysqldump -u username -p'password' dbname > /my_dir/db_$(date+%m-%d-%Y_%H-%M-%S).sql
find /mydir -mtime +10 -type f -delete

替换用户名、密码和备份目录(my_dir)。将其保存在目录(shell_dir)中,名称为filename.sh
使用crontab -e将其安排为每天运行,如下所示:

30 8 * * * /shell_dir/filename.sh

这将在每天早上8:30运行,并备份数据库。它还删除了超过10天的备份。如果你不想这样做,只需删除脚本的最后一行。

ajsxfq5m

ajsxfq5m3#

做着和很多人差不多的事。
1.该脚本需要在托管MySql数据库的计算机上运行(这是一台Linux计算机)。
=〉在这台机器"A"上创建一个本地bash或perl脚本(或其他)"myscript"
1.备份必须保存到数据库所在的服务器上。
=〉在脚本"mycript"中,你可以只使用mysqldump.从本地备份中,你可以创建一个tarball,通过scp发送到你的远程机器.最后你可以把你的备份脚本放到crontab(crontab-e).
一些提示和功能,让你开始,因为我不会发布我的整个脚本,它不完全做的伎俩,但不远:

#!/bin/sh
...
MYSQLDUMP="$(which mysqldump)"   
FILE="$LOCAL_TARBALLS/$TARBALL/mysqldump_$db-$SNAPSHOT_DATE.sql"  
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE && $GZIP $GZ_COMPRESSION_LEVEL $FILE   

function create_tarball()
{
local tarball_dir=$1
tar -zpcvf $tarball_dir"_"$SNAPSHOT_DATE".tar.gz" $tarball_dir >/dev/null
return $?
}

function send_tarball()
{
local PROTOCOLE_="2"
local IPV_="4"
local PRESERVE_="p"
local COMPRESSED_="C"
local PORT="-P $DESTINATION_PORT"
local EXECMODE="B"

local SRC=$1
local DESTINATION_DIR=$2
local DESTINATION_HOST=$DESTINATION_USER"@"$DESTINATION_MACHINE":"$DESTINATION_DIR

local COMMAND="scp -$PROTOCOLE_$IPV_$PRESERVE_$COMPRESSED_$EXECMODE $PORT $SRC $DESTINATION_HOST &"

echo "remote copy command: "$COMMAND
[[ $REMOTE_COPY_ACTIVATED = "Yes" ]] && eval $COMMAND

}

然后要删除"date"之前的文件,您可以查看man find并关注mtimenewer选项。
编辑:如前所述,除了temproray文件外,没有人对做本地备份特别感兴趣,以便能够轻松地发送tarball并在发送时删除它。

igetnqfo

igetnqfo4#

您可以使用设置为每30分钟运行一次的单行cronjob来完成大部分操作:

mysqldump -u<user> -p<pass> <database> > /path/to/dumps/db.$(date +%a.%H:%M).dump

这将每30分钟创建一次数据库转储,并且每周都将开始覆盖前一周的转储。
然后再运行一个cronjob,每周运行一次,将最近的转储文件复制到保存快照的单独位置。

vfhzx4xs

vfhzx4xs5#

在简要阅读了这个问题和好的答案之后,我想再补充几点,其中一些已经提到了。

    • 备份过程可能涉及以下步骤:**

1.创建备份
1.压缩备份文件
1.加密压缩备份
1.将备份发送到云(DropBox、OneDrive、GoogleDrive、AmazonS3等)
1.获取有关结果的通知
1.设置计划以定期运行备份过程
1.删除旧的备份文件
要复合一个脚本以涵盖所有备份步骤,您需要付出一定的努力和知识。
我想分享一个link to an article(我是作者之一),它描述了最常用的备份MySQL数据库的方法,并提供了一些细节:
1.巴什脚本

# Backup storage directory  
backup_folder=/var/backups

# Notification email address 
recipient_email=<username@mail.com>

# MySQL user
user=<user_name>

# MySQL password
password=<password>

# Number of days to store the backup 
keep_day=30 

sqlfile=$backup_folder/all-database-$(date +%d-%m-%Y_%H-%M-%S).sql
zipfile=$backup_folder/all-database-$(date +%d-%m-%Y_%H-%M-%S).zip 

# Create a backup 
sudo mysqldump -u $user -p$password --all-databases > $sqlfile 

if [ $? == 0 ]; then
   echo 'Sql dump created' 
else
   echo 'mysqldump return non-zero code' | mailx -s 'No backup was created!' $recipient_email  
   exit 
fi 

# Compress backup 
zip $zipfile $sqlfile 

if [ $? == 0 ]; then
   echo 'The backup was successfully compressed' 
else
   echo 'Error compressing backup' | mailx -s 'Backup was not created!' $recipient_email 
   exit 
fi 

rm $sqlfile 

echo $zipfile | mailx -s 'Backup was successfully created' $recipient_email 

# Delete old backups 
find $backupfolder -mtime +$keep_day -delete

1.自动备份

sudo apt-get install automysqlbackup
wget https://github.com/sixhop/AutoMySQLBackup/archive/master.zip

mkdir /opt/automysqlbackup
mv AutoMySQLBackup-master.zip 
cd /opt/automysqlbackup
tar -zxvf AutoMySQLBackup-master.zip

./install.sh

sudo nano /etc/automysqlbackup/automysqlbackup.conf

CONFIG_configfile="/etc/automysqlbackup/automysqlbackup.conf"
CONFIG_backup_dir='/var/backup/db'
CONFIG_mysql_dump_username='root'
CONFIG_mysql_dump_password='my_password'
CONFIG_mysql_dump_host='localhost'
CONFIG_db_names=('my_db')
CONFIG_db_exclude=('information_schema')
CONFIG_mail_address='mail@google.com'
CONFIG_rotation_daily=6
CONFIG_rotation_weekly=35
CONFIG_rotation_monthly=150

automysqlbackup /etc/automysqlbackup/automysqlbackup.conf

1.第三方工具
希望能有所帮助!

v1l68za4

v1l68za46#

我更喜欢Debian自带的AutoMySQLBackup,它非常简单,可以创建每日备份,并且可以配置。此外,它还可以存储每周备份和每月备份。
我已经运行了一段时间,它的超级容易配置和使用!

t8e9dugd

t8e9dugd7#

您可以考虑使用这个开源工具matiri,https://github.com/AAFC-MBB/matiri,它是一个并发的mysql备份脚本,元数据在Sqlite3中。特性(比您要求的更多...):

  • 多服务器:支持多个MySQL服务器,无论它们位于同一个物理服务器上还是位于不同的物理服务器上。
  • 并行:要备份的服务器上的每个数据库都是单独并行执行的(可设置并发性:默认值:3)
  • 压缩:压缩每个数据库备份
  • 校验和:SHA256对每个压缩备份文件进行存储并对所有文件进行归档
  • 归档:所有数据库备份都存储在一个文件中
  • 记录:存储在Sqlite3数据库中的备份信息

充分披露:matiri的原始作者。

相关问题