Openwrt上mysql innodb的使用及相关异常情况

首先在menuconfig中配置mysql,具体是在Utilities->database->mysql-server。这样直接编译就可以了,不过这样默认是不支持innodb存储引擎的,估计是考虑openwrt一般是运行的硬件有关,不需要这么复杂的存储引擎(占用空间也比MyISAM存储引擎大)。但是,如果需要支持innodb存储引擎该怎么办?这类型的网上帖子不多,我是之前参照国外的论坛加自己测试得出的。

Openwrt支持innodb存储引擎

修改feeds/oldpackages/libs/mysql/Makefile

在--with-server之前加--with-innodb

修改feeds/oldpackages/libs/mysql/conf/my.cnf

在[mysqld]中加default-storage-engine=INNODB

在bind-address = 127.0.0.1下载添加

innodb

innodb_file_per_table = 1

innodb_flush_log_at_trx_commit = 2

/etc/init.d/mysqld脚本start函数中添加

start() {
	local datadir=$(sed -n -e "s/^[[:space:]]*datadir[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" /etc/my.cnf)
	local mysqldatadir="/mnt/data/mysql/"
        local mysqltmpdir="/mnt/data/tmp/"
	local mysqlsrvdir="/srv/mysql/"
        if [ ! -d "$mysqldatadir" ]; then
                echo "create dir /mnt/data/mysql/..."
                mkdir -p "$mysqldatadir"
        fi
        if [ ! -d "$mysqltmpdir" ]; then
		echo "create dir /mnt/data/tmp/..."
		mkdir -p "$mysqltmpdir"
	fi
	if [ ! -d "$mysqlsrvdir" ]; then
		echo "create dir /srv/mysql/..."
		mkdir -p "$mysqlsrvdir"
	fi
	if [ ! -d "$datadir" ]; then
		error "Error: datadir '$datadir' in /etc/my.cnf doesn't exist"
		return 1
	fi
	if [ ! -f "$datadir/mysql/tables_priv.MYD" ]; then
		mysql_install_db --force
		service_stop /usr/bin/mysqld
		#error "Error: I didn't detect a privileges table, you might need to run mysql_install_db --force to initialize the system tables"
		#return 1
	fi
	service_start /usr/bin/mysqld
}

至此,基于innodb的MySQL就可以正常运行了。

在基于netgear3700v2硬件的openwrt上,会出现初始化innodb的情况,异常表现为创建socket失败,提示如Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘。其实这个是因为初始化innodb失败造成的,因为netgear3700v2的flash只有16M,不能满足innodb的运行需求,数据文件大小总和至少要达到 10 MB。通过敲入mysqld --skip-grant&命令可能会打印出类似如下的信息:

[email protected]_AP:/# mysqld --skip-grant&

[email protected]_AP:/# 150203  1:32:31  InnoDB: Initializing buffer pool, size = 8.0M

150203  1:32:31  InnoDB: Completed initialization of buffer pool

InnoDB: Error: auto-extending data file ./ibdata1 is of a different size

InnoDB: 64 pages (rounded down to MB) than specified in the .cnf file:

InnoDB: initial 640 pages, max 0 (relevant if non-zero) pages!

InnoDB: Could not open or create data files.

InnoDB: If you tried to add new data files, and it failed here,

InnoDB: you should now edit innodb_data_file_path in my.cnf back

InnoDB: to what it was, and remove the new ibdata files InnoDB created

InnoDB: in this failed attempt. InnoDB only wrote those files full of

InnoDB: zeros, but did not yet use them in any way. But be careful: do not

InnoDB: remove old data files which contain your precious data!

150203  1:32:31 [ERROR] Plugin ‘InnoDB‘ init function returned error.

150203  1:32:31 [ERROR] Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed.

150203  1:32:31 [ERROR] Unknown/unsupported table type: INNODB

150203  1:32:31 [ERROR] Aborting

150203  1:32:31 [Note] mysqld: Shutdown complete

上述这个莫名其妙的问题经过验证确实是由于flash空间不够引起的。解决的办法是,在路由器上挂载一个U盘。挂载U盘的配置项为:

kernel modules ->filesystems->kmod-fs-vfat

kernel modules->native language support->kmod-nls-cp437/kmod-nls-iso8859-1/kmod-nls-utf-8

kernel modules->usb support->kmod-usb-core/kmod-usb-ohci/kmod-usb-storage/kmod-usb-usb2

还有,在init初始化脚本中如果顺序执行多个mysql操作的时候,如mysql_install_db --force命令之后接着mysqladmin -u root password ‘123456‘则可能会失败,因为还没等mysql_install_db执行完成就会执行mysqladmin命令。解决此问题的办法是加sleep时间,具体多长时间可以视情况而定。

