标签存档: mysql

Mysql Got error 28 from storage engine 解决方法

报错信息

问题原因

磁盘空间不足导致。根目录空间已满,如下图所示:

解决方法

查看mysql配置文件my.cnf中的tmpdir参数,使得指向的目录具有足够空间。

Python Mysql 操作

首先需要安装Python的MySQLdb库,下载链接:http://sourceforge.net/projects/mysql-python

#!/usr/bin/env python
# -*- coding=utf-8 -*-

import MySQLdb  #需要安装python的Mysql扩展

conn = MySQLdb.connect(user='root', passwd='123456', host='127.0.0.1', port=3306)
conn.select_db('shop')
cursor = conn.cursor(MySQLdb.cursors.DictCursor)  #MySQLdb.cursors.DictCursor用数据库字段名为key
cursor.execute("SET NAMES 'utf8'")

cursor.execute('SELECT * FROM cate')
res = cursor.fetchall()  #返回所有结果集
for row in res:
    print "%s" % (unicode(row["name"], 'utf-8'))

cursor.execute('SELECT * FROM cate LIMIT 1')
res = cursor.fetchone()  #返回一条记录
print "%s" % (unicode(res["ca_Name"], 'utf-8'))

cursor.execute('SELECT * FROM cate')
res = cursor.fetchmany(5)  #接收5条返回结果行.如果5的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
for row in res:
    print "%s" % (unicode(row["ca_Name"], 'utf-8'))

cursor.execute("UPDATE cate SET flag = '0' WHERE id = '1' LIMIT 1")
#如果Mysql表的存储引擎是InnoDB的话,需要执行以下操作才能操作成功
conn.commit()

cursor.close()

Linux Mysql常用命令

连接Mysql
1、本地连接
mysql -uroot -p123456
2、远程连接
mysql -h110.110.110.110 -uroot -p123456
//连接host为110.110.100.100的服务器,数据库用户名为root,密码为123456的机器,回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>

操作Mysql
1、显示数据库列表。
show databases;
2、显示库中的数据表:
use mysql; //打开库
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名(字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
9、导出数据库和表:
mysqldump -hhost -uuser -ppass –databases dbname > file.sql //不是在mysql>状态下执行
10、增加新用户:
grant select on 数据库.* to 用户名@登录主机 identified by “密码”
如增加一个用户test密码为123,让他可以在任何主机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to ” Identified by “123″;
增加所有权限命令:
GRANT ALL PRIVILEGES ON *.* TO ‘root’@'%’ IDENTIFIED BY ’123456′;
11、刷新权限:
FLUSH PRIVILEGES;
12、查看创建表的SQL语句:
SHOW CREATE TABLE table_name;
13、查看表状态(已用空间等):
SHOW TABLE STATUS LIKE ‘Login’\G
*************************** 1. row ***************************
Name: Login
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 31687398
Avg_row_length: 110
Data_length: 3494789120
Max_data_length: 0
Index_length: 1858551808
Data_free: 67802905968640
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options: partitioned
Comment: NULL
1 row in set (28.03 sec)

解决远程连接mysql 错误1130代码

更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称’%'。
#mysql -u root -p
mysql>use mysql;
mysql>select ‘host’ from user where user=’root’;
mysql>update user set host = ‘%’ where user =’root’;
mysql>flush privileges;
mysql>select ‘host’ from user where user=’root’;
第一句是以权限用户root登录
第二句:选择mysql库
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址
第五句:刷新MySQL的系统权限相关表
第六句:再重新查看user表时,有修改。。
重起mysql服务即可完成:
#/etc/init.d/mysqld restart

PS:
之前lamp环境配置的时候将mysqld服务放到了/etc/rc.d/init.d/目录下,这里解释一下/etc/init.d和/etc/rc.d/init.d的区别是:/etc/init.d是/etc/rc.d/init.d软链接(soft link) 。/etc/rc.d/init.d目录下的脚本就类似与windows中的注册表,这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本,在系统启动的时候某些指定脚本将被执行开机时运行的脚本。

[转]mysql explain详解

关于常常运用mysql的兄弟们,对explain一定不会生疏。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处置SELECT,提供有关表如何结合和以什么次第的信息。
借助于EXPLAIN,你可以晓得
1)你什么时分必需为表参加索引以失掉一个运用索引找到记载的更快的SELECT。
2)你也能晓得优化器能否以一个最佳次第联合表。为了强迫优化器对一个SELECT语句运用一个特定联合次第,添加一个STRAIGHT_JOIN子句。
官方的关于explain的文档在http://dev.mysql.com/doc/refman/5.1/en/using-explain.html(英文),本文可作为官方文献的不完好浅显读物。
运用的办法

