好吧,我标题党了,非常地微信,非常地小红书。主要是刚刚处理完问题,心情难以平抑。
简单来说,如果您是QNAP NAS使用者,在用QNAP官方提供的MariaDB(如,MariaDB 10)时,千万不要将MariaDB的配置文件(.conf
)中,default-storage-engine
这一行的默认配置改为InnoDB
。
经常使用QTS的朋友都知道,QTS虽然是基于Linux设计的,但QNAP有对Linux进行魔改,乃至我们常用的一些软件,如Apache、MySQL等,也都做了自己的魔改。网上的很多文档里提供的/data
路径、.conf
路径等,在QTS下也是讨不着的。想在QTS找到这些路径,有以下两种思路:
- 去
/share/CACHEDEV1_DATA/.qpkg/
下面对应的程序目录里翻翻看——例如传说中的MySQL配置文件my.cnf
,在QTS下是/.../.qpkg/MariaDB10/etc/mariadb.conf
; - 去传统的
/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
一款程序,就不要再发出或start
或restart
或stop
的指令了——直到你在图形界面确确实实看到系统消息栏显示该程序“已启动”(如果你的指令是restart
,那么你会先在系统消息栏看到“已停止”,过很久才会看到“已启动”,这时候才安全了),然后再去做你想要做的下一步指令。不要好像没有看到什么反应,就想要重复发出指令——在QTS下,这样会把数据搞坏。
按道理,如果数据库服务器重启成功,则需要验证InnoDB是否启用。重新连接到数据库,然后执行:
SHOW ENGINES;
检查 InnoDB 的状态是否为DEFAULT
或YES
。
我顺利重启了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
。