MySQL数据库管理

好记性不如烂笔头

1.MySQL启动基本原理

 /etc/init.d/mysqld 是一个shell启动脚本,启动后会调用mysqld_safe脚本,最后调用的是mysqld主程序启动mysql。

单实例和多实例启动的区别就是多实例需要指定启动的配置文件

mysqld_safe --datadir="$datadir" --pid-file="mysql_pid_file_path" $other_args --user=mysql > /dev/null &
# 单实例启动进程
/etc/init.d/mysqld start
# 多实例启动
/bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_3306/my.cnf 2>&1 > /dev/null &

2.MySQL停止

/etc/init.d/mysqld stop
# 脚本里的stop方法
/bin/kill "$MYSQLPID" >/dev/null 2>&1
# 使用mysqladmin停止服务
mysqladmin -uroot -p123.com -S /data/dbdata_3306/mysql.sock shutdown

3.查看进程

mysql 启动后有如下两个进程
mysqld_safe 管理进程
mysqld 工作进程

[root@cmdb-server ~]# ps -ef | grep mysql | grep -v mysql
root      1592     1  0 21:13 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     1700  1592  0 21:13 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
# 查看端口
ss -lnt | grep 3306

4.MySQL登录

# 单实例
mysql # 老版本以前刚装完系统可以直接登录,5.7以后需要初始化密码 mysql -uroot mysql -uroot -p # dba标准登录命令 mysql -uroot -p'oldboy123' # 引号可加可不加,有特殊符号的时候需要加。一般在脚本里用,密码明文会泄漏密码,可以用history清空历史命令 # 强制linux不记录敏感历史命令 #HISTCONTROL=ignorespace 忽略空格命令,可以在配置文件里设置,使用mysql登录命令时可以在前面加空格。 chmod 700 /data/3306/mysql # 设置MySQL目录权限
# 多实例
mysql -uroot -p -S /data/3306/mysql.sock # -S 指定不同的套接字文件登录不同的服务
mysql -uroot -p -h127.0.0.1 -P3307 # 远程连接无需指定sock文件,但是需要指定数据库服务器IP地址及端口
# 退出
quit
exit
ctrl键 + DC

5.设置用户密码

mysqladmin -uroot password 'oldboy456'  # 没有密码的用户设置或修改密码命令
mysqladmin -uroot password 'oldboy' -S /data/3306/mysql.sock # 多实例方式设置或修改密码
-- 老版本数据库 修改用户名密码
update mysql.user SET password=PASSWORD('oldboy') where user='root' and host='localhost';
-- 5.7以后
update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';

6.创建数据库

-- 创建数据库 设置字符集utf8
CREATE DATABASE `data_analysis` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建数据库 设置字符集gbk
create database oldboy_gbk default character set gbk collate gbk_chinese_ci;
-- 提示:字符集的不一致是数据库的中文内容乱码的罪魁祸首
-- 查看字符集及校队规则名字的方法
show character set;
-- 查看 MySQL 数据库服务器和数据库字符集
show variables like '%char%';

show databases; -- 显示数据库
drop database oldboy_gbk; -- 删除数据库
use oldboy_gbk; -- 进入数据库
select database(); -- 查看当前的数据库
select user(); -- 查看当前的用户
select version(); -- 查看当前的版本
select now(); -- 查看当前时间

7.用户、权限

