[Solved] MariaDB import issue: Error at line 1: Unknown command ‘\-‘.
MariaDB和MySQL已经存在很长时间,并且在保持兼容性和解决安全问题之间一直存在着一种难以平衡的挑战。MariaDB最新的错误修复版本中为提高安全性做出了一些更改,这些更改可能会稍微破坏兼容性,但我们提供了解决方法。在本文中,我们将解释这些更改的原因及如何尽可能轻松地解决问题。
问题背景
我们正在解决的问题是,有可能生成一个恶意的MariaDB转储文件,该文件可以通过MariaDB客户端执行shell命令。为了防止这种情况发生,我们需要非常迅速地采取措施。具体解决措施详见MDEV-21178,其实质是引入了一种新的“沙盒模式”来禁用MariaDB客户端中的系统命令。
变更详情
MariaDB客户端现在有一个选项--sandbox
或MariaDB客户端提示命令\-
。这个选项将在会话的剩余时间内启用沙盒模式,直到断开连接。一旦进入沙盒模式,任何可以在shell上执行操作的命令都将被禁用。
此外,在转储文件的最顶部(注释中),mariadb-dump
工具添加了一个命令来触发沙盒模式,如下所示:
/*!999999 \- enable the sandbox mode */
MariaDB和MySQL客户端会将其简化为反斜杠和破折号,然后尝试使用破折号执行内部命令。问题在于,旧版本的MariaDB客户端和所有版本的MySQL客户端都不理解这个命令,因此会报错,这就是兼容性问题。
受影响的版本
这一变更影响到以下MariaDB版本:10.5.25、10.6.18、10.11.8、11.0.6、11.1.5、11.2.4和11.4.2。如果您从这些版本中获取转储并尝试将其导入到不受支持的版本(如10.4)或较旧的错误修复版本(如10.5.24),则会遇到兼容性问题。
解决方法
值得庆幸的是,有多种方法可以避免这些兼容性问题,特别是如果您希望将MariaDB导出导入到旧版本或MySQL。以下是一些建议:
1、使用具有更改的MariaDB服务器版本的安全客户端导入转储。
2、导入时删除对应的行
sed -i '1s/\\-//' filename.sql
3、导入时忽略对应的行
tail -n +2 filename.sql | mysql -u username -p database_name