--no-defaults

MySQL初始化详解
本文介绍了MySQL初始化脚本mysql_install_db的使用方法及其选项参数。适用于5.6.8及以前版本,该脚本能够初始化MySQL的数据目录并创建系统表。文中还详细解释了如何设置--user、--basedir和--datadir等选项。

分类: MySQL

mysql_install_db是一个默认放在.../mysql/scripts的一个初始化脚本。
该脚本可以在任何装有perl的操作系统上被使用,在5.6.8之前的版本,该脚本是一个shell脚本,并只能在unix平台上使用。

5.7.6以后的版本,该脚本也将被移除。

官方对它的介绍是:

Initialize MySQL Data Directory


安装完mysql server时,一般要执行这个脚本对数据库初始化。


运行这个脚本,会初始化mysql的data目录,并且创建那些系统表。
同样也会初始化系统表空间并且关联innodb表与数据结构。


截至5.6.8版本,在unix平台,mysql_install_db创建一个被命名为“my.cnf”默认的参数文件在base安装目录。
该my.cnf是根据.../mysql/support-files/my-default.cnf所创建的。
如果my.cnf已经存在,脚本会假定my.cnf正在被使用,并会创建一个被命名为“my-new.cnf”的文件。


用法举例:
./mysql_install_db --user=mysql --basedir=/usr/local/mysql  --datadir=/data/mysql3306


其中--user为mysqld服务的运行用户
--basedir和--datadir则分别代表mysql的安装目录和数据存放目录


在5.6.8之后的版本,用此种方式初始化后,root密码将会存放在  /root/.mysql_secret
详细见 --random-passwords 参数。



其他选项:(博主手动翻译可能存在出入,详情请参考手册)


 --help
显示帮助信息


 --basedir=path
mysql 安装目录的路径


 --builddir=path
build 目录的路径,用于out-of-source构建。


 --cross-bootstrap
供内部使用。


 --datadir=path
mysql 数据目录的路径 


--defaults-extra-file=file_name
在读取全局选项文件和在读取用户选项文件之前,读取这个文件(选项文件),如果该文件不存在,将会抛出错误。(仅限unix平台)


 --defaults-file=file_name
用被提供的选项文件,如果该文件不存在,将会抛出提示。


 --force
当dns无法用时将通过ip地址代替。


 --keep-my-cnf
在5.6.20中被添加,mysql_install_db保存任何已经存在的my.cnf文件,并且不创建新的默认my.cnf文件。


 --ldata=path
与--datadir同义。


 --no-defaults
不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。


 --random-passwords
5.6.8中加入该选项,在unix平台,该选项在mysql安装时增添了更多安全性。
程序会给root初始化一个随机密码,被写入.mysql_secret文件,并且放置在对应用户的home目录下
如果.mysql_secret文件已经存在,新密码信息会被追加上去,每一个密码都会有时间戳信息,该文件默认权限是600。
并且没有匿名mysql用户存在。
通过RPM新安装mysql并使用mysql_install_db时,将会默认调用--random-passwords选项。(升级除外)
在5.6.9,solaris PKG新安装并且使用mysql_install_db时,同样也会调用--random-passwords。(升级除外)

用二进制或者源码安装时,可以在使用mysql_install_db时手动的添加--random-passwords选项。


 --rpm
供内部使用。


 --skip-name-resolve
当创建授权表时,用ip地址而不是host名,这个选项在你的DNS不起作用时,非常有用。


 --srcdir=path
供内部使用。


 --user=user_name
运行mysqld的系统用户名,通过mysqld创建的文件和目录的归属者将为该用户。


 --verbose
Verbose模式,打印更多关于这个程序的信息。


 --windows
