MySQL Initialization Failure Caused by Missing Newline in Configuration File
When initializing a MySQL 5.7.44 instance, the server aborts because the configuration file lacks a trailing newline, causing the parser to misinterpret the final '!includedir' line and report a missing '/etc/my.cnf.' directory, which can be resolved by adding a newline at the end of the file.
Background
During the initialization of a MySQL 5.7.44 instance, the command
/opt/mysql/base/5.7.44/bin/mysqld --defaults-file=/u01/my.cnf --datadir=/u01/3306 --basedir=/opt/mysql/base/5.7.44/ --initializefails with the error "Can't read dir of '/etc/my.cnf.' (Errcode: 2 - No such file or directory)" and aborts.
Steps to Resolve
The error points to a missing /etc/my.cnf. directory. Inspection of my.cnf shows only an !includedir /etc/my.cnf.d directive, and the directory /etc/my.cnf.d does exist.
[root@db1 ~]# cat /u01/my.cnf|grep /etc/my.cnf
!includedir /etc/my.cnf.d
[root@db1 ~]# ls -l /etc/my.cnf.d
total 4
-rw-r--r-- 1 root root 232 May 6 2020 mysql-clients.cnfRunning the server with --help still produces the same error, indicating the problem lies in the configuration file itself. Removing the !includedir /etc/my.cnf.d line allows the server to start.
[root@db1 ~]# cp /u01/my.cnf /u01/my.cnf.bak
[root@db1 ~]# vi /u01/my.cnf.bak
[root@db1 ~]# /opt/mysql/base/5.7.44/bin/mysqld --defaults-file=/u01/my.cnf.bak --help
... (output shows successful start) ...Adding a newline to the original /u01/my.cnf file resolves the initialization issue:
[root@db1 ~]# echo >> /u01/my.cnf
[root@db1 ~]# tail -1 /u01/my.cnf
!includedir /etc/my.cnf.d
[root@db1 ~]# /opt/mysql/base/5.7.44/bin/mysqld --defaults-file=/u01/my.cnf --datadir=/u01/3306 --basedir=/opt/mysql/base/5.7.44/ --initializeRoot Cause Analysis
Using strace on the failing run shows the server attempts to open "/etc/my.cnf./" (note the trailing dot) and fails, because the last line of the configuration file lacks a newline. The MySQL parser reads the file in 4096‑byte blocks; without a terminating newline, the final !includedir or !include directive is truncated, leading to an incorrect path.
strace -T -tt -s 100 -o /tmp/strace.log /opt/mysql/base/5.7.44/bin/mysqld --defaults-file=/u01/my.cnf ...
... openat(AT_FDCWD, "/etc/my.cnf./", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT ...
... write(2, "mysqld: Can't read dir of '/etc/my.cnf.' ...") = 73 ...When the final line ends with !includedir or !include and lacks a newline, the parser truncates the last character of the included filename, causing a "file not found" situation. Adding an explicit newline prevents this truncation.
Summary
If the last line of my.cnf is an !includedir directive without a trailing newline, MySQL truncates the final character, reports "Can't read dir of '/etc/my.cnf.'" and aborts initialization.
If the last line is an !include directive without a newline, the referenced filename is truncated but the server may still start.
Therefore, always ensure the configuration file ends with a newline character.
Supplement
Two common ways to create a file without a trailing newline are:
Using echo -n "xx" >> my.cnf Using printf "xx" >> my.cnf Any other scenarios that lead to a missing newline are welcome for discussion.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Aikesheng Open Source Community
The Aikesheng Open Source Community provides stable, enterprise‑grade MySQL open‑source tools and services, releases a premium open‑source component each year (1024), and continuously operates and maintains them.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