EXPLAIN tbl_name
或:
EXPLAIN [EXTENDED] SELECT select_options

前者可以得出一个表的字段构造等等,后者次要是给出相关的一些索引信息,而明天要讲述的重点是后者。
举例

mysql> explain select * from event;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)
各个属性的含义

id
select查询的序列号

select_type
select查询的类型,次要是区别普通查询和结合查询、子查询之类的复杂查询。

table
输入的行所援用的表。

type
结合查询所运用的类型。
type显示的是拜访类型,是较为重要的一个目标,后果值从好到坏顺次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
普通来说,得保证查询至多到达range级别,最好能到达ref。

possible_keys
指出MySQL能运用哪个索引在该表中找到行。假如是空的,没有相关的索引。这时要进步功能,可经过检验WHERE子句,看能否援用某些字段,或许反省字段不是合适索引。

key
显示MySQL实践决议运用的键。假如没有索引被选择,键是NULL。

key_len
显示MySQL决议运用的键长度。假如键是NULL,长度就是NULL。文档提示特别留意这个值可以得出一个多重主键里mysql实践运用了哪一局部。

ref
显示哪个字段或常数与key一同被运用。

rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不精确的。

Extra
假如是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
假如是where used,就是运用上了where限制。
假如是impossible where 表示用不着where,普通就是没查出来啥。
假如此信息显示Using filesort或许Using temporary的话会很费劲,WHERE和ORDER BY的索引常常无法统筹,假如依照WHERE来确定索引,那么在ORDER BY时,就必定会惹起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。
罕见的一些名词解释

Using filesort
MySQL需求额定的一次传递,以找出如何按排序顺序检索行。

Using index
从只运用索引树中的信息而不需求进一步搜索读取实践的行来检索表中的列信息。

Using temporary
为理解决查询,MySQL需求创立一个暂时表来包容后果。

ref
关于每个来自于后面的表的行组合,一切有婚配索引值的即将从这张表中读取

ALL
完全没有索引的状况,功能十分地差劲。

index
与ALL相反,除了只要索引树被扫描。这通常比ALL快,由于索引文件通常比数据文件小。

SIMPLE
复杂SELECT(不运用UNION或子查询)

使用USE INDEX优化Mysql数据库

USE INDEX (indexname) 来强制使用一个索引

优化前SQL执行时间,如下图:

优化表结构,增加联合索引,如下图:

优化后SQL执行时间,如下图:

优化后,执行SQL:

EXPLAIN  SELECT  DISTINCT (
shop_id
)
FROM goods_items
USE  INDEX ( package_2 )
WHERE package =  'false'
AND channel_id =  '1'
AND marketable =  'true'
AND shop_open =  'true'
AND areaflag =  'suzhou'
AND price_sc >  '0.00'
AND cat_id
IN (
'403',  '410',  '414',  '404',  '405',  '406',  '407',  '408',  '409',  '806',  '411',  '412',  '413',  '393'
)
ORDER  BY buy_count DESC
LIMIT 0 , 10;

如下图所示:

而优化前则,如下图所示:

总结一下,加了USE INDEX之后效率提升非常明显。经过测试,应该和SQL语句中带有ORDER BY也有很大的关系,如下图所示:

MYSQL PARTITION 分区

