https://blog.atime.me/note/mysql-summary.html

总结使用MySQL过程中遇到的各种问题和一些有用的资源,配置等等。将之前的若干篇零散的文章汇总到一起,备忘。

若无特别说明,文中的内容均基于Ubuntu 12.04和MySQL5.5。对于本文中出现的代码,...表示省略内容,#之后为代码注释。

配置

使用utf8编码

在MySQL的配置文件中做如下设置:

[client]
default-character-set = utf8 [mysqld]
character-set-server = utf8

然后重启MySQL服务,需要注意的是,已经创建的表不受影响。

启用查询日志

[mysqld]
...
general-log=1
general-log-file = /var/log/mysql/general.log
...

禁用Innodb引擎

MySQL5.5之后使用Innodb作为默认引擎,如果嫌其太耗内存,可以使用如下配置禁用Innodb并使用MyISAM作为默认引擎。

在my.cnf的mysqld区块内添加如下两行:

[mysqld]
...
innodb=OFF
default_storage_engine=MyISAM
...

然后重启mysql服务并登陆到mysql后使用如下命令查看引擎状况:

mysql> SHOW VARIABLES LIKE '%storage_engine%';

经验

CHAR和VARCHAR的长度

从MySQL 5.X之后,CHAR(20)和VARCHAR(20)里的数字20都是指字符个数,不管是什么编码。另外由于MySQL限制每行数据最大不超过65535字节,因此这些字段的最大长度和字段个数都要有所限制。1

忘记root密码

首先,修改mysql的配置文件/etc/mysql/my.cnf,在[mysqld]区域添加skip-grant-tables,之后重启mysql服务service mysql restart

然后不用密码登陆mysql的root用户mysql -uroot,依次执行如下命令:

mysql> use mysql;               # 切换到mysql数据库
mysql> update user set password=password('NEW_PASSWORD') where user = 'root'; # NEW_PASSWORD是你的新密码
mysql> flush privileges; # 刷新系统权限

最后,修改配置文件/etc/mysql/my.cnf,将[mysqld]里刚刚添加的skip-grant-tables删除,重启mysql服务。

思考

日期用什么类型存储

在MySQL数据库中,日期可以使用多种类型进行存储,以下是我目前想到的各种类型的优缺点。

  • MySQL Date and Time Types: MySQL内置的日期和时间类型,好处是MySQL有很多内置的日期和时间函数可供使用,缺点是可移植性很差。
  • char或varchar: 暂时没想到什么优点。
  • int: 优点是可移植性好,可以做一些基本的比较操作,缺点是和MySQL的内置日期时间类型比,可用函数很少;另外,int类型无法存储时区信息。

问题

Error 1175 Safe Updtes Mode

错误提示如下:

ERROR 1175: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

错误的原因是启用了MySQL的Safe Updtes Mode,它的作用是如果执行Update和Delete操作的时候,没有带键限制的where语句或limit语句,sql操作不会执行。详细的介绍可参考MySQL Tips: safe-updates

可使用SET sql_safe_updates=0;来暂时禁用Safe Updates Mode。

Stopping MySQL database server: mysqld failed

环境

  • OS: debian6 squeeze
  • Mysql: 5.1.63

使用service mysql restart命令时显示Stopping MySQL database server: mysqld failed!,导致无法重启mysql服务。

解决方法

问题是由mysql数据库的user表中debian-sys-maint用户的密码和/etc/mysql/debian.cnf中的密码不一致所引发的,参考这篇文章,即可解决。具体步骤如下。

  1. 查看/etc/mysql/debian.cnf中的password,cat /etc/mysql/debian.cnf,有两个password,不过值是相同的。
  2. 连接到mysql,mysql -uroot -p
  3. debian-sys-maint用户修改密码。

    GRANT ALL PRIVILEGES ON . TO 'debian-sys-maint'@'localhost' IDENTIFIED BY <password> WITH GRANT OPTION;

问题原因

之前使用backup脚本迁移网站时,只迁移了/etc/mysql/debian.cnf,没有迁移mysql里的mysql数据库,导致mysql数据库中user表里的debian-sys-maint的密码和/etc/mysql/debian.cnf不一致。

Snippets

以数据库db和表tb为例。

管理相关

显示所有的数据库

mysql> show databases;

显示当前数据库的所有表

mysql> show tables;

切换数据库

mysql> use db

显示表的结构

mysql> desc tb;

