前言: 本文旨在总结mysql数据库运维的常见操作,包括如下内容:

spacer.gifM7MOF8DZ`~T0%AV)SM1F)`G.png

spacer.gif


一>登录mysql数据库(help 命令,例如:help grant)

1>单实例登录:mysql -u root -p


二>修改mysql数据库管理员密码

法一:用mysqladmin更改

A>单实例:

mysqladmin -u root -p '123456' password '1234567'
B>多实例:
mysqladmin -u root -p '123456' password '1234567' -S /data/3306/mysql.sock
法二:用sql语句更改(此法适合密码丢失后通过--skip-grant-tables参数启动数据库后修改密码)
例如:忘记mysql的root密码时候:
[root@lll3 ssh]# service mysqld stop                      --------------先停止mysql
Shutting down MySQL. SUCCESS! 
[root@lll3 ssh]# vim /etc/my.cnf                            -----------在/etc/my.cnf的mysqld模块中加入--skip-grant-tables,重启即可免密码登录mysql
# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /application/mysql-5.5.32/tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
skip-grant-tables                                                            ------新加入skip-grant-tables
port            = 3306
socket          = /application/mysql-5.5.32/tmp/mysql.sock
[root@lll3 ssh]# service mysqld start                                        -----重启mysql
Starting MySQL... SUCCESS! 
[root@lll3 ssh]# mysql -u root -p
Enter password:                                                                         -----此时随意输入密码都能登录
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.32 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> update mysql.user set password=PASSWORD('123456') where user='root';          ------修改mysql的mysql库下面的user表的root密码,
                                                                                                     ------MySQL5.7下的修改字段为authentication_string
Query OK, 3 rows affected (0.01 sec)
Rows matched: 5  Changed: 3  Warnings: 0

然后退出将/etc/my.cnf中的skip-grant-tables去掉重启mysql用修改后 的密码登录即可    


法三:用set语句修改

set password=password("123456");


三>创建不同字符集数据库

1>创建默认字符集数据库

mysql> create database oldboy;-------创建名为oldboy的数据库
Query OK, 1 row affected (0.00 sec)
mysql> show create database oldboy\G              -----查看oldboy库的建库语句,默认是utf-8的字符集,因为编译安装mysql时指定了utf-8
*************************** 1. row ***************************
       Database: oldboy
Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.01 sec)

2>创建字符集为gbk的数据库

mysql> create database oldboy_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
Query OK, 1 row affected (0.07 sec)
mysql> show create database oldboy_gbk\G
*************************** 1. row ***************************
       Database: oldboy_gbk
Create Database: CREATE DATABASE `oldboy_gbk` /*!40100 DEFAULT CHARACTER SET gbk */
1 row in set (0.01 sec)

总结:企业里怎么创建数据库?

1>根据开发的程序确定字符集(建议utf-8)

2>编译安装数据库的时候指定字符集,例如:DEFAULT_CHARSET=utf8

 DEFAULT_COLLATION=utf8_general_ci\

    然后建库的时候默认创建即可,即create database oldboy

3>编译安装的时候没有指定字符集或者指定了和程序不同的字符集,指定字符集创建数据库即可

create database oldboy_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;----创建gbk字符集数据库

create database oldboy_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;----创建utf8字符集数据库

当然,数据库要支持创建数据库的字符集。


四>显示mysql数据库

mysql> show databases;----显示所有数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldboy             |
| oldboy_gbk         |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)
mysql> show databases like 'old%';----模糊查询显示数据库
+-----------------+
| Database (old%) |
+-----------------+
| oldboy          |
| oldboy_gbk      |
+-----------------+
2 rows in set (0.06 sec)
mysql> select database();----显示当前数据库
+------------+
| database() |
+------------+
| oldboy     |
+------------+
1 row in set (0.00 sec)

五>删除mysql数据库

mysql> drop database test;
Query OK, 0 rows affected (0.26 sec)


六>连接mysql数据库