/*
授权分两种:
    1.先创建用户再授权
    2.同时授权并创建用户
*/
DROP USER 'jeffrey'@'localhost'; -- 删除用户
-- 如果drop删除不了就以root身份用delete直接去用户表里删除,
delete from mysql.user where user='root' and host='localhost';
-- 创建用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 
-- 查看所有用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
-- 查看当前用户权限
show grants;
-- 查看指定用户权限
show grants for 'cactiuser'@'%';
-- 授权(生产环境常用)
GRANT SELECT,UPDATE,DELETE,INSERT ON `db_name`.* TO 'user_name'@'localhost';
-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
-- 创建用户并同时授权(WITH GRANT OPTION:用户具有赋权的权限, 允许root用户远程操作数据库)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
-- 设置某个网段访问权限及赋权的权限
GRANT ALL PRIVILEGES ON oldboy_gbk.* TO 'root'@'192.168.93.%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
-- 使用子网掩码设置某个网段访问权限及赋权的权限
GRANT ALL PRIVILEGES ON oldboy_gbk.* TO 'root'@'192.168.93.0/255.255.255.0' IDENTIFIED BY '123.com' WITH GRANT OPTION;
-- 创建用户并授权(privileges可有可无,常用生产环境)
grant all privileges on oldboy.* to huangxiaoxue@'localhost' identified by 'huangxiaoxue'; 
-- 收回权限(不包含赋权权限)
REVOKE all privileges ON bbs.* FROM 'oldboy'@'192.168.93.0';
-- 收回赋权权限
revoke grant option on bbs.* from 'oldboy'@'192.168.93.0';
-- 运行此句才生效,或者重启MySQL
flush privileges;

8、表