时间: 2024-10-09 07:40:08

Openwrt上mysql innodb的使用及相关异常情况的相关文章

MySQL Innodb 事务实现过程相关内容的整理

MySQL事务的实现涉及到redo和undo以及purge,redo是保证事务的原子性和持久性:undo是保证事务的一致性(一致性读和多版本并发控制):purge清理undo表空间背景知识,对于Innodb表中的行每一行包括:6字节的事务ID(DB_TRX_ID)字段: 用来标识最近一次对本行记录做修改(INSERT|UPDATE)的事务的标识符, 即最后一次修改(INSERT|UPDATE)本行记录的事务id.7字节的回滚指针(DB_ROLL_PTR)字段: 指写入回滚段(ROLLBACK s

mysql————Innodb的可重复读的情况下如何避免幻读?

1.1 实现InnoDB下的快照读然后,接下来说说,在READ-COMMITTED和REPEATABLE-READ级别下的InnoDB的非阻塞读是如何实现的. 实际上,在InnoDB存储数据的时候,还会额外存储三个不显示出来的字段:DB_TRX_ID.DB_ROLL_PTR.DB_ROW_ID,下面来简单介绍一下字段的含义. DB_TRX_ID:最后一次修改本行记录的事务ID.DB_ROLL_PTR:滚指针,指向这条记录的上一个版本(存储于rollback segment里).DB_ROW_ID

CentOS7 mysql 连接不上 :[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

mysql一直连接不上我的数据库,输入密码也进不去mysql. 报连接不上服务的错误. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) 我就查看了一下mysql的日志 cat /var/log/mysqld.log 看到了文件没有权限的错误 可以修改下该文件的读写权限或目录下所有文件的权限 解决方案: 这就可以进入mysql了 CentOS7 mysql 连接不上 :[ERROR] InnoDB:

MySQL InnoDB 群集–在Windows上设置InnoDB群集

InnoDB集群最需要的功能之一是Windows支持,我们现在已将其作为InnoDB Cluster 5.7.17预览版 2的一部分提供.此博客文章将向您展示如何在MS Windows 10上运行InnoDB集群.64位系统. 我们将执行以下步骤. 下载包 安装 创建一个InnoDB群集沙箱配置 引导MySQL路由器 测试配置 下一步是什么? 让我们开始吧! 下载包 首先,我们必须下载安装所需的四个组件. 来自dev.mysql.com的具有组复制功能的MySQL Server 5.7.17.

MySQL InnoDB内存压力判断以及存在的疑问

本文出处:http://www.cnblogs.com/wy123/p/7259866.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 与其他数据一样,内存对数据库的性能有着至关重要的影响,MySQL InnoDB也一样通过内存来缓存数据,在访问数据的时候通过访问内存中缓存的数据来提高数据的访问效率.MySQL中通过show variables like 'Innodb_buffer_pool%'命令或者直接

浅谈mysql innodb缓存策略

浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb bufferpool怎么工作,和利用它读取频繁访问的数据,是mysql优化重要的方面. 理想状况下,把bufferpool的大小调整到足够大,留下足够的内存空间给其他该服务器上的进程(使其无缺页即可).bufferpool越大,innodb 月表现为内存型数据库,从硬盘上一次读取数据,之后并成了从内存中读取数

mysql innodb 性能优化

默认情况下,innodb的参数设置的非常小,在生产环境中远远不够用比如最重要的两个参数innodb_buffer_pool_size 默认是8Minnodb_flush_logs_at_trx_commit 默认设置的是1 也就是同步刷新log(可以这么理解) innodb_buffer_pool_size: 这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoDB性能很差.在只有 InnoDB存储引擎的数据库服务器上面,可以设置6

Mysql InnoDB锁

MySQL 不同引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 锁特点: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生冲突的概率最高,并发度最低 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高 页面锁:开销和加锁时间介于表锁和行锁之间:会出现

MySQL Innodb 架构学习

一.MySQL后台线程   1.Master Thread 核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘.例如脏页的刷新,插入缓冲的合并,undo 页的回收等. 1)每秒一次的操作: 日志缓冲刷新到磁盘,即使该事务还没有提交.该操作总是会发生,这个就是为了再大的事务,提交时间都很短. 当IO压力很小时(1s内发生的IO次数小于5% innodb_io_capacity)合并5% innodb_io_capacity 的插入缓冲. 当脏页比例大于 innodb_max_dirty_pages