显示数据库的创建信息

mysql> show create database db;

显示表的创建语句

mysql> show create table tb;

备份某张表

$ mysqldump -u $user -p $db $table > table.sql

表管理

修改表的字符集

mysql> ALTER TABLE 'db'.'tb' CHARACTER SET utf8;

修改字段的字符集,参考Column Character Set Conversion

查看数据库mydb中各个表的大小(包括索引),并按大小逆序排列

mysql> SELECT table_name AS "Tables",
round(((data_length + index_length) / 1024 / 1024), 2) AS "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "mydb"
ORDER BY (data_length + index_length) DESC;

权限相关

详细内容见MySQL Account Management SQL

显示权限

mysql> SHOW GRANTS FOR 'user_name'@'host';

分配权限

mysql> GRANT ALL PRIVILEGES ON 'database'.'table' TO 'user_name'@'host' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;

解除权限

mysql> REVOKE ALL PRIVILEGES ON 'database'.'table' FROM 'user_name'@'host';
mysql> FLUSH PRIVILEGES;

批量删除表

批量删除有相同前缀的表,使用下面的sql语句会构造相应的drop语句,删除wordpress3数据库中前缀为wp_的表。

SELECT CONCAT( 'DROP TABLE IF EXISTS wordpress3.', TABLE_NAME, ';' )
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'wordpress3' AND TABLE_NAME LIKE 'wp_%';

删除步骤如下,首先生成删除命令并保存到drop.sql文件中。

mysql -uroot -ANspe "SELECT CONCAT( 'DROP TABLE IF EXISTS wordpress3.', TABLE_NAME, ';' )
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'wordpress3' AND TABLE_NAME LIKE 'wp_%';" > drop.sql

然后检查drop.sql文件中的语句是否正确,如果无误,最后执行如下命令即可。(执行删除命令前务必提前备份相关的数据

mysql -uroot -p -e "source drop.sql"

其他

将BLOB转为特定编码的字符串,参考这个问题

SELECT CONVERT(blob_column USING gbk) FROM table_name;

关于MySQL的各种总结的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. iscroll横向滑动(当前页状态标记自动变化)

    var myScroll; function loaded(){ myScroll = new iScroll('wrapper',{ snap:true, checkDOMChanges:true, ...

  2. 精通 Oracle+Python,第 2 部分:处理时间和日期

    从 Python 2.4 版开始,cx_Oracle 自身可以处理 DATE 和 TIMESTAMP 数据类型,将这些列的值映射到 Python 的 datetime 模块的 datetime 对象中 ...

  3. 通过try、except和else的使用来使Python程序更加“强壮”

    在执行的程序中,难免会碰到因为一些原因如输入输出导致致命性错误产生的情况(如因为输入的文件名错误而导致无法运行相关的代码.).此时你不希望程序直接挂掉,而是通过显示一些信息,使其平稳的结束.此时,就可 ...

  4. 结合rpyc使用python实现动态升级的方法

    动态升级,就是程序不退出的情况下,将其代码更新的策略.假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把. (1)有个包装程序专门负责接口并检查是否需要更新,当需要更 ...

  5. 学习Swift -- 构造器(上)

    构造器(上) 构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initi ...

  6. iOS中默认样式修改-b

    项目中有大量的UITableView都需要显示sectionHeader.iOS中默认sessionHeader上的textLabel样式跟设计图不符. 按照我们之前的解决方案,是在每个UITable ...

  7. Test for open live write

    this is test document. this is test document. this is test document. this is test document. this is ...

  8. 【Itext】解决Itext5大并发大数据量下输出PDF发生内存溢出outofmemery异常

    尼玛,这个问题干扰了我两个星期!! 关键字 itext5 outofmemery 内存溢出 大数据 高并发 多线程 pdf 导出 报表 itext 并发 在读<<iText in Acti ...

  9. 如何搭建一个独立博客——简明Github Pages与Hexo教程

    摘要:这是一篇很详尽的独立博客搭建教程,里面介绍了域名注册.DNS设置.github和Hexo设置等过程,这是我写得最长的一篇教程.我想将我搭建独立博客的过程在一篇文章中尽可能详细地写出来,希望能给后 ...

  10. German Collegiate Programming Contest 2013:B

    一个离散化的简单题: 我用的是STL来做的离散化: 好久没写离散化了,纪念一下! 代码: #include<cstdio> #include<cstring> #include ...