QNAP NAS使用者注意!千万莫对MariaDB做这件事……

好吧,我标题党了,非常地微信,非常地小红书。主要是刚刚处理完问题,心情难以平抑。

简单来说,如果您是QNAP NAS使用者,在用QNAP官方提供的MariaDB(如,MariaDB 10)时,千万不要将MariaDB的配置文件(.conf)中,default-storage-engine这一行的默认配置改为InnoDB

经常使用QTS的朋友都知道,QTS虽然是基于Linux设计的,但QNAP有对Linux进行魔改,乃至我们常用的一些软件,如Apache、MySQL等,也都做了自己的魔改。网上的很多文档里提供的/data路径、.conf路径等,在QTS下也是讨不着的。想在QTS找到这些路径,有以下两种思路:

  1. /share/CACHEDEV1_DATA/.qpkg/下面对应的程序目录里翻翻看——例如传说中的MySQL配置文件my.cnf,在QTS下是/.../.qpkg/MariaDB10/etc/mariadb.conf
  2. 去传统的/etc/var之类的目录找找——不过在QTS的场合,多半是一些管道软连接,例如/etc/my.cnf实际指向/mnt/HDA_ROOT/.config/my.cnf;而迷惑人的是,该文件可能是别的MySQL实例的配置文件,而不是我们平常容易用到的QTS应用市场释出的MariaDB的配置文件。

言归正传,MariaDB的配置文件(.conf),即/.../.qpkg/MariaDB10/etc/mariadb.conf,其中的default-storage-engine这一行,默认配置为MyISAM。据说,虽然MyISAM可以作为临时解决方案,但考虑到数据库的完整性和性能,长期来看最好能使InnoDB可用。从个人的业务需求出发,当时是想要改为InnoDB了。

顺带一提,为了确认所有可用的存储引擎及其状态,可以使用这则sql命令:

SHOW ENGINES;

例如,我的场合,就收到如此输出:

+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                                         | Transactions | XA   | Savepoints |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
(从略)
| MyISAM             | DEFAULT | Non-transactional engine with good performance and small data footprint                         | NO           | NO   | NO         |
(从略)
| InnoDB             | NO      | Supports transactions, row-level locking, foreign keys and encryption for tables                | NULL         | NULL | NULL       |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.000 sec) 

再次言归正传。所以要我就查找 default-storage-engine 这一行,将其更改为:

default-storage-engine = InnoDB

并确保没有任何行包含 skip-innodb。如果有,需要将其注释掉(在行前加 #)或删除。

然后增加InnoDB相关配置(可选),为了优化 InnoDB 的性能。在 [mysqld] 部分添加以下配置:

innodb_buffer_pool_size = 1G  # 根据你服务器的内存大小调整
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_thread_concurrency = 8

修改配置文件后,需要重启数据库服务以使更改生效。一般能想到以下命令:

sudo systemctl restart mariadb.service

或者

sudo systemctl restart mysql.service

然而哪条在我的QTS都用不了。QTS图形界面下的AppCenter则不提供重启选项——这应该是为了数据稳定性考虑。于是我访问了QTS的shell界面,在App Management那边手动restart了MariaDB。

注意,一旦你尝试start或者restart一款程序,就不要再发出或startrestartstop的指令了——直到你在图形界面确确实实看到系统消息栏显示该程序“已启动”(如果你的指令是restart,那么你会先在系统消息栏看到“已停止”,过很久才会看到“已启动”,这时候才安全了),然后再去做你想要做的下一步指令。不要好像没有看到什么反应,就想要重复发出指令——在QTS下,这样会把数据搞坏。

按道理,如果数据库服务器重启成功,则需要验证InnoDB是否启用。重新连接到数据库,然后执行:

SHOW ENGINES;

检查 InnoDB 的状态是否为DEFAULTYES

我顺利重启了MariaDB,然而噩梦这才开始——从shell环境尝试访问mysql,账号密码、什么的照常要求输入,但是输进去后就访问不进mysql命令行环境了。QTS的图形界面那边也打不开MariaDB 10——虽然软件状态显示为“已启动”。

我甚至重启了NAS,并再次尝试从shell、图形界面访问,仍然不行。一度以为是QTS restart一款程序会比较暴力,导致因进程被强行中断而数据坏掉。但又觉得官方提供的实践方式应该不至于不靠谱乃尔。出于试看看的心态找到MariaDB的配置文件(.conf),将其中的default-storage-engine这一行,改回默认配置,即MyISAM。然后按前述方法从shell restart MariaDB 10。

一切恢复正常了。

作为结尾,所以,如果您是QNAP NAS使用者,在用QNAP官方提供的MariaDB(如,MariaDB 10)的时候,千万不要将MariaDB的配置文件(.conf)中,default-storage-engine这一行的默认配置改为InnoDB

Discover more from 山月

Subscribe now to keep reading and get access to the full archive.

Continue reading