最近在整理服务器的时候,发现mysql的查询日志文件占用了很多空间。这个查询日志文件部分内容如下,随着查询增加,会越来越大
- Tcp port: 3306 Unix socket: /tmp/mysql.sock
- Time Id Command Argument
- 100404 8:36:49 1 Connect zzz@localhost on
- 1 Init DB zzz
- 1 Query SET NAMES 'utf8'
- 1 Query SELECT * FROM `boblog_counter` LIMIT 0,1
- 1 Query SELECT `blogid`,`pubtime`,`edittime`,`blogalias` FROM `boblog_blogs` WHERE `property`<2 ORDER BY `pubtime`DESC LIMIT 0, 1500
- 1 Quit
- 100404 8:38:01 2 Connect admin@localhost on
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT * FROM `cmseasy_settings` WHERE `tag`='table-fieldset' ORDER BY 1 DESC limit 1
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT * FROM `cmseasy_user` WHERE userid>0 ORDER BY 1 DESC limit 1
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT count(typeid) as rec_sum FROM `cmseasy_type`
- 2 Query SELECT * FROM `cmseasy_type` ORDER BY `order`,1 limit 1000
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT count(1) as rec_sum FROM `cmseasy_friendlink` WHERE state>0 and linktype=1
- 2 Query SELECT * FROM `cmseasy_friendlink` WHERE state>0 and linktype=1 ORDER BY listorder asc,id limit 20
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT count(1) as rec_sum FROM `cmseasy_friendlink` WHERE state>0 and linktype=1
- 2 Query SELECT * FROM `cmseasy_friendlink` WHERE state>0 and linktype=1 ORDER BY listorder asc,id limit 20
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query SELECT * FROM `cmseasy_templatetag` WHERE name='å~E¬å~O¸ç®~@ä»~K' ORDER BY 1 DESC limit 1
- 2 Init DB zzz
- 2 Query SET NAMES 'utf8'
- 2 Query SET sql_mode=''
- 2 Query Describe cmseasy_archive
- 2 Query SELECT count(1) as rec_sum FROM `cmseasy_archive` WHERE typeid in (2) and checked=1 and (state IS NULL or state<>'-1')
- 2 Query SELECT * FROM `cmseasy_archive` WHERE typeid in (2) and checked=1 and (state IS NULL or state<>'-1') ORDER BY aid desc limit 4
其实记录的都是mysql执行的一些select语句,对于正常运行的服务器,我觉得基本没有必要保留这些日志。
昨天单位由一个网站,要放到万网的虚拟主机去。
网站是jsp写的,程序好导。直接ftp过去就可以了。
可是mysql的数据库怎么导呢?
我先用
mysqldump database_name>database_name.sql
然后把这个database_name.sql下载下来。
再给虚拟主机空间上传一个phpmyadmin来做数据库管理用。这样就可以使用phpmyadmin导入数据了。
如果网站数据小,这样就ok了。可是我的database_name.sql有60M
万网空间上的phpmyadmin只能最大支持2M
于是只能另外想办法。我先导入表格结构吧。
mysqldump –d database_name>database_name.sql
在phpmyadmin里,选择好数据库后,用导入功能,将database_name.sql导入
现在有了表结构了,但是每个表都没有数据。我们再继续导入数据。
我的表里面,除了一个news表格特别大,大约51M,其他都在2M一下。所以我每个表格生成一个txt文件,然后导入到万网的数据库。
本地进入mysql>提示符后,用以下命令将数据的表格数据导出。
select * from admin into outfile “/tmp/admin.txt” fields terminated by “|” lines terminated by “@”;
上面命令将本地数据库的admin表,导出到/tmp/目录下的admin.txt文件。
我们有几个表格,就用这个命令导出几个txt文件。
然后将txt文件用gzip压缩,因为phpmyadmin支持gzip压缩格式的。
cd /tmp/
gzip admin.txt
最后将压缩的admin.txt.gz下载到本地,用浏览器上传给phpmyadmin导入
解决news表格过大问题
我的news表格有51M,就算gzip压缩后,还有7M左右,还是不能用phpmyadmin导入。
我们可以将news表格的数据切分为多个txt文件,然后保证每个文件gzip后,在2M以内就可以。
这个切分就要根据具体表格来判断了。
我先查询了news表格一共有多少条记录
select count(*) from news;
返回1477条,表格是51M。压缩后的表格是7M。
7M/2M=3.5
1477/3.5=422条。
根据上面的计算,只要按照422条一个文件来分割就可以了。为了保险,因为每条记录的大小并不是一样的平均分配,我按照每个文件200条记录来切分。
select * from news where newId>0 limit 200 into outfile “/tmp/news0.txt” fields terminated by “|” lines terminated by “@”;
然后用
select max(newId) from news where newId>0 limit 200;
查看下200条记录后,是到了那条记录,下次分割就从那条开始
这样分割出来的8个文件,一次压缩后,上传到phpmyadmin导入。就完成了全部表格的导入工作。
总结
其实如果数据本身不复杂,直接用navicat也可以远程连接导入的。但是navicat不支持定义 lines terminated。我的news表格里面存在的都是html代码,经常出现换行符,所以只能选择用phpmyadmin了。
要想记录下提交到mysql数据库的全部sql语句,可以通过修改my.cnf来实现
修改/etc/my.cnf文件
找到
[mysqld]段
加入
log=queryLog
log-slow-queries=showquerylog
然后就可以到/var/lib/mysql/目录下找到queryLog和showquerylog日志文件了
里面记录这每个提交到数据库执行的sql语句。
我的系统CentOS 4.4 rpm方式安装的mysql 5.0.57,如果其它系统或者其它安装方式,可能文件路径会有些不同。
建立Mysql两个表间的外键,需要满足三个条件
1.两个表必须是InnoDB表类型
2.使用在外键关系的域必须为索引型(Index)
3.使用在外键关系的域必须与数据类型相似
下面举例说明
我们创建一个班级表和一个学生表,并建立一个外键
创建班级表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;
插入班级数据
INSERT INTO class VALUES (1,"一班"),(2,"二班"),(3,"三班");
创建学生表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, INDEX (FK_class), FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id)) ENGINE=INNODB;
验证外键约束性,我们向students表插入一个学生数据,并让FK_class的值为一个在class表里面不存在的值.
mysql> INSERT INTO students VALUES (1,"zhang",5);
马上就会看到Mysql报错
ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails (`test/students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`FK_class`) REFERENCES `class` (`id`))
以上证明外键可以正常工作了
在Mysql下测试了以下,不建立index,并且不指定innodb格式.
版本
+----------------------+
| version() |
+----------------------+
| 5.0.24a-community-nt |
+----------------------+
建立class表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id));
建立students表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id));
通过Navicat查看,上面语句建立的两个表,也会默认用INNODB存储,而且也在students表建立了index和外键.一切正常.
为了解决中文乱码,我的Mysql都设置了使用utf8编码
这样一来,使用SQLyog Enterprise查看表里面内容,就都不能正常显示了。可能SQLyog需要设置?反正我没有搞出来。
不过后来我换用了Navicat 7以后,感觉很好。所有中文内容都可以正确显示
比mysql front也要强很多。以后我就用这个了

而且支持Linux,windows,mac三个平台。下面是介绍
PremiumSoft Navicat™ is a powerful MySQL database administration and development tool that is not only sophisticated enough for professional developers, but also easy to learn for new users. With an user-friendly GUI, Navicat™ lets you quickly and easily create, organize, access and share information in a secure and convenient way.
PremiumSoft Navicat supports multiple MySQL server connections which can be connected locally or remotely. Your remote MySQL server can be running on Linux, Unix, Mac OS X or Windows platform.