-- 建表语法
create table 表名 (
字段名 类型
)
-- 建表语句
create table if not exists `student` (
    `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `name` char(20) NOT NULL,
    `age` tinyint(2) NOT NULL DEFAULT '0',
    `dept` varchar(16) DEFAULT NULL
    -- 外键在这里修饰
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
show create table 表名; -- 显示表的创建语句
drop table student;  -- 删除表
alter table 表名 rename to 新表名; -- 修改表名
alter table student character set utf8; -- 修改表的字符集
alter table student modify name char(20) character set utf8; -- 修改字段的字符集
alter table 表名 MODIFY 字段名 字段类型; -- (例如:VARCHAR(255) DEFAULT NULL) 修改表的字段类型 
-- 显示表的结构
desc 表名;
SELECT
  COLUMN_NAME,
  DATA_TYPE,
  COLUMN_TYPE,
  COLUMN_COMMENT
FROM
    information_schema.COLUMNS
WHERE
    table_name = 'user_info' -- 表名
AND table_schema = 'api';  -- 库名

 9、字段类型

http://www.runoob.com/mysql/mysql-data-types.html 详解

1.INT[(M)]型:正常大小整数型
2.CHAR(M)型:定长字符串类型,当存储时,总是用空格填满右边到指定的长度。
优点:查询速度快,不用再计算长度,一次读取指定字节
缺点:占用存储空间
3.VARCHAR:变长字符类型
优点:根据字符串长度存储数据,节省存储空间
缺点:查询速度慢,需要先计算长度后再读取此长度的字节

10、索引

https://www.cnblogs.com/whgk/p/6179612.html 索引详解

数据库的索引就像书的目录一样,如果在字段上建立索引,那么以索引列为查询条件可以加快查询数据的速度。

10.1主键索引

-- 建表语句
create table if not exists `student` (
    `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `name` char(20) NOT NULL,
    `age` tinyint(2) NOT NULL DEFAULT '0',
    `dept` varchar(16) DEFAULT NULL
    -- 外键在这里修饰
    -- primary key(id) 主键可以放在这里也可以放在定义列的类型里, auto_increment 主键一般自动递增
    key index_name(name), -- name 字段普通索引
    key NameDeptIdx (`name`(20), dept) -- 组合索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 删除字段的自增约束auto_increment
alter table student change id id int;
-- 删除主键(必须先删除主键的约束才能删除主键)
alter table student drop primary key;
-- 添加主键并且设置主键自增
alter table student change id id int primary key auto_increment;
-- 添加索引语法
ALTER TABLE 表名 ADD INDEX (字段);
ALTER TABLE 表名 ADD INDEX 索引名称(列名);
ALTER TABLE student ADD INDEX NameIdx(name);
-- 字段添加唯一性约束(唯一索引)
ALTER TABLE `student` ADD unique(`username`);
CREATE UNIQUE index uni_idx_name ON student(name);
-- 删除字段索引
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name;
DROP INDEX index_name ON tbl_name;
-- 查看某个数据库表的索引
SHOW INDEX FROM mytable FROM mydb;
SHOW INDEX FROM mydb.mytable;
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | char(20)    | NO   | MUL | NULL    |                |
| age   | tinyint(2)  | NO   |     | 0       |                |
| dept  | varchar(16) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
/** 注意:
  如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL
  如果Key是UNI,代表唯一索引
  提示:
       生产环境数据量很大的时候,比如100万以上数据量的时候,如果建索引会影响用户访问,尽量选择用户访问量少的时候建里索引。
**/
-- 对字段的前n个字符创建普通索引
create index index_name on tbl_name(col_name(length));

10.2组合索引

如果查询条件是多列,可以为多个查询列创建组合索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合,也就是前缀特性。

create index NameDeptIdx on student(name, dept);
mysql> show index from student;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | NameDeptIdx |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | NameDeptIdx |            2 | dept        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
-- 建表语句
create table if not exists `student` (
    `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `name` char(20) NOT NULL,
    `age` tinyint(2) NOT NULL DEFAULT '0',
    `dept` varchar(16) DEFAULT NULL
    -- 外键在这里修饰
    -- primary key(id) 主键可以放在这里也可以放在定义列的类型里, auto_increment 主键一般自动递增
    -- key index_name(name), -- name 字段普通索引
    key NameDeptIdx (`name`(20), `dept`) -- 组合索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*
提示:
     尽量在唯一值多的大表上建立索引。
     如:index(a,b,c),a, ab, abc 三个查询条件会使用索引,而b,bc,ac,c等无法使用索引。尽量把最常用的查询的列放在第一个位置。
     主键组合索引:PRIMARY KEY (`Host`,`User`)
*/

10.3索引知识小结
1.索引类似书籍的目录,可以加快查询速度。
2.要在表的列(字段)上创建索引。
3.索引会加快查询速度,但也会影响更新、插入的速度,因为更新、插入需要维护索引。
4.索引并不是越多越好,要在经常查询的条件列上创建索引。
5.小表或者唯一值少的表上可以不建立索引,要在唯一值多的大表上建立索引。
6.组合索引有前缀生效特性
7.当字段内容前N个字符已经唯一时,可以针对字段的前N个字符创建索引。
8.索引从工作方式上区分,有唯一、主键、普通索引。
9.索引类型会有BTREE(默认)和hash(适合做缓存(内存数据库))等。

11、插入

INSERT INTO tbl_name (col_name, ...) VALUES (value_list); -- 语法
/*
   1.按顺序指定所有列名和对应的值
   2.由于id列自增,可以不指定id列的值
*/
insert into student (name, age, dept) values ('hanson', 32, '运维');
-- 如果不指定列就要按表的字段顺序插入值
insert into student values ('hanson', 32, '运维');
-- 批量插入
insert into student values ('hanson', 32, '运维'), ('小泽玛利亚', 21, '咨询');
-- 将查询结果插入到表里
insert into test (name, age) select name, age from student;

12、查询

http://www.runoob.com/sql/sql-select.html
SQL简易教程
https://www.cnblogs.com/aqxss/p/6563625.html
查询练习

语法:select <字段1,字段2,...> from 表名 where 表达式

-- 查询表中所有数据
select * from student;
-- 查询指定字段
select user,host from mysql.user;
/*
  LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
limit 常用于程序分页
*/ SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset; -- limit 语法 SELECT * FROM table LIMIT 5,10; -- 检索记录行 6-15 -- 为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: SELECT * FROM table LIMIT 95,-1; -- 检索记录行 96-last. -- 如果只给定一个参数,它表示返回最大的记录行数目: SELECT * FROM table LIMIT 5; -- 检索前 5 个记录行 -- 换句话说,LIMIT n 等价于 LIMIT 0,n。 -- 注意limit 10和limit 9,1的不同: -- 按指定条件查询 select * from student where name='一本道' and id=3; -- 按指定范围查询 select * from student where id>2 and id<5; select * from student where id between 2 and 5; -- 按id倒序查询 order by select * from student order by id desc;
原文地址:https://www.cnblogs.com/huangxiaoxue/p/8870496.html