拆表:
ALTER TABLE `cdb_posts` PARTITION BY KEY (`pid`) PARTITIONS 20;
恢复:
ALTER TABLE `cdb_posts` REMOVE PARTITIONING;

如果创建的是MyISAM表类型的话,则会发现:

[转]Mysql数据存储引擎InnoDB和MyISAM区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。下面是已知的两者之间的差别,仅供参考。

InnoDB

InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。

InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。

MyISAM

MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。

2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

以下是InnoDB和MyISAM的一些联系和区别:

1. 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。

2. 创建表时如果不指定type则默认为myisam,不支持事务。

可以用 show create table tablename 命令看表的类型。

2.1 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试:

执行一个msyql:

  use test;

  drop table if exists tn;

  create table tn (a varchar(10)) type=myisam;

  drop table if exists ty;

  create table ty (a varchar(10)) type=innodb;

  begin;

  insert into tn values(‘a’);

  insert into ty values(‘a’);

  select * from tn;

  select * from ty;

  都能看到一条记录

  执行另一个mysql:

  use test;

  select * from tn;

  select * from ty;

  只有tn能看到一条记录

  然后在另一边

  commit;

  才都能看到记录。

3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:

  alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name,但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(只影响到create语句。)

  –default-table-type=InnoDB

  测试命令:

  use test;

  drop table if exists tn;

  create table tn (a varchar(10));

  show create table tn;

5. 临时改变默认表类型可以用:

  set table_type=InnoDB;

  show variables like ‘table_type’;

  或:

  c:\mysql\bin\mysqld-max-nt –standalone –default-table-type=InnoDB

[转载]http://www.alixixi.com/program/a/2011012867299.shtml

lamp | linux+apache+mysql+php配置

linux+apache+mysql+php配置:
1.apache

$ cd /home
$ mkdir super
$ wget http://labs.renren.com/apache-mirror/httpd/httpd-2.2.17.tar.gz
$ tar -zxvf httpd-2.2.17.tar.gz
$ cd httpd-2.2.17
$ ./configure --prefix=/usr/local/apache2 --enable-vhost-alias --enable-deflate --enable-rewrite --with-mpm=worker --enable-ssl
# --prefix=/usr/local/apache 设置安装位置
# --enable-so 让apache核心装载DSO
# --enable-rewrite 启用重写功能
$ make && make install //编译并且安装
$ /usr/local/apache2/bin/apachectl start //启动apache服务
$ vim /usr/local/apache2/conf/httpd.conf
# prefork和worker模式的配置

ServerLimit         2048
StartServers         100
MinSpareServers      50
MaxSpareServers      150
MaxClients          1000  # 设定的是 Apache可以同时处理的请求
MaxRequestsPerChild 10000

ServerLimit 30
ThreadLimit 64
StartServers 20
MaxClients 1024
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 64
MaxRequestsPerChild 10000

$ /usr/local/apache2/bin/apachectl restart //重启apache服务

注:在编译安装apache之前需要安装apr、apr-util、zlib

配置文件httpd.conf在php模块下面加一句:AddType application/x-httpd-php .php //执行php文件格式

遇到问题:

$ vim /etc/resolv.conf
> nameserver 8.8.8.8

2.mysql

$ cd /home/super
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.35.tar.gz
$ tar -zxvf mysql-mysql-5.5.35.tar.gz
$ cd mysql-5.5.35.tar.gz
$ groupadd mysql
$ useradd -g mysql mysql
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
$ make && make install
$ chown mysql.mysql /usr/local/mysql/ -R
#把你编译目录的一个脚本COPY过去
$ cp support-files/mysql.server /etc/init.d/mysqld
#增加一项新的服务
$ chkconfig --add mysqld
#启动mysql
$ /etc/rc.d/init.d/mysqld start

成功启动!!!

3.php

