# # mysql|备份|windows平台 ## # mysql自动备份到远程服务器|冷备份 先备份到本地服务器 ```{lang} @echo off @chcp 936 set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd )" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r D:\auto_backup\mysql\%outFileName% %database% ``` 通过工具openssh使用SSH协议安全传输文件 工具下载网址 https://github.com/PowerShell/Win32-OpenSSH 安装工具之后会在计算机的防火墙中添加一个规则, OpenSSH-Server-In-TCP,此规则将允许放开端口22. 需要开放端口 配置ssh密钥 对于ssh服务器端有window版本限制 操作过于繁琐 考虑到一般在局域网中进行备份所以改用ftp协议作为文件传输的的新方式 ftp是window自带的功能,直接在window功能中添加即可 在window下创建ftp服务器教程 https://zhuanlan.zhihu.com/p/411646279 ```{lang} @echo off @chcp 936 @rem backup destination set ftpip=192.168.8.84 set ftp_name=ftpuser set ftp_pwd=ftpuser set ftp_path=.\auto_backup\mysql\ set ftp_local_dir=D:\auto_backup\mysql\ set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd )" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r %ftp_local_dir%%outFileName% %database% echo open %ftpip% >ftp.up echo %ftp_name%>>ftp.up echo %ftp_pwd%>>ftp.up echo cd %ftp_path% >> ftp.up echo binary>>ftp.up echo mput %ftp_local_dir%%database%*.sql >>ftp.up echo bye>>ftp.up ftp -s:ftp.up del ftp.up /q @rem pause ``` 备份文件的管理,自动清理多余备份 !n! 和setlocal enabledelayedexpansion搭配使用,批处理命令按行处理,最先进行的是变量的赋值,即将%x%替换成明确的值,然后在执行语句 ```{lang} pushd %ftp_local_dir% setlocal enabledelayedexpansion set n=0 for /f "delims=" %%a in ('dir /a-d-h /b /o-d %database%*.sql') do ( if !n! geq 7 del "%%~a" set /a n+=1 ) popd ``` 最终完整版本 ```{lang} @echo off @chcp 936 @rem backup destination set ftpip=192.168.8.84 set ftp_name=ftpuser set ftp_pwd=ftpuser set ftp_path=.\auto_backup\mysql\ set ftp_local_dir=D:\auto_backup\mysql\ set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd )" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r %ftp_local_dir%%outFileName% %database% pushd %ftp_local_dir% setlocal enabledelayedexpansion set n=0 for /f "delims=" %%a in ('dir /a-d-h /b /o-d %database%*.sql') do ( if !n! geq 7 del "%%~a" set /a n+=1 ) popd echo open %ftpip% >ftp.up echo %ftp_name%>>ftp.up echo %ftp_pwd%>>ftp.up echo cd %ftp_path% >> ftp.up echo prompt yes >> ftp.up echo mdelete %database%*.sql >> ftp.up echo binary>>ftp.up echo mput %ftp_local_dir%%database%*.sql >>ftp.up echo bye>>ftp.up ftp -s:ftp.up del ftp.up /q pause ``` 后记,windowftp服务器搭建以及计划任务程序注意事项 添加Ftp功能: 启用或关闭windows功能-internet information services-FTP服务器 + web管理工具 添加用户: windows管理工具-计算机管理-本地用户和组-用户(右击-新用户):用户名ftpuser 密码: ftpuser 仅勾选用户不能更改密码和密码永不过期 其余不要勾选 建站: 管理工具-Internet Information Services (IIS)管理器 网站(右击):添加ftp服务器-规定物理路径 (随意) 数据库所在服务器要手动创建文件夹D:\auto_backup\mysql\ 计划任务 taskschd.msc 服务 service.msc 计算机管理 compmgmt.msc ## # 热备份|xtrabackup|wsl|linux|window子系统 > **参考自** > [Percona XtraBackup for Windows](https://www.percona.com/blog/percona-xtrabackup-for-windows/) > [使用 WSL 在 Windows 上运行 XtraBackup](http://patg.net/mysql,windows/10,wsl,backups/2017/09/03/xtrabackup-wsl/) > [Incremental Backup](https://docs.percona.com/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html#creating-an-incremental-backup) > [Problem with running xtrabackup 24 in debian with WSL2](https://forums.percona.com/t/problem-with-running-xtrabackup-24-in-debian-with-wsl2/14252/14) > [Linux修改open files数及ulimit和file-max的区别](https://blog.csdn.net/qq_26614295/article/details/81502338) > https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.4 生产环境无法进行完整备份,因为数据库24小时都在周期性高强度运行,备份严重影响了系统的稳定性。 xtrabackup的优点:热备份 ,详细的看官网介绍吧 本地测试,搭建环境 > **环境** > windows server 2019 version: 1809 > 数据库 mysql 5.7.38 1. 安装WSL(windows subsystem linux),用于执行xtrabackup。 > **参考教程** > 由于window版本少于1904 所以只能使用旧版WSL的手动安装方法,无法安装WSL 2,所以参考以下教程 > https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-1---enable-the-windows-subsystem-for-linux ```{lang} # 启用WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 装所选的 Linux 分发 curl.exe -L -o ubuntu-2004.appx https://aka.ms/wslubuntu2004 # 安装linux Add-AppxPackage .\ubuntu-2004.appx # 最后必须要手动点开开始菜单里刚安装上的ubuntu,等待它完成初始化之后,才能在powershell通过执行`bash`命令来随时随地进入linux系统 # 但是如果是通过ssh连接的window,无法手动点击开始菜单里的应用,那么只能通过powershell来启动windows的内置应用了。 Get-Package #该命令只能展示第三方应用 # 因为ubuntu属于universal windows app(UWP),因为windows自身限制所以很难直接找到其安装目录,所以可以通过以下命令获取到全部的UWP应用信息 PS C:\Users\fqq> Get-AppxPackage| findstr.exe /n "Ubuntu" 507:Name : CanonicalGroupLimited.UbuntuonWindows 512:PackageFullName : CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndgsc 513:InstallLocation : C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndg 516:PackageFamilyName : CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc 522:Dependencies : {CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-150_79rhkp1fndgsc, Canon 523: icalGroupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-100_79rhkp1fndgsc, CanonicalGr 524: oupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-125_79rhkp1fndgsc} # 通过以上命令可以得到ubuntu应用的name和PackageFamilyName,当然还有installLocation,但是该地址是无法访问的,紧接着,我们要启动它该如何做呢,通过简单的查找来直接启动 explorer.exe shell:appsFolder\!ubuntu # 只需要把PackageFamilyName替换成你刚刚查询出来的即可 explorer.exe shell:appsFolder\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc!ubuntu ``` ## # 等一会之后,在命令行中执行bash即可进入ubuntu > **如果bash命令无效说明ubuntu没有安装完成** > 可能是当前登录windows的账户和登录ssh的账户不是同一个,所以无法通过命令行打开图形化界面所以就无法完成ubuntu的安装。 > 所以只能手动执行ubuntu.exe执行文件,但是该文件受windows保护无法执行,最终参考[retoch的评论解决了该问题](https://github.com/microsoft/WSL/discussions/2323) > > ```{lang} > I have solved the issue for me. I noticed that unbuntu.exe in the path > C:\Users\\AppData\Local\Microsoft\WindowsApps\ was 0kb and had no icon. > I copied everything from: > C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_1604.2017.922.0_x64__79rhkp1fndgsc > Into: > C:\Users\\AppData\Local\Microsoft\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc > Ran unbuntu.exe from inside the Canonical... folder in the user AppData dir, and everything installed perfectly. > ``` > **如何使用root自动进入WSL** > 完成ubuntu安装的过程中,会让创建新的用户和密码,但是不想执行命令时时候还要输入密码,想要以root身份自动进入到WSL中,该怎么做呢, > 进入到包含 ubuntu.exe 的目录 , 参考上面如果bash命令无效说明ubuntu没有安装完成这里的目录,执行一下命令 > > ```{lang} > .\ubuntu.exe config --default-user root > ``` > > 大功告成,以后执行bash 就可以 以root身份直接进入到wsl中了 ## # 安装xtrabackup ```{lang} apt-get update apt-get install lsb wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb percona-release enable-only tools apt-get update apt install percona-xtrabackup-24 apt install qpress ``` > **怎么卸载?** > sudo apt remove percona-xtrabackup-24 ## # 进行全备份 创建一个配置文件,名为my.ini,放在windows的E:/jordanDatabaseBackup目录下,其挂载在linux子系统的/mnt/e/jordanDatabaseBackup目录上,即E:/=/mnt/e/ 编辑文件,添加一下内容 ```{lang} [mysqld] datadir ="/mnt/e/BtSoft/mysql/MySQL5.7/data/" innodb_data_home_dir = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" ``` ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --backup --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base ``` > **'datadir'配置错误** > > ```{lang} > Warning: MySQL variable 'datadir' points to nonexistent directory 'E:\BtSoft\mysql\MySQL5.7\data\' > Warning: option 'datadir' has different values: > '/mnt/e/BtSoft/mysql/MySQL5.7/data/' in defaults file > 'E:\BtSoft\mysql\MySQL5.7\data\' in SHOW VARIABLES > ``` > > 通过查询mysql5.7文档得知,innodb_undo_directory如果不设置的话,默认值是 数据文件夹下,即 服务器端配置文件my.ini的datadir参数。 > The innodb_undo_directory variable defines the location of undo tablespace files. If the > innodb_undo_directory variable is undefined, undo tablespaces reside in the data directory. > 所以为了能让linux下找到该目录,我们需要在/mnt/e/jordanDatabaseBackup/my.ini中再增加一行 > > ```{lang} > [mysqld] > datadir ="/mnt/e/BtSoft/mysql/MySQL5.7/data/" > innodb_data_home_dir = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" > innodb_undo_directory = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" > ``` > **World-writable config file error** > > ```{lang} > xtrabackup: [Warning] World-writable config file '/mnt/f/jordanDatabaseBackup/my.ini' is ignored. > xtrabackup: recognized server arguments: --parallel=4 > xtrabackup: [Warning] World-writable config file '/mnt/f/jordanDatabaseBackup/my.ini' is ignored. > ``` > > my.ini配置文件所有人都可以修改不安全,修改一下访问权限就可以了 > **Too many open files** > 1.修改file-max > > ```{lang} > # echo 6553560 > /proc/sys/fs/file-max //sysctl -w "fs.file-max=34166",前面2种重启机器后会恢复为默认值 > vim /etc/sysctl.conf, 加入以下内容,重启生效 > fs.file-max = 6553560 > ``` > > 2.修改ulimit的open file,系统默认的ulimit对文件打开数量的限制是1024 > > ```{lang} > # ulimit -HSn 102400 //这只是在当前终端有效,退出之后,open files又变为默认值。当然也可以写到/etc/profile中,因为每次登录终端时,都会自动执行/etc/profile > 或 > # vim /etc/security/limits.conf //加入以下配置,重启即可生效 > * soft nofile 65535 > * hard nofile 65535 > ``` ## # 进行增量备份(必须有全备份才行) ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --backup --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/inc1 --incremental-basedir=/mnt/e/jordanDatabaseBackup/base ``` ## # 为还原数据做准备 ```{lang} # To prepare the base backup xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --prepare --apply-log-only --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base # 将第一个增量备份应用到完整备份(如果是最后一个增量备份 就不需要使用--apply-log-only参数) xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --prepare --apply-log-only --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base --incremental-dir=/mnt/e/jordanDatabaseBackup/inc1 ``` ## # 开始还原备份 > **警告** > 在还原备份之前,需要准备备份。 > **还原到任意服务器** > 您可以在任何计算机上运行准备操作;它不需要位于原始服务器或要还原到的服务器上。您可以将备份复制到实用程序服务器并在那里进行准备。 > 但需要注意的是 ,如果要在别的服务器上还原的话,最好是纯净版的mysql,卸载重新安装,不然会出现无法启动mysql服务器的情况 > 如果使用宝塔面板安装的mysql 在设置root密码的时候要设置的和备份mysql 的root密码一致。否则无法登录到mysql > **开始前必须清空datadir** > 要将 mysql的data目录清空,/path/to/mysql/data/里面不能有东西 > 在执行还原之前,需要关闭MySQL服务器。您无法还原到正在运行的 mysqld 实例(导入部分备份时除外) ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --copy-back --parallel=2 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base ``` ## # 压缩备份,便于传输 有时候,想要将备份文件放到远程服务器上,为了更快的传输文件,可以再备份的过程中压缩文件,既节省了空间又能节省传输流量,加快传输速度 ```{lang} # 压缩 xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/compressed/ # 如果想要更小,可以使用压缩工具进一步压缩,即时间换空间。 这里使用7za #安装工具 apt install p7zip-full # 使用方法 参考以下链接 参考[7za](https://frunoob.github.io/list/20220507141201.html#_7za) # 解压 (不保留源文件) xtrabackup --decompress --remove-original --target-dir=/data/compressed/ ``` ## # 运维 写个脚本,把脚本添加到crontab自动任务,每天执行一次,流程如下: 首先创建全备份 xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/base 紧接着创建第一次增量备份 xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d") --incremental-basedir=/mnt/f/jordanDatabaseBackup/base 以上是基础备份,为之后每天自动增量备份做准备, 接下来是每天执行一次的备份脚本 ```{lang} ulimit -HSn 102400 echo 6553560 > /proc/sys/fs/file-max xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d") --incremental-basedir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d" -d "1 day ago") ``` 增量备份文件都放到了incr下,并以日期命名了。 定时任务 > **关于WSL自动关机** > 参考[FAQ](https://learn.microsoft.com/en-us/windows/wsl/faq) > 如果没有通过bash访问WSL,windows会自动关闭WSL并清理资源,所以要一直保持SSH连接才能保证WSL服务一直运行。 > 所以定时任务是在bash保持打开的前提下实现的,如果没法一直保持bash,可以写powershell脚本,在windows里定时启动WSL,进入linux,执行sh脚本。 > **关于crontab配置文件** > 最好别在这里写脚本,而是执行脚本文件,以防脚本执行异常或者日志无法存储等问题 ```{lang} # 为当前用户创建定时任务 #进入到当前用户的crontab配置文件以添加定时任务 crontab -e # 在打开的文件中添加定时任务(每天执行一次), 10 0 * * * bash /path/to/auto.sh ``` 将定时任务的结果以邮件的形式发发送给自己 获取qq邮箱的的授权码,百度一下,很多教程 ```{lang} # 安装依赖 apt-get install ssmtp apt-get install mailutils # 修改配置文件 nano /etc/ssmtp/ssmtp.conf root=frunoob@qq.com mailhub=smtp.qq.com:465 AuthUser=frunoob@qq.com AuthPass=asfasdfasfasf hostname=ffff UseTLS=Yes nano /etc/ssmtp/revaliases root:frunoob@qq.com:smtp.qq.com:465 # 测试 如果上一条命令执行成功就发送邮件给frunoob@qq.com (text.txt代表邮件的内容) 这里写要执行的命令,如果执行过程中没有出错就发送成功的消息,出错了由crontab自动发送错误信息(前提是需要在crontab -e 编辑文件时配置好 MAILTO=example@mail.com) if [ $? -eq 0 ]; then mail -s "邮件主题" frunoob@qq.com < test.txt fi ``` Loading... # # mysql|备份|windows平台 ## # mysql自动备份到远程服务器|冷备份 先备份到本地服务器 ```{lang} @echo off @chcp 936 set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd <database>)" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r D:\auto_backup\mysql\%outFileName% %database% ``` 通过工具openssh使用SSH协议安全传输文件 工具下载网址 https://github.com/PowerShell/Win32-OpenSSH 安装工具之后会在计算机的防火墙中添加一个规则, OpenSSH-Server-In-TCP,此规则将允许放开端口22. 需要开放端口 配置ssh密钥 对于ssh服务器端有window版本限制 操作过于繁琐 考虑到一般在局域网中进行备份所以改用ftp协议作为文件传输的的新方式 ftp是window自带的功能,直接在window功能中添加即可 在window下创建ftp服务器教程 https://zhuanlan.zhihu.com/p/411646279 ```{lang} @echo off @chcp 936 @rem backup destination set ftpip=192.168.8.84 set ftp_name=ftpuser set ftp_pwd=ftpuser set ftp_path=.\auto_backup\mysql\ set ftp_local_dir=D:\auto_backup\mysql\ set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd <database>)" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r %ftp_local_dir%%outFileName% %database% echo open %ftpip% >ftp.up echo %ftp_name%>>ftp.up echo %ftp_pwd%>>ftp.up echo cd %ftp_path% >> ftp.up echo binary>>ftp.up echo mput %ftp_local_dir%%database%*.sql >>ftp.up echo bye>>ftp.up ftp -s:ftp.up del ftp.up /q @rem pause ``` 备份文件的管理,自动清理多余备份 !n! 和setlocal enabledelayedexpansion搭配使用,批处理命令按行处理,最先进行的是变量的赋值,即将%x%替换成明确的值,然后在执行语句 ```{lang} pushd %ftp_local_dir% setlocal enabledelayedexpansion set n=0 for /f "delims=" %%a in ('dir /a-d-h /b /o-d %database%*.sql') do ( if !n! geq 7 del "%%~a" set /a n+=1 ) popd ``` 最终完整版本 ```{lang} @echo off @chcp 936 @rem backup destination set ftpip=192.168.8.84 set ftp_name=ftpuser set ftp_pwd=ftpuser set ftp_path=.\auto_backup\mysql\ set ftp_local_dir=D:\auto_backup\mysql\ set NAMES=utf8 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set now=%date:~0,4%%date:~5,2%%date:~8,2%%hour%%time:~3,2%%time:~6,2% if "%1"=="" echo "please input database name, using comman like (mysqlbackup.cmd <database>)" if "%1"=="" goto:EOF set database=%1 set outFileName=%database%_%now%.sql mysqldump -q -u root --password=root -r %ftp_local_dir%%outFileName% %database% pushd %ftp_local_dir% setlocal enabledelayedexpansion set n=0 for /f "delims=" %%a in ('dir /a-d-h /b /o-d %database%*.sql') do ( if !n! geq 7 del "%%~a" set /a n+=1 ) popd echo open %ftpip% >ftp.up echo %ftp_name%>>ftp.up echo %ftp_pwd%>>ftp.up echo cd %ftp_path% >> ftp.up echo prompt yes >> ftp.up echo mdelete %database%*.sql >> ftp.up echo binary>>ftp.up echo mput %ftp_local_dir%%database%*.sql >>ftp.up echo bye>>ftp.up ftp -s:ftp.up del ftp.up /q pause ``` 后记,windowftp服务器搭建以及计划任务程序注意事项 添加Ftp功能: 启用或关闭windows功能-internet information services-FTP服务器 + web管理工具 添加用户: windows管理工具-计算机管理-本地用户和组-用户(右击-新用户):用户名ftpuser 密码: ftpuser 仅勾选用户不能更改密码和密码永不过期 其余不要勾选 建站: 管理工具-Internet Information Services (IIS)管理器 网站(右击):添加ftp服务器-规定物理路径 (随意) 数据库所在服务器要手动创建文件夹D:\auto_backup\mysql\ 计划任务 taskschd.msc 服务 service.msc 计算机管理 compmgmt.msc ## # 热备份|xtrabackup|wsl|linux|window子系统 > **参考自** > [Percona XtraBackup for Windows](https://www.percona.com/blog/percona-xtrabackup-for-windows/) > [使用 WSL 在 Windows 上运行 XtraBackup](http://patg.net/mysql,windows/10,wsl,backups/2017/09/03/xtrabackup-wsl/) > [Incremental Backup](https://docs.percona.com/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html#creating-an-incremental-backup) > [Problem with running xtrabackup 24 in debian with WSL2](https://forums.percona.com/t/problem-with-running-xtrabackup-24-in-debian-with-wsl2/14252/14) > [Linux修改open files数及ulimit和file-max的区别](https://blog.csdn.net/qq_26614295/article/details/81502338) > https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.4 生产环境无法进行完整备份,因为数据库24小时都在周期性高强度运行,备份严重影响了系统的稳定性。 xtrabackup的优点:热备份 ,详细的看官网介绍吧 本地测试,搭建环境 > **环境** > windows server 2019 version: 1809 > 数据库 mysql 5.7.38 1. 安装WSL(windows subsystem linux),用于执行xtrabackup。 > **参考教程** > 由于window版本少于1904 所以只能使用旧版WSL的手动安装方法,无法安装WSL 2,所以参考以下教程 > https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-1---enable-the-windows-subsystem-for-linux ```{lang} # 启用WSL功能 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 装所选的 Linux 分发 curl.exe -L -o ubuntu-2004.appx https://aka.ms/wslubuntu2004 # 安装linux Add-AppxPackage .\ubuntu-2004.appx # 最后必须要手动点开开始菜单里刚安装上的ubuntu,等待它完成初始化之后,才能在powershell通过执行`bash`命令来随时随地进入linux系统 # 但是如果是通过ssh连接的window,无法手动点击开始菜单里的应用,那么只能通过powershell来启动windows的内置应用了。 Get-Package #该命令只能展示第三方应用 # 因为ubuntu属于universal windows app(UWP),因为windows自身限制所以很难直接找到其安装目录,所以可以通过以下命令获取到全部的UWP应用信息 PS C:\Users\fqq> Get-AppxPackage| findstr.exe /n "Ubuntu" 507:Name : CanonicalGroupLimited.UbuntuonWindows 512:PackageFullName : CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndgsc 513:InstallLocation : C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_x64__79rhkp1fndg 516:PackageFamilyName : CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc 522:Dependencies : {CanonicalGroupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-150_79rhkp1fndgsc, Canon 523: icalGroupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-100_79rhkp1fndgsc, CanonicalGr 524: oupLimited.UbuntuonWindows_2004.2021.825.0_neutral_split.scale-125_79rhkp1fndgsc} # 通过以上命令可以得到ubuntu应用的name和PackageFamilyName,当然还有installLocation,但是该地址是无法访问的,紧接着,我们要启动它该如何做呢,通过简单的查找来直接启动 explorer.exe shell:appsFolder\<PackageFamilyName>!ubuntu # 只需要把PackageFamilyName替换成你刚刚查询出来的即可 explorer.exe shell:appsFolder\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc!ubuntu ``` ## # 等一会之后,在命令行中执行bash即可进入ubuntu > **如果bash命令无效说明ubuntu没有安装完成** > 可能是当前登录windows的账户和登录ssh的账户不是同一个,所以无法通过命令行打开图形化界面所以就无法完成ubuntu的安装。 > 所以只能手动执行ubuntu.exe执行文件,但是该文件受windows保护无法执行,最终参考[retoch的评论解决了该问题](https://github.com/microsoft/WSL/discussions/2323) > > ```{lang} > I have solved the issue for me. I noticed that unbuntu.exe in the path > C:\Users\<username>\AppData\Local\Microsoft\WindowsApps\ was 0kb and had no icon. > I copied everything from: > C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_1604.2017.922.0_x64__79rhkp1fndgsc > Into: > C:\Users\<username>\AppData\Local\Microsoft\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc > Ran unbuntu.exe from inside the Canonical... folder in the user AppData dir, and everything installed perfectly. > ``` > **如何使用root自动进入WSL** > 完成ubuntu安装的过程中,会让创建新的用户和密码,但是不想执行命令时时候还要输入密码,想要以root身份自动进入到WSL中,该怎么做呢, > 进入到包含 ubuntu.exe 的目录 , 参考上面<code>如果bash命令无效说明ubuntu没有安装完成</code>这里的目录,执行一下命令 > > ```{lang} > .\ubuntu.exe config --default-user root > ``` > > 大功告成,以后执行bash 就可以 以root身份直接进入到wsl中了 ## # 安装xtrabackup ```{lang} apt-get update apt-get install lsb wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb percona-release enable-only tools apt-get update apt install percona-xtrabackup-24 apt install qpress ``` > **怎么卸载?** > <code>sudo apt remove percona-xtrabackup-24</code> ## # 进行全备份 创建一个配置文件,名为my.ini,放在windows的E:/jordanDatabaseBackup目录下,其挂载在linux子系统的/mnt/e/jordanDatabaseBackup目录上,即E:/=/mnt/e/ 编辑文件,添加一下内容 ```{lang} [mysqld] datadir ="/mnt/e/BtSoft/mysql/MySQL5.7/data/" innodb_data_home_dir = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" ``` ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --backup --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base ``` > **'datadir'配置错误** > > ```{lang} > Warning: MySQL variable 'datadir' points to nonexistent directory 'E:\BtSoft\mysql\MySQL5.7\data\' > Warning: option 'datadir' has different values: > '/mnt/e/BtSoft/mysql/MySQL5.7/data/' in defaults file > 'E:\BtSoft\mysql\MySQL5.7\data\' in SHOW VARIABLES > ``` > > 通过查询mysql5.7文档得知,<code>innodb_undo_directory</code>如果不设置的话,默认值是 数据文件夹下,即 服务器端配置文件<code>my.ini</code>的<code>datadir</code>参数。 > The innodb_undo_directory variable defines the location of undo tablespace files. If the > innodb_undo_directory variable is undefined, undo tablespaces reside in the data directory. > 所以为了能让linux下找到该目录,我们需要在<code>/mnt/e/jordanDatabaseBackup/my.ini</code>中再增加一行 > > ```{lang} > [mysqld] > datadir ="/mnt/e/BtSoft/mysql/MySQL5.7/data/" > innodb_data_home_dir = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" > innodb_undo_directory = "/mnt/e/BtSoft/mysql/MySQL5.7/data/" > ``` > **World-writable config file error** > > ```{lang} > xtrabackup: [Warning] World-writable config file '/mnt/f/jordanDatabaseBackup/my.ini' is ignored. > xtrabackup: recognized server arguments: --parallel=4 > xtrabackup: [Warning] World-writable config file '/mnt/f/jordanDatabaseBackup/my.ini' is ignored. > ``` > > my.ini配置文件所有人都可以修改不安全,修改一下访问权限就可以了 > **Too many open files** > 1.修改file-max > > ```{lang} > # echo 6553560 > /proc/sys/fs/file-max //sysctl -w "fs.file-max=34166",前面2种重启机器后会恢复为默认值 > vim /etc/sysctl.conf, 加入以下内容,重启生效 > fs.file-max = 6553560 > ``` > > 2.修改ulimit的open file,系统默认的ulimit对文件打开数量的限制是1024 > > ```{lang} > # ulimit -HSn 102400 //这只是在当前终端有效,退出之后,open files又变为默认值。当然也可以写到/etc/profile中,因为每次登录终端时,都会自动执行/etc/profile > 或 > # vim /etc/security/limits.conf //加入以下配置,重启即可生效 > * soft nofile 65535 > * hard nofile 65535 > ``` ## # 进行增量备份(必须有全备份才行) ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --backup --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/inc1 --incremental-basedir=/mnt/e/jordanDatabaseBackup/base ``` ## # 为还原数据做准备 ```{lang} # To prepare the base backup xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --prepare --apply-log-only --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base # 将第一个增量备份应用到完整备份(如果是最后一个增量备份 就不需要使用--apply-log-only参数) xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --prepare --apply-log-only --parallel=4 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base --incremental-dir=/mnt/e/jordanDatabaseBackup/inc1 ``` ## # 开始还原备份 > **警告** > 在还原备份之前,需要准备备份。 > **还原到任意服务器** > 您可以在任何计算机上运行准备操作;它不需要位于原始服务器或要还原到的服务器上。您可以将备份复制到实用程序服务器并在那里进行准备。 > 但需要注意的是 ,如果要在别的服务器上还原的话,最好是纯净版的mysql,卸载重新安装,不然会出现无法启动mysql服务器的情况 > 如果使用宝塔面板安装的mysql 在设置root密码的时候要设置的和备份mysql 的root密码一致。否则无法登录到mysql > **开始前必须清空datadir** > 要将 mysql的data目录清空,<code>/path/to/mysql/data/</code>里面不能有东西 > 在执行还原之前,需要关闭MySQL服务器。您无法还原到正在运行的 mysqld 实例(导入部分备份时除外) ```{lang} xtrabackup --defaults-file=/mnt/e/jordanDatabaseBackup/my.ini --copy-back --parallel=2 --password=JMDFCunsUm2Kpvxc --user=root --host=192.168.186.140 --port=3306 --target-dir=/mnt/e/jordanDatabaseBackup/base ``` ## # 压缩备份,便于传输 有时候,想要将备份文件放到远程服务器上,为了更快的传输文件,可以再备份的过程中压缩文件,既节省了空间又能节省传输流量,加快传输速度 ```{lang} # 压缩 xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/compressed/ # 如果想要更小,可以使用压缩工具进一步压缩,即时间换空间。 这里使用7za #安装工具 apt install p7zip-full # 使用方法 参考以下链接 参考[7za](https://frunoob.github.io/list/20220507141201.html#_7za) # 解压 (不保留源文件) xtrabackup --decompress --remove-original --target-dir=/data/compressed/ ``` ## # 运维 写个脚本,把脚本添加到crontab自动任务,每天执行一次,流程如下: 首先创建全备份 xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/base 紧接着创建第一次增量备份 xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d") --incremental-basedir=/mnt/f/jordanDatabaseBackup/base 以上是基础备份,为之后每天自动增量备份做准备, 接下来是每天执行一次的备份脚本 ```{lang} ulimit -HSn 102400 echo 6553560 > /proc/sys/fs/file-max xtrabackup --defaults-file=/mnt/f/jordanDatabaseBackup/my.ini --backup --password=4123fgadfsdfasfasdfasf --user=root --host=127.0.0.1 --port=3306 --parallel=4 --target-dir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d") --incremental-basedir=/mnt/f/jordanDatabaseBackup/incr/$(date "+%Y-%m-%d" -d "1 day ago") ``` 增量备份文件都放到了incr下,并以日期命名了。 定时任务 > **关于WSL自动关机** > 参考[FAQ](https://learn.microsoft.com/en-us/windows/wsl/faq) > 如果没有通过bash访问WSL,windows会自动关闭WSL并清理资源,所以要一直保持SSH连接才能保证WSL服务一直运行。 > 所以定时任务是在bash保持打开的前提下实现的,如果没法一直保持bash,可以写powershell脚本,在windows里定时启动WSL,进入linux,执行sh脚本。 > **关于crontab配置文件** > 最好别在这里写脚本,而是执行脚本文件,以防脚本执行异常或者日志无法存储等问题 ```{lang} # 为当前用户创建定时任务 #进入到当前用户的crontab配置文件以添加定时任务 crontab -e # 在打开的文件中添加定时任务(每天执行一次), 10 0 * * * bash /path/to/auto.sh ``` 将定时任务的结果以邮件的形式发发送给自己 获取qq邮箱的的授权码,百度一下,很多教程 ```{lang} # 安装依赖 apt-get install ssmtp apt-get install mailutils # 修改配置文件 nano /etc/ssmtp/ssmtp.conf root=frunoob@qq.com mailhub=smtp.qq.com:465 AuthUser=frunoob@qq.com AuthPass=asfasdfasfasf hostname=ffff UseTLS=Yes nano /etc/ssmtp/revaliases root:frunoob@qq.com:smtp.qq.com:465 # 测试 如果上一条命令执行成功就发送邮件给frunoob@qq.com (text.txt代表邮件的内容) 这里写要执行的命令,如果执行过程中没有出错就发送成功的消息,出错了由crontab自动发送错误信息(前提是需要在crontab -e 编辑文件时配置好 MAILTO=example@mail.com) if [ $? -eq 0 ]; then mail -s "邮件主题" frunoob@qq.com < test.txt fi ``` 最后修改:2025 年 07 月 14 日 © 允许规范转载 赞 别打赏,我怕忍不住购买辣条与续命水