MySQL常用命令基础操作
MySQL启动与更改密码
mysql启动基本原理说明:
/etc/init.d/mysqld是一个shell启动脚本,启动后最终会调用,mysqld_safe脚本,最后调用mysqld服务启动mysql,我们编辑/etc/init.d/mysqld,可以看到脚本,启动俩个进程mysqld和mysqld_safe,一般故障的时候我们用mysqld_safe来启动,
关闭mysql
- 1 mysqladmin - uroot -p密码 shut down
- 2 /etc/init.d/mysqld stop
- 3 kill USR2`cat path/pid`
优雅的关闭mysql但是不建议用killall杀掉所有的mysql进程,这样会导致mysql数据库起不来,所以网友遇到这样情况也很多,
我们登陆mysql后想分清出那个是正式环境那个是测试环境,
命令行修改登陆提示符
- mysql> prompt\u@king\s->
- PROMPT set to '\u@king\s->'
配置文件修改登陆提示符
在my.cnf配置文件中[mysql]模块下添加如下内容,保存后,无需重启myysql,退出当前的session,重新登陆
- [mysql]
- prompt=\\u@king\s->
登陆mysql
- [root @king~]# mysql
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 2
- Server version: 5.5.40 MySQL Community Server (GPL)
- Copyright (c) 2000, 2014, 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>
更改root密码
- 1 mysql> update user set password=password('123456') where user='root' and host='localhost'; #password('12345')是指定一个函数
- 2 Query OK, 1 row affected (0.00 sec)
- 3 Rows matched: 1 Changed: 1 Warnings: 0
- 4 mysql> flush privileges; #刷新,没刷新前是在内存里面
- 5 Query OK, 0 rows affected (0.17 sec)
- 6 mysql>
说明,修改密码都需要刷新一下哦,linux找回mysql root用户密码
单实例mysql修改丢失root方法
1,首先停止mysql
- /etc/init.d/mysql stop
2,使用–skip-grant-tables启动mysql,忽略授权登陆验证
- 1 mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
- 2 mysql -u root -p #说明-p登陆时密码是空,也可以不加-p,亲测哦(#^.^#)
- 3 update mysql.user set password=password("newpassword") where user='root'and host='localhost';
- 4 mysql> flush privileges;
- 5 mysql> quit
- 6 # /etc/init.d/mysql restart
- 7 # mysql -uroot -p
- 8 enter password: <输入新设的密码newpassword>
- 9 mysql>
多实例mysql修改丢失root方法
1关闭mysql
- killall mysqld
2启动时加–skip-grant-tables参数
- mysql_safe --defaults-file=/data/3306/my.cnf --skip-grant-tables& mysql -u root -p -S /data/3306/mysql.sock
3修改密码
- mysql>update mysql.user set password=password("newpassword") where user='root'and host='localhost';
- mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
SQl的分类
SQl结构化查询语言包含6个部分
- 数据查询语言(DQL(data query language)),作用从表中获取数据,关键字select,
- 数据操作语言(DMl(data manipulation language))作用处理表中的数据insert ,update,delete
- 事务处理语言(TPL)关键字begin,commit和 rollback
- 数据控制语言(DCl)grant(授权) 和revoke
- 数据定义语言(DDl)create和drop在数据库中创建新表或删除表 alter
- 指针控制语言(CCl) declare cursor, fetch into 和update where current用于对一个或多个表单独行的操作
查看数据库
show databases;或show database link ”;或select database;
- 1 mysql> show databases;
- 2 +--------------------+
- 3 | Database |
- 4 +--------------------+
- 5 | information_schema |
- 6 | mysql |
- 7 | performance_schema |
- 8 | student |
- 9 | test |
- 10 +--------------------+
- 11 8 rows in set (0.01 sec)
创建数据库
命令语法:create database <数据库名> 注意库名字不能数字开头
- 1 mysql> create database king;
- 2 Query OK, 1 row affected (0.01 sec)
- 3
- 4 mysql> show databases;
- 5 +--------------------+
- 6 | Database |
- 7 +--------------------+
- 8 | information_schema |
- 9 | king |
- 10 | mysql |
- 11 | performance_schema |
- 12 | student |
- 13 | test |
- 14 +--------------------+
- 15 6 rows in set (0.01 sec)
- 16
- 17 mysql> show create database king\G
- 18 *************************** 1. row ***************************
- 19 Database: king
- 20 Create Database: CREATE DATABASE `king` /*!40100 DEFAULT CHARACTER SET utf8 */
- 21 1 row in set (0.00 sec)
- 22
- 23 mysql>
创建一个指定字符集的数据库
- 1 mysql> CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; #红色指定编码,蓝色校验规则。
- 2 Query OK, 1 row affected (0.01 sec)
删除数据库
drop database <数据库名字>
- 1 mysql> drop database test;
- 2 Query OK, 1 row affected (0.07 sec)
- 3
- 4 mysql> show databases;
- 5 +--------------------+
- 6 | Database |
- 7 +--------------------+
- 8 | information_schema |
- 9 | king |
- 10 | mysql |
- 11 | performance_schema |
- 12 | student |
- 13 +--------------------+
- 14 5 rows in set (0.01 sec)
连接数据库
命令:use <数据库名>相当于linux下的cd切换目录的命令,use是切换数据库
- 1 mysql> use king;
- 2 Database changed
- 3 mysql> select database(); #查看当前的数据库,带()相当于函数,
- 4 +------------+
- 5 | database() |
- 6 +------------+
- 7 | king |
- 8 +------------+
- 9 1 row in set (0.00 sec)
查看数据库
select database ();相当于linux下的pwd
- 1 mysql> select version(); #查看当前的版本
- 2 +-----------+
- 3 | version() |
- 4 +-----------+
- 5 | 5.5.40 |
- 6 +-----------+
- 7 1 row in set (0.06 sec)
- 8 mysql> select user(); #查看当前的用户
- 9 +----------------+
- 10 | user() |
- 11 +----------------+
- 12 | root@localhost |
- 13 +----------------+
- 14 1 row in set (0.04 sec)
- 15 mysql> select now(); #查看当前的时间
- 16 +---------------------+
- 17 | now() |
- 18 +---------------------+
- 19 | 2018-11-02 19:26:39 |
- 20 +---------------------+
- 21 1 row in set (0.02 sec)
- 22 mysql>
表操作
创建表并查看
create table <表名>(<字段名1><类型1>);
- 1 mysql> create table im(id int(3) not null, name varchar(20) not null default'QQ' #创建表id为int类型,name为varchar
- 2 );
- 3 Query OK, 0 rows affected (0.59 sec)
- 4 mysql> show tables from king; #从king数据库中查看表
- 5 +----------------+
- 6 | Tables_in_king |
- 7 +----------------+
- 8 | im |
- 9 +----------------+
- 10 1 row in set (0.04 sec)
- 11 mysql> desc im; #查看表结构
- 12 +-------+-------------+------+-----+---------+-------+
- 13 | Field | Type | Null | Key | Default | Extra |
- 14 +-------+-------------+------+-----+---------+-------+
- 15 | id | int(3) | NO | | NULL | |
- 16 | name | varchar(20) | NO | | QQ | |
- 17 +-------+-------------+------+-----+---------+-------+
- 18 2 rows in set (0.22 sec)
- 19 mysql>
show colums from im;查看表结构
- 1 mysql> show create table im \G; #\G Send command to mysql server,display result vertically向MySQL服务器发送命令,垂直显示结果
- 2 *************************** 1. row ***************************
- 3 Table: im
- 4 Create Table: CREATE TABLE `im` (
- 5 `id` int(3) NOT NULL,
- 6 `name` varchar(20) NOT NULL DEFAULT 'QQ'
- 7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 8 1 row in set (0.64 sec)
mysql表的字段类型
列类型 | 需要的存储量 |
tinyint | 1字节 |
smallint | 2个字节 |
mediumint | 3个字节 |
int | 4个字节 |
integer | 4个字节 |
bigint | 8个字节 |
float(X) | 4如果x<=24或8如果25<=X=53 |
float | 4个字节 |
double | 8个字节 |
double precision | 8个字节 |
real | 8个字节 |
decimal(M,D) | M字节(D+2,如果m<D) |
numeric(M,D) | M字节(D+2,如果m<D) |
为表的字段创建索引
创建主键索引,查询数据库,按主键查询是最快的,每一个表只有一个主键列,但是可以有多个普通的索引列,主键列要求列的内容必须唯一,而索引列不要求内容必须唯一。
create table student(
id int (4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default’0′,
dept varchar(16) default null,
primary key (id),
key index_name(name));
- 1 mysql> create table student( id int (4) not null auto_increment, name char(20) n
- 2 ot null, age tinyint(2) not null default'0',dept varchar(16) default null,primar
- 3 y key (id), key index_name(name));
- 4 Query OK, 0 rows affected (0.18 sec)
auto_increment自增,primary key (id), 主键,key index_name(name));普通索引,
- 1 mysql> desc student; #查看创建的student表
- 2 +-------+-------------+------+-----+---------+----------------+
- 3 | Field | Type | Null | Key | Default | Extra |
- 4 +-------+-------------+------+-----+---------+----------------+
- 5 | id | int(4) | NO | PRI | NULL | auto_increment |
- 6 | name | char(20) | NO | MUL | NULL | |
- 7 | age | tinyint(2) | NO | | 0 | |
- 8 | dept | varchar(16) | YES | | NULL | |
- 9 +-------+-------------+------+-----+---------+----------------+
- 10 4 rows in set (0.17 sec)
alter table student drop primary key ; 删除主键,测试不行,
- 1 mysql> alter table student drop primary key ;
- 2 ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
不正确的表定义;只能有一个自动COLUM它必须被定义为一个密钥
alter table student change id id int primary key auto_increment; 如果创建表忘记添加主键了,就执行这个。
创建普通索引分为唯一索引和普通索引
alter table student drop index index_name; # index固定索引,index_name是你创建表的时候的索引
alter table student add index index_name(name);
create index index_name on student (name(8)); # index固定索引(固定写法),index_name 随便写但要见名知意, on student 在哪个表上(student)8就是前8个字符创建索引。
create index index_name_dept on student (name,dept)
按条件列查询数据时,联合索引是有前缀生效特性的 index(a,b,c)仅a,ab,abc三个查询条件列可以走索引
查看表的索引
- 1 mysql> show index from student\G;
- 2 *************************** 1. row ***************************
- 3 Table: student
- 4 Non_unique: 0
- 5 Key_name: PRIMARY
- 6 Seq_in_index: 1
- 7 Column_name: id
- 8 Collation: A
- 9 Cardinality: 0
- 10 Sub_part: NULL
- 11 Packed: NULL
- 12 Null:
- 13 Index_type: BTREE
- 14 Comment:
- 15 Index_comment:
- 16 *************************** 2. row ***************************
- 17 Table: student
- 18 Non_unique: 1
- 19 Key_name: index_name
- 20 Seq_in_index: 1
- 21 Column_name: name
- 22 Collation: A
- 23 Cardinality: 0
- 24 Sub_part: NULL
- 25 Packed: NULL
- 26 Null:
- 27 Index_type: BTREE
- 28 Comment:
- 29 Index_comment:
- 30 2 rows in set (0.00 sec)
创建唯一索引
create unique index uni on student(name);
- 1 mysql> create unique index uni on student (name);
- 2 Query OK, 0 rows affected (0.09 sec)
- 3 Records: 0 Duplicates: 0 Warnings: 0
- 4 mysql> desc student;
- 5 +-------+-------------+------+-----+---------+----------------+
- 6 | Field | Type | Null | Key | Default | Extra |
- 7 +-------+-------------+------+-----+---------+----------------+
- 8 | id | int(4) | NO | PRI | NULL | auto_increment |
- 9 | name | char(20) | NO | UNI | NULL | |
- 10 | age | tinyint(2) | NO | | 0 | |
- 11 | dept | varchar(16) | YES | | NULL | |
- 12 +-------+-------------+------+-----+---------+----------------+
- 13 4 rows in set (0.02 sec)
- 要在表的列上创建索引
- 索引会加快查询的速度,但是会影响更新的速度
- 索引不是越多越好,要在频繁查询的where后的条件列上创建索引
- 小表或唯一值极少的列上不建索引,要在带包以及不同内容多的列上创建索引
往表中插入数据
create table test(
id int(4) not null auto_increment,
name char(20) not null,
primary key (id)
);
- 1 mysql> create table test(id int(4) not null auto_increment, name char(20) not n
- 2 ll,primary key (id));
- 3 Query OK, 0 rows affected (0.01 sec)
- 4 mysql> show tables;
- 5 +----------------+
- 6 | Tables_in_king |
- 7 +----------------+
- 8 | student |
- 9 | test |
- 10 +----------------+
- 11 2 rows in set (0.00 sec)
- 12 mysql> insert into test (id,name) values(1,'boy'); #插入数据,主键自增我们直接插name,insert into test(name) values('new');
- 13 Query OK, 1 row affected (0.05 sec)
- 14 mysql> select *from test;
- 15 +----+------+
- 16 | id | name |
- 17 +----+------+
- 18 | 1 | boy |
- 19 +----+------+
- 20 1 row in set (0.04 sec)
- mysql> delete from test;
- Query OK, 1 row affected (0.05 sec)
- mysql> select *from test;
- Empty set (0.00 sec)
- mysql> insert into test (id,name) values(1,'boy'),(2,'new');
- Query OK, 2 rows affected (0.00 sec)
- Records: 2 Duplicates: 0 Warnings: 0
Loading….
创建/查看/删除mysql系统的用户
语法:
- create user ‘用户名’@’主机名’ identified by ‘用户名’; 创建用户
- select host,user from mysql.user; 查看用户
- drop user 用户名@’%’;注意可以是单或者双引号,但不能不加,删除用户
- delete from mysql.user where user=’用户名’ and host=‘@后面指定的主机名’;
- 1 mysql> create user 'usrabc'@'%' identified by 'usrabc'; #创建usrabc用户
- 2 Query OK, 0 rows affected (0.49 sec)
- 3 mysql> select host,user from mysql.user; #查看所有用户
- 4 +-----------+--------+
- 5 | host | user |
- 6 +-----------+--------+
- 7 | % | usrabc |
- 8 | localhost | root |
- 9 +-----------+--------+
- 10 2 rows in set (0.00 sec)
- 11 mysql> drop user usrabc@'%'; #删除usrabc用户
- 12 Query OK, 0 rows affected (0.00 sec)
处理完用户最好刷新一下权限,flush privileges;
创建mysql用户及赋予用户权限
通过help grant 查看帮助,比较常用的创建用户的方法是:CREATE USER ‘jeffrey’@’localhost’ IDENTIFIED BY ‘mypass’
- CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'
- GRANT ALL ON db1.* TO 'jeffrey'@'localhost' #这俩命令是先用create创建用户,然后在授权
- GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'
- GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90
通过grant命令创建用户并授权,命令语法:grant all privileges on dbname.* to username@localhost identified by ‘passwd’;
grant | all privileges | on dbname.* | to username@localhost | identified by ‘passwd’ |
授权命令 | 对应权限 | 目标:库和表 | 用户名和客户端主机 | 用户密码 |
- 1 mysql> grant all privileges on king.* to liang@localhost identified by '123456';
- 2 #创建liang用户,对king库具备所有权限,允许从localhost主机登陆管理数据库,密码是123456.
- 3 Query OK, 0 rows affected (0.01 sec)
- 4 mysql> flush privileges;
- 5 Query OK, 0 rows affected (0.96 sec)
- 1 mysql> show grants for liang@localhost; #查看权限
- 2 +-------------------------------------------------------------------------------
- 3 -------------------------------+
- 4 | Grants for liang@localhost
- 5 |
- 6 +-------------------------------------------------------------------------------
- 7 -------------------------------+
- 8 | GRANT USAGE ON *.* TO 'liang'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74
- 9 329105EE4568DDA7DC67ED2CA2AD9' |
- 10 | GRANT ALL PRIVILEGES ON `king`.* TO 'liang'@'localhost'
- 11 |
- 12 +-------------------------------------------------------------------------------
- 13 -------------------------------+
- 14 2 rows in set (0.07 sec)
create和grant配合
- 1 mysql> create user zh@localhost identified by '123456';
- 2 Query OK, 0 rows affected (0.04 sec)
- 3 mysql> grant all on king.* to zh@localhost;
- 4 Query OK, 0 rows affected (0.00 sec)
- 5 mysql> flush privileges;
- 6 Query OK, 0 rows affected (0.00 sec)
授权局域网内主机远程连接数据库grant all privileges on king.* to liang@10.0.0.% identified by ‘123456’;把localhost改为ip就可以了。连接,mysql -uliang -p123456 -h10.0.0.%
- 1 mysql> show grants for zh@localhost; #查看zh用户权限
- 2 +-------------------------------------------------------------------------------
- 3 ----------------------------+
- 4 | Grants for zh@localhost
- 5 |
- 6 +-------------------------------------------------------------------------------
- 7 ----------------------------+
- 8 | GRANT USAGE ON *.* TO 'zh'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329
- 9 105EE4568DDA7DC67ED2CA2AD9' |
- 10 | GRANT ALL PRIVILEGES ON `king`.* TO 'zh'@'localhost'
- 11 |
- 12 +-------------------------------------------------------------------------------
- 13 ----------------------------+
- 14 2 rows in set (0.16 sec)
- 15
- 16 mysql> revoke insert on king.* from zh@localhost; #更改权限
- 17 Query OK, 0 rows affected (0.04 sec)
- 18
- 19 mysql> show grants for zh@localhost;
- 20 +-------------------------------------------------------------------------------
- 21 --------------------------------------------------------------------------------
- 22 -------------------------------------------------------------+
- 23 | Grants for zh@localhost
- 24
- 25 |
- 26 +-------------------------------------------------------------------------------
- 27 --------------------------------------------------------------------------------
- 28 -------------------------------------------------------------+
- 29 | GRANT USAGE ON *.* TO 'zh'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329
- 30 105EE4568DDA7DC67ED2CA2AD9'
- 31 |
- 32 | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE T
- 33 EMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, A
- 34 LTER ROUTINE, EVENT, TRIGGER ON `king`.* TO 'zh'@'localhost' |
- 35 +-------------------------------------------------------------------------------
- 36 --------------------------------------------------------------------------------
- 37 -------------------------------------------------------------+
- 38 2 rows in set (0.06 sec)
- 1 mysql -uroot -p123456 -e "show grants for zh@localhost;"|grep -i grant #用linux中grep命令过滤需要的权限
- 2 Grants for zh@localhost
- 3 GRANT USAGE ON *.* TO 'zh'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329
- 4 105EE4568DDA7DC67ED2CA2AD9'
- 5 GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE T
- 6 EMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, A
- 7 LTER ROUTINE, EVENT, TRIGGER ON `king`.* TO 'zh'@'localhost'
查看mysql的ALL PRIVILEGES权限mysql -uroot -p123456 -e “show grants for zh@localhost;”|grep -i grant|tail -1|tr ‘,’ ‘\n’ >a.txt
我们在授权用户最小的 满足业务需求的权限,而不是一味的授权ALl PRIVILEGES。