mysql> use oldboy;
Database changed
mysql> select user();---查看用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.07 sec)
mysql> select now();---查看时间
+---------------------+
| now()               |
+---------------------+
| 2018-09-11 21:18:30 |
+---------------------+
1 row in set (0.06 sec)
mysql> select version();---查看数据库版本
+-----------+
| version() |
+-----------+
| 5.5.32    |
+-----------+
1 row in set (0.07 sec)


七>查询当前的数据库包含的表的信息

mysql> use oldboy;----连接oldboy库
Database changed
mysql> show tables;
Empty set (0.06 sec)


八>创建mysql用户及赋予用户权限

创建oldboy用户,对oldboy库具备所有权限,允许从localhost主机登录管理数据库,密码是oldboy123

mysql> grant all privileges on oldboy.* to 'oldboy'@'localhost' identified by 'oldboy123';--创建用户并赋予权限
Query OK, 0 rows affected (0.09 sec)
mysql> flush privileges;-----权限生效
Query OK, 0 rows affected (0.07 sec)
mysql> show grants for oldboy@localhost;----显示oldboy权限
+---------------------------------------------------------------------------------------------------------------+
| Grants for oldboy@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515' |
| GRANT ALL PRIVILEGES ON `oldboy`.* TO 'oldboy'@'localhost'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

九>授权局域网内主机远程连接数据库

根据grant命令语法,我们知道test@'localhost'位置为授权访问数据库的主机,localhost可以用域名,IP地址或者ip段来替代

百分号匹配法:

mysql> create user oldgirl@'192.168.0.%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
网段授权:
mysql> create user oldgirl1@'192.168.0.0/255.255.255.0' identified by '123456';----创建oldgril1用户允许从192.168.0.网段连接
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)




十>确定mysql的授权授权列表

mysql> show grants for oldboy@localhost;
+---------------------------------------------------------------------------------------------------------------+
| Grants for oldboy@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515' |
| GRANT ALL PRIVILEGES ON `oldboy`.* TO 'oldboy'@'localhost'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.06 sec)
mysql> REVOKE INSERT ON oldboy.* FROM 'oldboy'@'localhost';  ----收回insert权限
Query OK, 0 rows affected (0.08 sec)
mysql> show grants for oldboy@localhost;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for oldboy@localhost                                                                                                                                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515'                                                                                                                    |
| GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `oldboy`.* TO 'oldboy'@'localhost' |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)



十一>mysql创建表

