第34讲:MySQL中常用的几种存储引擎以及如何选择

本文详细介绍了MySQL中常用的三种存储引擎:InnoDB、MyISAM和Memory。InnoDB作为默认存储引擎,支持事务、行级锁和外键;MyISAM注重访问速度,但不支持事务;Memory引擎数据存储在内存,适用于临时表。根据应用场景和需求,选择合适的存储引擎至关重要。

1.MySQL中常用的存储引擎

在MySQL数据库中常用的存储引擎有InnoDB、MyISAM和Memory。

2.InnoDB存储引擎

2.1.InnoDB存储引擎的特点

InnoDB是一种兼顾可靠性和高性能的通用存储引擎,使用的最为广泛,在MySQL 5.5版本之后,InnoDB是默认的MySQL数据库存储引擎。

InnoDB存储引擎的特点如下:

  • 任何增删改查的语句都支持事务操作,都遵循ACID模型,也就是事务的四种模型。
  • 支持行级锁,提高并发访问的性能。
  • 支持外键FOREIGN KEY约束,保证数据的完整性和正确性。

InnoDB存储引擎数据文件的特点:

  • 使用InnoDB存储引擎后,默认情况下,每张表都会有一张对应的表空间文件。
  • 表空间的命名格式是{表名}.ibd,在表空间中会记录该张表的表结构、数据以及索引。
  • 在早期版本的InnoDB引擎中,表结构是存放在frm文件中的,在MySQL8.0后,表结构存放在sdi数据字典里,但是数据字典也集成在了ibd文件中,因此一张表空间文件会记录该表的表结构、数据和索引。

innodb_file_per_table参数可以设置是否开启每张表都拥有一个表空间文件,默认开启,通过show vari