供内部使用,5.7.5将移除。
<think> 我们正在处理的是在Navicat Premium中执行mysqlbinlog命令时出现的1064 SQL语法错误。根据之前的讨论,我们知道1064错误通常与SQL语法问题有关,但这里我们是通过管道将mysqlbinlog的输出直接传递给mysql客户端执行。因此,错误可能出现在以下几个方面: 1. **binlog格式问题**:如果binlog是ROW格式,直接解析出来的内容可能不是有效的SQL语句,而包含二进制数据或其他非SQL文本。 2. **GTID问题**:如果启用了GTID,可能会导致执行时因为GTID冲突而失败,但错误通常不是1064,而是其他错误。不过我们也不能完全排除。 3. **特殊字符或转义问题**:binlog中可能包含一些特殊字符,导致生成的SQL语句中包含未转义的字符,从而引发语法错误。 4. **命令执行环境问题**:在Navicat Premium中执行命令行语句,可能环境变量或路径设置与直接在命令行执行不同。 根据引用[1]中提到的内容,我们注意到在mysqlbinlog命令中使用了`--no-defaults`选项,这可以避免读取配置文件,但可能也会导致一些默认设置失效。 根据引用[2],我们注意到binlog中的事件时间戳可能被用来过滤,但这里我们使用的是位置过滤,所以可能不是问题。 解决方案: ### 步骤1:确认binlog格式并添加必要参数 如果binlog格式是ROW,我们需要添加`-v`或`--verbose`选项来将行事件转换成SQL语句(伪SQL,但可读性更好,并且可以用于恢复)。同时,为了安全地生成可执行的SQL,我们可能还需要添加`--base64-output=DECODE-ROWS`选项,这样在遇到基于行的日志时,会将其解码并转换为注释形式的SQL(然后通过`-v`再转换为伪SQL)。 另外,为了避免GTID带来的问题,我们可以添加`--skip-gtids`选项,这样在生成的SQL中就不会包含GTID相关的设置,执行时也不会因为GTID已经存在而跳过。 因此,我们尝试修改命令为: ```bash mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS --skip-gtids --start-position=126 --stop-position=236 USER-20230727JB-bin.000043 | mysql -u root -pSa123 ``` 注意:这里我们将密码参数改为`-pSa123`,因为原命令中`-root`可能是笔误,应该为`-u root`,而密码参数应该是`-p`后紧跟密码(无空格)或者单独使用`-p`然后在提示时输入密码。但是原命令中写的是`-root`,这可能是错误的,因为通常用户参数是`-u`。所以正确的应该是`-u root`。 因此,修正后的命令应该是: ```bash mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS --skip-gtids --start-position=126 --stop-position=236 USER-20230727JB-bin.000043 | mysql -u root -pSa123 ``` ### 步骤2:处理特殊字符和转义 如果步骤1仍然报错,可能是因为生成的SQL语句中有特殊字符。我们可以先将mysqlbinlog的输出重定向到一个文件,然后检查文件内容,手动修复可能的问题,再执行。 ```bash mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS --skip-gtids --start-position=126 --stop-position=236 USER-20230727JB-bin.000043 > binlog_output.sql ``` 然后,用文本编辑器打开`binlog_output.sql`,检查是否有明显的语法错误,比如未转义的引号等。修复后,再执行: ```bash mysql -u root -pSa123 < binlog_output.sql ``` ### 步骤3:在Navicat中执行命令的注意事项 在Navicat Premium中执行系统命令,通常是通过“工具”->“命令列界面”来打开一个命令行窗口。但是,需要注意的是,Navicat的命令列界面可能没有设置完整的系统环境变量,特别是MySQL的路径。因此,如果提示`mysqlbinlog`命令找不到,可能需要使用绝对路径,例如: ```bash /usr/bin/mysqlbinlog ... ``` 或者将MySQL的bin目录添加到系统环境变量中。 ### 步骤4:检查MySQL版本兼容性 确保生成binlog的MySQL服务器版本和当前执行的MySQL客户端版本兼容。如果不兼容,可能会导致解析出来的SQL语法有差异。可以尝试在mysqlbinlog命令中指定数据库版本,例如: ```bash mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS --skip-gtids --start-position=126 --stop-position=236 USER-20230727JB-bin.000043 | mysql -u root -pSa123 --binary-mode ``` 使用`--binary-mode`选项可以让mysql客户端更宽松地处理二进制数据。 ### 步骤5:直接使用命令行 如果Navicat的命令列界面仍然存在问题,建议直接使用操作系统的命令行终端(如Windows的cmd或PowerShell,Linux的Terminal)来执行上述命令。 ### 最终建议的完整命令 ```bash mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS --skip-gtids --start-position=126 --stop-position=236 "USER-20230727JB-bin.000043" | mysql -u root -pSa123 --binary-mode ``` 注意:在Windows系统中,如果路径或文件名包含空格,需要使用双引号。 如果密码中包含特殊字符,可能需要用单引号将密码括起来,或者将密码放在配置文件中(通过`--defaults-file`指定),以避免shell解析特殊字符。 如果问题仍然存在,请提供具体的错误信息,以便进一步分析。 ### 相关问题 1. 如何查看MySQL的binlog格式? 2. 如何解决mysqlbinlog解析ROW格式日志时的乱码问题? 3. 在MySQL数据恢复中,如何跳过GTID错误? 4. 如何使用Navicat Premium执行系统命令? 请根据以上步骤尝试解决,如果遇到新的问题,请提供详细的错误信息。 </think> ### 解决 Navicat 中运行 mysqlbinlog 报 1064 语法错误的方法 #### 错误原因分析 1. **管道命令执行问题** Navicat 的命令行界面不支持 `|` 管道操作符,导致将 `mysqlbinlog` 输出直接传递给 `mysql` 执行失败[^1] ```bash # 错误示例(Navicat不支持管道) mysqlbinlog ... | mysql -u root -p ``` 2. **参数语法错误** `-root` 应为 `-u root`,且密码参数 `-Sa123` 不符合规范: ```bash # 错误参数格式 mysql -root -Sa123 # 正确格式 mysql -u root -pSa123 # 或 -p后不接密码(交互输入) ``` 3. **ROW 格式解析问题**(参考引用[2]) Binlog 为 ROW 格式时直接解析会生成无法执行的二进制数据 --- ### 完整解决步骤 #### 步骤 1:生成临时 SQL 文件 在 Navicat 命令行中先导出 SQL 文件: ```bash # 添加 -v 参数解析 ROW 格式 mysqlbinlog --no-defaults -v \ --start-position=126 \ --stop-position=236 \ --skip-gtids \ "USER-20230727JB-bin.000043" > /tmp/binlog_recovery.sql ``` #### 步骤 2:手动检查 SQL 文件 用 Navicat 的 SQL 编辑器打开 `/tmp/binlog_recovery.sql`,检查: 1. 是否存在未转义的特殊字符(如 `'` 变成 `\'`) 2. 确认文件开头是否为有效 SQL 语句(应有 `SET` 语句) #### 步骤 3:分步执行恢复 ```bash # 1. 进入 MySQL 命令行(在 Navicat 命令行中执行) mysql -u root -pSa123 # 2. 在 MySQL 交互界面执行 SQL 文件 mysql> source /tmp/binlog_recovery.sql; ``` #### 替代方案:直接命令行执行 若仍报错,在**系统终端**执行(非 Navicat): ```bash mysqlbinlog --no-defaults -v \ --start-position=126 \ --stop-position=236 \ --skip-gtids \ "USER-20230727JB-bin.000043" \ | mysql -u root -pSa123 --binary-mode ``` > 注意:Windows 系统需使用完整路径如 `"C:\\Program Files\\MySQL\\bin\\mysqlbinlog"` --- ### 关键参数说明 | 参数 | 作用 | 必要性 | |------|------|--------| | `-v` | 解析 ROW 格式的 binlog | 必须 | | `--skip-gtids` | 避免 GTID 冲突 | 建议添加 | | `--binary-mode` | 处理二进制数据 | 管道执行时必需 | | `> file.sql` | 输出到文件 | Navicat 必需 | --- ### 预防措施 1. **验证 Binlog 格式** ```sql -- 在 Navicat 查询窗口中执行 SHOW VARIABLES LIKE 'binlog_format'; ``` - 若为 `ROW`,必须使用 `-v` 参数 2. **密码安全处理** ```bash # 更安全的密码输入方式 mysql -u root -p # 弹出密码输入提示 ``` 3. **定期测试恢复流程** ```bash # 每月执行测试恢复 mysqlbinlog -v binlog.000043 | mysql -u test -p test_db ``` > ⚠️ **重要提示** > 在 Navicat 中执行系统命令时: > 1. 使用绝对路径:`/usr/bin/mysqlbinlog` > 2. 避免特殊字符:用双引号包裹文件名 > 3. 分步执行:先生成 SQL 文件再导入 --- ### 操作示例 ```bash # 步骤 1:生成恢复文件(Navicat命令行) /usr/local/mysql/bin/mysqlbinlog -v \ --start-position=126 \ --stop-position=236 \ --skip-gtids \ "USER-20230727JB-bin.000043" > C:\\recovery.sql # 步骤 2:执行恢复(Navicat SQL窗口) SOURCE C:\\recovery.sql; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值