DROP TABLE IF EXISTS `bm_jgbm`;
CREATE TABLE `bm_jgbm` (
  `bm` varchar(20) NOT NULL,
  `mc` varchar(100) DEFAULT NULL,
  `version` int(10) DEFAULT '1',
  PRIMARY KEY (`bm`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


十二>mysql查看表结构

mysql> desc user;  -----查看表结构
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.07 sec)

十三>mysql创建索引

DROP TABLE IF EXISTS `t_sy_institution`;
CREATE TABLE `t_sy_institution` (
  `id` int(20) NOT NULL DEFAULT '0',
  `parentid` int(20) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `s_state` int(4) DEFAULT NULL,
  `zjbzxbm` varchar(20) DEFAULT NULL COMMENT '在住建部制定的编码文档编码表中对应的机构编码',
  `jglb` varchar(4) DEFAULT '01',
  PRIMARY KEY (`id`),
  UNIQUE KEY `zjbzxbm_index` (`zjbzxbm`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

总结:

1>在表的单列或多列上创建索引(建立在表的字段上的一种快速的地址对应关系),可以加快查询速度,分为主键索引,普通索引。索引占用系统空间(空间),更新数据库时需要维护索引(时间),

索引并不是越多越好。索引一定要创建在where后的条件列,数十到几百行的小表上无需建立索引,更新频繁,读取少的表上要少建立索引。尽量选择在唯一值多的大表的字段上建立索引。

2>创建索引相关命令集合:

创建主键索引

alter table student change id id int primary key auto_increment;

删除主键索引

alter table student drop primary key

创建普通索引

alter table student add index index_dept(dept(8))

根据列的前n个字符创建索引

create index index_dept on student(dept(8))

根据多个列创建联合索引

create index ind_name_dept on student(name,dept);

根据多个列的前n个字符创建索引

create index ind_name_dept on student(name(8),dept(10));

删除普通索引

Alter table student drop index index_dept

drop index ind_name_dept on student

创建唯一索引

create unique index uni_ind_name on student(name);



十四>DML语句之insert

1>建立test表

mysql> CREATE TABLE test(
    ->   id int(4) NOT NULL AUTO_INCREMENT,
    ->   name char(20) NOT NULL,
    ->   PRIMARY KEY (id)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.22 sec)

2>按规矩指定所有列名,并且每列都插入值

mysql> insert into test(id,name) value(1,"oldboy");
Query OK, 1 row affected (0.32 sec)

3>由于id列为自增的,所以只在name列插入值

mysql> insert into test(name) value("oldboy");
Query OK, 1 row affected (0.07 sec)

4>如果不指定列,就要按规矩为每列都插入适当的值

mysql> insert into test values(3,'oldboy');
Query OK, 1 row affected (0.01 sec)

5>批量插入数据方法提升效率。

mysql> insert into test values(4,'woshishei'),(5,'nimei');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

6>数据插入成功,然后备份上述数据,留着备用。备份后检查备份的sql数据内容;过滤无用信息。

msyqldump是导出sql语句的形式备份。

mysqldump -uroot -p123456 -B mysql >/opt/mysql_bak.sql



十五>mysql用explain去查看执行计划(有没有走索引)

mysql> select * from test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | oldboy    |
|  2 | oldboy    |
|  3 | oldboy    |
|  4 | woshishei |
|  5 | nimei     |
+----+-----------+
5 rows in set (0.07 sec)


mysql> explain select * from test where name='oldboy'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5
        Extra: Using where
1 row in set (0.01 sec)
ERROR: 
No query specified
mysql> create index index_name on test(name);
Query OK, 0 rows affected (0.22 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(4)   | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | NO   | MUL | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> explain select * from test where name='oldboy'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
         type: ref
possible_keys: index_name
          key: index_name
      key_len: 60
          ref: const
         rows: 3
        Extra: Using where; Using index
1 row in set (0.01 sec)
ERROR: 
No query specified


十六>清除表中的数据(谨慎操作)

mysql> select * from test;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | oldboy    |
|  2 | oldboy    |
|  3 | oldboy    |
|  4 | woshishei |
|  5 | nimei     |
+----+-----------+
5 rows in set (0.00 sec)
mysql> truncate table test;
Query OK, 0 rows affected (0.07 sec)
mysql> desc test;------证明truncate只是清除了表数据,没有清除表结构
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(4)   | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | NO   |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.01 sec)


十七>增删改表的字段

mysql> alter table test add sex char(4);  -----增加字段
Query OK, 7 rows affected (0.11 sec)
Records: 7  Duplicates: 0  Warnings: 0
mysql> alter table test add age int(4) after name;---增加字段在某个字段后面
Query OK, 7 rows affected (0.14 sec)
Records: 7  Duplicates: 0  Warnings: 0
mysql> alter table test add qq varchar(10) first;-----增加字段在第一行
Query OK, 7 rows affected (0.05 sec)
Records: 7  Duplicates: 0  Warnings: 0
十八>更改表名及删除表(谨慎操作)
mysql> rename table test1 to test;  ----将表名由test1改为test
Query OK, 0 rows affected (0.01 sec)
mysql> alter table test1 rename to test;---将表名由test1改为test
Query OK, 0 rows affected (0.01 sec)
mysql> drop table test;  -----删除表test
Query OK, 0 rows affected (0.07 sec)
mysql> desc test;    ------表结构和数据都没有了,表已不存在
ERROR 1146 (42S02): Table 'mysql.test' doesn't exist


十九>Linux下MySQL的平滑启动,停止与重启

一、启动方式

1、使用 service 启动:service mysqld start

2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start

二、停止

1、使用 service 启动:service mysqld stop

2、使用 mysqld 脚本启动:/etc/inint.d/mysqld stop

三、重启

1、使用 service 启动:service mysqld restart

2、使用 mysqld 脚本启动:/etc/inint.d/mysqld restart

注意:尽量不要使用kill的方式停止mysql,因为这种野蛮的方法会强行终止MySQL数据库服务,有可能导致表损坏