$ cd /home/super
$ wget  http://cn.php.net/get/php-5.2.9.tar.gz/from/cn2.php.net/mirror
$ tar -zxvf php-5.2.9.tar.gz
$ cd php-5.2.9
$ ./configure --prefix=/usr/local/php/ --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-mysqli --with-zlib-dir --with-zlib --enable-ftp --enable-mbstring --enable-sockets --enable-soap --enable-fpm --with-curl --with-libxml-dir=/usr/local/libxml2 --with-openssl --with-mcrypt
#如果是64位系统:增加 --libdir=/usr/lib64
#配置php、生成可编译文件
$ make && make install
$ cd /home/super/php-5.2.9
$ cp php.ini-development /usr/local/php/lib/php.ini
$ cd /usr/local/php/lib
$ vim php.ini
> register_globals = On
$ vi /usr/local/apache/conf/httpd.conf
#查找
#在此范围添加
> AddType application/x-httpd-php .php
> AddType application/x-httpd-php-source .phps
$ /usr/local/apache2/bin/apachectl restart #重启apache服务
$ cd /usr/local/apache2/htdocs
$ vim phpinfo.php
> <?php
> phpinfo();
> ?>;
#访问phpinfo.php尝试正常哈哈!
$ cd /usr/local/apache2/lib
$ vim http.conf
#更改php执行目录,将#DocumentRoot "/usr/local/apache2/htdocs"改为
> DocumentRoot "/var/www/html/"
#增加扩展虚拟主机配置
> Include conf/extra/httpd-vhosts*.conf
$ cd extra
$ vim http-vhosts-pma.conf
#添加扩展pma配置文件
DocumentRoot   "/var/www/html/phpMyAdmin"
ServerName pma.zhouchao.com
ServerAlias pma.chaoji.com
ServerAdmin zhouchao@qeeka.com
DirectoryIndex index.php index.html index.htm index.shtml
#       LogLevel debug
HostNameLookups off

Options Includes FollowSymLinks
AllowOverride all
Allow from all
#                        AuthName "Auth Name :"
#                        AuthType Basic
#                        AuthUserFile /etc/phphtaccess.pwd
#                        require valid-user
Order allow,deny

CustomLog "logs/access_pma.log" combined

遇到问题:
php编译报错:/usr/local/ssl/lib/libcrypto.a: could not read symbols: Bad value
解决方案:
重新编译openssl:./config no-shared -fPIC

4.mcrypt //加密算法扩展库

$ wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download
$ tar -zxvf libmcrypt-2.5.8.tar.gz
$ cd libmcrypt-2.5.8
$ ./configure
$ make && make install

遇到问题:
进去phpMyAdmin时,缺少:mcrypt
然后再重新编译PHP,加上编译参数:–with-mcrypt
测试下是否编译成功:
$ /usr/local/php/bin/php -m | grep mcrypt
mcrypt
别忘了重新启动apache!!!!

5.phpmyadmin

$ cd /home/super
$ wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.3.9.2/phpMyAdmin-3.3.9.2-all-languages.tar.gz?r=http%3A%2F%2Fwww.phpmyadmin.net%2Fhome_page%2Fdownloads.php&ts=1298912166&use_mirror=ncu
$ tar -zxvf phpMyAdmin-3.3.9.2-all-languages.tar.gz
$ mkdir -p /var/www/html
$ mv phpMyAdmin-3.3.9.2-all-languages /var/www/html/phpMyAdmin
$ cd !$
$ cp -a config.sample.inc.php config.inc.php
#找到 /libraries/config.default.php文件(config.default.php复制到phpmyadmin目录下,然后更名为 config.inc.php)

遇到问题:
(1)配置好apache虚拟主机后若出现Wrong permissions on configuration file, should not be world writable! 则需要修改权限 chmod 755 config.* ;chmod 755 libraries/config.default.php
(2)若出现:配置文件现在需要绝密的短语密码(blowfish_secret) 要改配置文件里的:$cfg['blowfish_secret'] = ‘ ‘; 单引号里面随便写个数
(3)pma无法登陆,要在mysql中root用户授权(默认密码为空)#GRANT ALL PRIVILEGES ON *.* TO root@’localhost’ IDENTIFIED BY ’123456′;

第 1 页,共 1 页1