Submitted by gouki on 2012, July 10, 9:11 AM
我知道INNODB不錯,但是我的VPS只有小小的512M內存,實在是扛不住,這玩意啥也不錯就吃掉了我不少內存了。於是我直接在my.cnf裏加上了skip-innodb。結果服務無法啟動。
找了一下資料 ,原來mysql 5.5以上的時候,默認的引擎就是innodB,因此,如果要skip掉它,必須告訴 mysql我的默認引擎是myisam。因此代碼就變成了這樣,在[mysqld]中加入:
default-storage-engine = MyISAM
然後再skip-innodb,接著運行service mysql restart,世界清靜 了。
原來運行top的時候,mysql一直佔有著70%左右的CPU。現在立刻清零。
一下子安逸了
Tags: linux, mysql, innodb, myisam
Linux | 评论:0
| 阅读:16860
Submitted by gouki on 2012, May 29, 6:17 AM
其实之前也遇到过样的问题,但这次是发生在虚拟机上,所以不得不再次记录一下
虚拟机磁盘空间有限,因此,当ibdata1的文件过大的时候,机器动不了了,一重启之后,mysql也无法启动了。哭
一看ibdata1居然就占用了我800多M的空间,我一共是8G的虚拟机,这怎么吃得消?于是找了篇文章做参考。
ibdata1是mysql使用InnoDB引擎的时候需要使用的文件。这个文件有的时候会变得很大,并且在你删除数据的时候,文件也不减小。这意味着,即使我将数据库啥的清空了也没啥用,ibdata1大小仍然保持不变。
不得已,只能做了如下操作
1、对每张表使用单独的innoDB文件, 修改/etc/my.cnf文件
[mysqld]
innodb_file_per_table
2、 导出所有的数据,重建数据库,然后恢复数据:
# /usr/bin/mysqldump -R -q --all-databases > /temp/all.sql
# service mysql stop ,ubuntu下面可以是/etc/init.d/mysql stop
# rm -fr /var/lib/mysql/*
# /usr/bin/mysql_install_db
# service mysql restart ,同上/etc/init.d/mysql start
# mysql < /tmp/all.sql
这样导入的sql,root是没有用户名的,所以还需要再设置一下
- >use mysql
- >update user set password=password("new_pass") where user="root";
- >flush privileges;
如果这样还不行,参考这一篇:http://neatstudio.com/show-1042-1.shtml
3、 /var/lib/mysql的每个数据库下面,都有会很多的.ibd文件。这些分散的.ibd文件取代了原来的那个ibddata1。
以后删除数据库的时候,直接删除某个数据库的目录就可以了
-------EOF-------
以上的参考来自于:http://bbs.chinaunix.net/thread-3646471-1-1.html
还有一段:
mysql 使用的引擎:
mysql> show engines;
+------------+---------+----------------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
| BerkeleyDB | YES | Supports transactions and page-level locking |
| BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | NO | Archive storage engine |
| CSV | NO | CSV storage engine |
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
| FEDERATED | NO | Federated MySQL storage engine |
| MRG_MYISAM | YES | Collection of identical MyISAM tables |
| ISAM | NO | Obsolete storage engine |
+------------+---------+----------------------------------------------------------------+
12 rows in set (0.00 sec)
For InnoDB tables, OPTIMIZE TABLE is mapped to ALTER TABLE, which rebuilds the table to update index statistics and free unused space in the clustered index.
所以不会直接来减少ibdata的文件尺寸。
减少ibdata的方法如下
- 1. 用mysqldump等工具导出数据 - 2. 停止 mysqld
- 3. 删除ibdata*, ib_logfile* 文件
- 4. 重新启动 mysqld(这时mysqld就会自动创建 idbdata*, ib_logfile* 文件)
- 5. 将到出来的数据导回去,体积才会减小。
Tags: mysql
DataBase | 评论:0
| 阅读:15069
Submitted by gouki on 2012, May 16, 9:17 PM
一个句子的迁移,一个粗心:
原mysql代码是:select date_format(from_unixtime(xxx),'%Y-%M') as xxxxx from table group by xxxxx
sql server转换后:
select (select dateadd(ss,xxx,'1970-01-01 08:00:00')) as xxxxx from table group by xxxxx
因为sql server不支持将as 后的内容做聚集,只能:
select dateadd(ss,xxx,'1970-01-01 08:00:00') as xxxxx from table group by (select dateadd(ss,xxx,'1970-01-01 08:00:00'))
但又报错,说是group by 不能使用子查询。
仔细想了想,(select dateadd(ss,xxx,'1970-01-01 08:00:00')) as xxxxx,这个select用来干嘛 ?如果是在查询分析器里,当然是要用select,因为要输出嘛,但是在sql语句中。。。
不需要啊。
记录一下。
Tags: sqlserver, mysql, convert
DataBase | 评论:0
| 阅读:14563
Submitted by gouki on 2012, February 25, 10:09 AM
从sqlserver转到mysql上相对还是比较方便的,外面的工具层出不穷,比如dbconverter之类的,可惜它是商业版,而且,15M左右,还TNND没有破解版。
问了一下google和百度,最终度娘没有帮我解决,而且谷哥告诉我答案了:http://www.cnblogs.com/andrew-blog/archive/2011/12/03/SQL_mss2sql.html
然后下载到本地。做个备份,以后可以直接用
下载:mss2sql.rar
只有1.3M哦,非常好用,昨天帮一个朋友转数据的时候,只花了大约半小时左右转换了将近1G左右的数据。
由于用法简单就不多做介绍了,sqlserver的登录可以直接选系统登录,而不需要输入密码,你懂的。甚至可以支持远程导入,黑黑。。。当然这受限于网络带宽的传输了。
如果还不会,就看我上面的URL吧,里面有图文教学,不过我相信,即使没有教学,也是下一步下一步就会搞的。
Tags: sqlserver, mysql, convert
Software | 评论:0
| 阅读:16206
Submitted by gouki on 2012, January 14, 2:09 PM
众所周知,我们在插入数据库的时候,都是:insert into table (xxx) values('0');这种方式。
嗯,如果xxx是char或者varchar,并不会出错,但如果xxx是int型或者日期型,则可能会出错,也可能不出错,这是由您的配置决定的。
您可以看这里:
1.修改my.ini
XML/HTML代码
- ctrl+f 查找 sql-mode
-
- 将它值改为 "ANSI"
- sql-mode="ANSI";
- 重启数据库,就ok了.
2.动态修改数据库模式
XML/HTML代码
- 在启动数据库后,使用sql语句 SET sql_mode='ansi' ,
就ok了
--------------------------------------------------
第2个方法没用过.... T.T
手册地址在这.
http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/database-administration.html#server-sql-mode
sql-mode 是服务器模式
值的不同,mysql处理sql语句的方式也不同.
当值为ansi时,
mysql将更改sql语句的语法和行为,使其更符合标准SQL。
说白了,就是会修改错误.容错性高.
这样你给datetime项 和 int项 插入 空字符串,
mysql会将datetime的空字符改为 0000-00-00 00:00,
将int的空字符串改为0 .
其他值的作用.自己看手册.
-------上面这一段内容来自:http://ymx.iteye.com/blog/829046
是因为fireguns在询问的时候才想起要查这玩意,所以我就问了一下google
然后,firegus找到的资料是:
XML/HTML代码
- # Set the SQL mode to strict
- sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
-
- 改为:
-
- # Set the SQL mode to strict
- sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
手册上说的SQLMODE是指:
Tags: mysql, insert, int, datetime
DataBase | 评论:0
| 阅读:21335