<think>我们正在解决用户在Windows下使用WinRAR压缩MySQL备份文件时出现的错误:“无法创建 'E:\MySQL_Backup\db_im_20251020_093921.rar',文件名、目录名或卷标语法不正确” 根据错误信息,问题在于创建RAR文件时路径或文件名不正确。我们需要注意以下几点: 1. 路径中是否包含非法字符(例如:冒号、星号、问号等,但这里文件名是时间戳,通常不会包含非法字符) 2. 路径是否过长(Windows路径最大长度为260个字符,但这里路径看起来不长) 3. 目标目录是否存在,是否有写入权限 4. 日期时间格式中可能包含空格或特殊的分隔符导致问题 回顾用户提供的脚本,我们设置文件名的方式如下: set DATE_PART=%date:~0,4%%date:~5,2%%date:~8,2% set TIME_PART=%time:~0,2%%time:~3,2% 注意:%date%和%time%的格式因系统区域设置不同而不同。比如,有些系统返回的日期格式可能是“2025/10/20”或“2025-10-20”甚至是“20/10/2025”,时间格式可能包含空格(当小时为个位数时,前面会补空格而不是0)。 在用户脚本中,我们处理时间部分时: if %time:~0,2% lss 10 (set TIME_PART=0%time:~1,1%%time:~3,2%) else (set TIME_PART=%time:~0,2%%time:~3,2%) 这样处理了小时是个位数时补0,但是日期部分直接截取,如果日期格式中包含“/”或“-”等分隔符,那么生成的字符串中就会包含这些分隔符,导致文件名非法。 例如:如果%date%返回的是“2025/10/20”,那么DATE_PART就会是“20251020”(注意:截取位置不对,因为分隔符占位置)。实际上,我们原意是取年、月、日,但分隔符的存在会导致我们取到的字符串中包含分隔符吗? 观察用户原来的代码:%date:~0,4%是取4位年,%date:~5,2%是取月(从索引5开始取2位),%date:~8,2%是取日(从索引8开始取2位)。这种截取方式要求日期格式必须是“yyyy-mm-dd”或者“yyyy/mm/dd”这样固定分隔符且位置固定的格式。但如果系统日期格式是“dd/mm/yyyy”就会出错。 因此,我们需要确保生成的日期字符串中不包含非法字符。一个更好的做法是使用数字格式的日期,去掉所有非数字字符。 另外,错误信息中的文件名是:db_im_20251020_093921.rar,看起来日期部分没有问题(20251020)和时间部分(093921)也没有问题。那么问题可能出在路径上?注意路径中的“E:\MySQL_Backup”是否存在?是否有写入权限? 但是用户错误提示中给出的路径是“E:\MySQL_Backup\db_im_20251020_093921.rar”,这个路径看起来是合法的。因此,我们还需要考虑: 5. WinRAR命令行中路径包含空格时需要用引号括起来,但我们在脚本中已经用了引号。 6. 另一个可能的原因是:在调用WinRAR时,目标文件名(即RAR_FILE)可能因为某种原因包含了不可见的字符(如回车、换行等),导致路径语法不正确。 解决方案步骤: 第一步:确保备份目录存在且有写入权限。 第二步:检查生成的SQL_FILE和RAR_FILE变量是否包含非法字符(特别是日期时间部分)。 第三步:在调用WinRAR命令之前,先输出RAR_FILE的值,以便调试。 改进脚本,避免日期格式问题: 我们可以使用另一种获取日期时间的方式,比如使用wmic命令获取标准格式的日期和时间,这样不依赖本地设置。 例如: set datetime_str=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% 这种方式依赖于日期格式。更可靠的方式是使用: for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set datetime_str=%%a set datetime_str=%datetime_str:~0,8%_%datetime_str:~8,6% set datetime_str=%datetime_str: =0% 将空格替换为0(因为时间部分可能不足6位,前面用空格填充,我们需要替换为0) 但这样获取的日期时间是一个连续的数字字符串,没有分隔符,例如:20251020123456(表示2025年10月20日12点34分56秒) 然后我们可以用这个datetime_str作为文件名的一部分。 另外,我们也要确保路径中不包含非法字符,特别是从环境变量获取的路径。 考虑到用户可能不想改变日期格式的获取方式(因为wmic命令在某些系统可能较慢),我们可以先尝试在原有基础上修复。 根据错误信息,文件名中包含了日期20251020和时间093921,看起来是正常的。那么问题可能出在路径字符串的末尾有回车符或空格?我们可以使用以下技巧去除变量值的空格和回车: set RAR_FILE=%RAR_FILE: =% 但这也会去掉中间的空格,而我们的路径中不应该有空格(除了驱动器字母和路径之间的空格,如"E:\MySQL_Backup"没有空格)。所以我们可以尝试在设置变量时去掉变量值两端的空格(批处理中变量赋值默认会保留空格,但等号两边不要有空格)。 在批处理中,等号两边的空格会被包含进变量值。例如: set VAR = value (这是错误的,变量名会是"VAR ",值前面有一个空格) set VAR=value (正确) 检查脚本中设置变量的等号两边是否有空格?在用户提供的脚本中没有。 另一个思路:在调用WinRAR命令时,路径使用短文件名(8.3格式)以避免长文件名和特殊字符问题。我们可以使用短路径格式。 我们可以使用`%BACKUP_DIR%`的短路径,方法是用`%BACKUP_DIR:~s%`,但这样使用需要在变量上应用。我们可以这样: for %%I in ("%BACKUP_DIR%") do set SHORT_BACKUP_DIR=%%~sI 然后使用短路径来生成RAR_FILE和SQL_FILE。 但是,由于错误提示中已经显示了完整的路径,而且看起来路径是正常的,所以这个问题出现的可能性不大。 考虑到错误信息:“无法创建 ... 文件名、目录名或卷标语法不正确”,我们可以先简化问题,尝试以下步骤: 1. 手动创建该文件(在E:\MySQL_Backup目录下创建一个名为db_im_20251020_093921.rar的文件)是否成功?如果手动创建失败,说明文件名确实非法(但根据名字来看是合法的),或者目录不存在,或者权限问题。 2. 检查备份目录路径是否包含特殊字符?比如在路径末尾有不可见的字符(如换行符)? 3. 在脚本中,将RAR_FILE设置为一个简单的固定路径文件名,例如:E:\test.rar,看是否能够创建。如果固定路径可以,那么问题就出在日期时间格式上。 4. 在脚本中,输出RAR_FILE的值,并在执行WinRAR命令之前暂停,让用户看到实际生成的路径字符串,确认是否有问题。 由于我们无法直接运行用户的环境,我们可以提供一个更健壮的脚本,包括: - 使用wmic获取标准日期时间 - 确保路径变量没有多余空格 - 检查目录是否存在,不存在则创建 - 在WinRAR命令中使用引号包裹路径(用户已经做了) 下面提供一个改进的脚本,使用wmic获取日期时间,避免日期格式问题。 同时,我们也要注意:如果备份目录路径中包含空格,我们需要用引号括起来,而WinRAR的命令行参数中,路径包含空格时也需要引号。我们已经用引号括起来了。 改进后的脚本如下: ```batch @echo off setlocal enabledelayedexpansion rem ===== 配置区域 ===== set MYSQL_BIN="C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" set WINRAR_PATH="C:\Program Files\WinRAR\WinRAR.exe" set DB_USER=root set DB_PASSWORD=your_password set DB_NAME=your_database set BACKUP_DIR=E:\MySQL_Backup rem 备份存储目录 rem ===== 使用wmic获取标准日期时间(格式:YYYYMMDDHHmmss) ===== set datetime_str= for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value 2^>nul') do set datetime_str=%%a if "%datetime_str%"=="" ( echo 获取日期时间失败,使用当前日期时间 set datetime_str=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% ) else ( rem 格式为:20251020123456.789000+480 set datetime_str=%datetime_str:~0,14% ) rem 替换空格为0(因为时间部分小时如果是个位数,前面是空格) set datetime_str=%datetime_str: =0% set FILE_PREFIX=%DB_NAME%_%datetime_str% rem ===== 文件名 ===== set SQL_FILE=%BACKUP_DIR%\%FILE_PREFIX%.sql set RAR_FILE=%BACKUP_DIR%\%FILE_PREFIX%.rar rem ===== 创建备份目录 ===== if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" rem ===== 执行MySQL备份 ===== echo [%TIME%] 开始备份数据库 %DB_NAME%... %MYSQL_BIN% -u%DB_USER% -p%DB_PASSWORD% %DB_NAME% > "%SQL_FILE%" if %errorlevel% neq 0 ( echo 备份失败!错误代码: %errorlevel% exit /b 1 ) rem ===== 使用WinRAR压缩文件 ===== echo [%TIME%] 开始压缩备份文件... echo 压缩文件路径: !RAR_FILE! %WINRAR_PATH% a -r -s -ep1 -ibck -m5 "!RAR_FILE!" "!SQL_FILE!" if %errorlevel% neq 0 ( echo 压缩失败!错误代码: %errorlevel% exit /b 1 ) rem ===== 清理原始SQL文件 ===== del /q "!SQL_FILE!" echo [%TIME%] 操作完成!压缩文件保存在: !RAR_FILE! endlocal ``` 注意:这里我们使用了延迟扩展变量(!RAR_FILE!和!SQL_FILE!),因为在循环块(for命令)内部改变了变量,但在块外部我们需要使用这些变量,并且变量值中包含特殊字符(如感叹号)时,使用延迟扩展更安全。同时,我们在设置文件名时使用了wmic生成的datetime_str,这个字符串是连续的14位数字(年4,月2,日2,时2,分2,秒2),不会包含非法字符。 此外,我们在压缩前输出RAR_FILE的值,方便用户确认路径是否正确。 如果上述方法仍然不能解决问题,那么需要检查以下方面: - 备份目录路径是否合法?尝试手动在E盘创建MySQL_Backup目录,并赋予写权限。 - 是否因为磁盘空间不足? - 是否因为WinRAR本身的问题?尝试重新安装完整版的WinRAR(确保有rar.exe)。 根据引用[2],确保WinRAR安装目录下有rar.exe,并且使用命令行版本。 如果用户不想使用wmic,我们可以尝试另一种方法:使用PowerShell获取日期时间(但可能会慢一点)。这里我们优先使用wmic。 另外,注意在路径中,如果BACKUP_DIR配置不正确(比如末尾有空格),也会导致问题。在设置BACKUP_DIR时,不要有多余空格。 最后,建议用户检查备份目录的路径长度和权限。 如果问题仍然存在,请用户提供更多环境信息(如操作系统版本、WinRAR版本、备份目录是否存在等)。 以上是针对该问题的详细解决方案。 </think>### Windows下解决WinRAR压缩MySQL备份文件"文件名语法不正确"错误的完整指南 #### 问题原因分析 根据错误提示`无法创建 'E:\MySQL_Backup\db_im_20251020_093921.rar'`,主要可能由以下原因导致: 1. **路径非法字符**:文件名包含系统禁止字符 (`/ \ : * ? " < > |`) 2. **时间格式问题**:时间变量包含空格(小时为个位数时) 3. **权限不足**:备份目录写入权限受限 4. **路径长度超限**:超过Windows 260字符路径限制 5. **WinRAR配置问题**:未正确使用命令行工具rar.exe[^2] #### 解决方案步骤 ##### 一、修复时间格式(最常见问题) 修改时间变量处理逻辑,确保小时数为两位数: ```batch :: 原代码(时间包含空格导致错误) set TIME_PART=%time:~0,2%%time:~3,2% :: 修正代码(添加零填充) set hour=%time:~0,2% if %hour% LSS 10 (set hour=0%hour:~1,1%) set TIME_PART=%hour%%time:~3,2% ``` ##### 二、路径合法性检查 ```batch :: 在文件名生成后添加验证 set RAR_FILE=%BACKUP_DIR%\%DB_NAME%_%DATE_PART%_%TIME_PART%.rar echo 生成路径: %RAR_FILE% pause :: 暂停观察路径是否正确 ``` ##### 三、完整修正脚本 ```batch @echo off setlocal enabledelayedexpansion rem ===== 安全路径配置 ===== set MYSQL_BIN="C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" set WINRAR_PATH="C:\Program Files\WinRAR\rar.exe" :: 必须使用rar.exe[^2] set DB_NAME=your_database set BACKUP_DIR=E:\MySQL_Backup rem ===== 安全文件名生成 ===== set DATE_PART=%date:~0,4%%date:~5,2%%date:~8,2% set hour=%time:~0,2% if %hour% LSS 10 (set hour=0%hour:~1,1%) :: 小时补零 set min=%time:~3,2% set TIME_PART=%hour%%min% set FILE_NAME=%DB_NAME%_%DATE_PART%_%TIME_PART% set SQL_FILE=%BACKUP_DIR%\%FILE_NAME%.sql set RAR_FILE=%BACKUP_DIR%\%FILE_NAME%.rar rem ===== 目录创建与权限检查 ===== if not exist "%BACKUP_DIR%" ( mkdir "%BACKUP_DIR%" icacls "%BACKUP_DIR%" /grant Everyone:F :: 赋予完全控制权限 ) rem ===== 备份执行 ===== mysqldump -uroot -pYourPassword --max_allowed_packet=512M %DB_NAME% > "%SQL_FILE%"[^3] rem ===== 安全压缩命令 ===== %WINRAR_PATH% a -ep1 -m5 -cfg- "%RAR_FILE%" "%SQL_FILE%" rem ===== 清理与验证 ===== if exist "%RAR_FILE%" ( del /q "%SQL_FILE%" echo 备份成功: %RAR_FILE% ) else ( echo 错误:未能创建压缩文件 ) endlocal ``` #### 关键修复点说明 1. **强制使用rar.exe**: - 图形版winrar.exe不适合命令行操作,必须使用rar.exe[^2] - 验证路径:`C:\Program Files\WinRAR\rar.exe` 2. **时间格式标准化**: ```math \text{安全时间格式} = \begin{cases} 0H & \text{当 } H < 10 \\ HH & \text{当 } H \geqslant 10 \end{cases} ``` 确保文件名不包含空格 3. **路径长度保护**: ```batch :: 截断超长路径(>200字符时) if "!RAR_FILE:~200!" NEQ "" set RAR_FILE=!RAR_FILE:~0,200!.rar ``` 4. **特殊字符过滤**: ```batch :: 移除非法字符 set FILE_NAME=%FILE_NAME:/=_% set FILE_NAME=%FILE_NAME::=_% ``` #### 验证方法 1. **手动创建测试**: ```cmd echo test> "E:\MySQL_Backup\test_20251020_093921.rar" ``` 若失败则说明路径问题 2. **目录权限检查**: ```cmd icacls "E:\MySQL_Backup" :: 应包含 Everyone:(F) 或 Users:(M) ``` 3. **WinRAR命令行测试**: ```cmd "C:\Program Files\WinRAR\rar.exe" a -ep1 test.rar "C:\test.txt" ``` #### 替代方案(推荐) 使用7-zip更稳定的命令行压缩: ```batch set ZIP_PATH="C:\Program Files\7-Zip\7z.exe" %ZIP_PATH% a -tzip "%BACKUP_DIR%\%FILE_NAME%.zip" "%SQL_FILE%" ``` > **重要提示**:MySQL配置文件(my.ini)参数错误也会导致备份异常,检查是否存在`default_authentication_plugin`等参数冲突[^4]
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiangxl~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值