一.误删除root用户如何恢复?
1.停止数据库
[root@db01 ~]# /etc/init.d/mysqld stop
2.跳过授权表启动mysql
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
3.尝试创建用户
mysql> create user root@'localhost' identified by '123';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> grant all on *.* to root@'localhost' identified by '123';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
4.插入root用户
mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) values('localhost','root',PASSWORD('123'),'','','');
insert into mysql.user values ('localhost','root',PASSWORD('123'),
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'',
'',
'',
'',0,0,0,0,'mysql_native_password','','N');
方法二:
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
授权超级用户
grant all on *.* to root@'localhost' identified by '123' with grant option;
二.mysqld 的程序结构
1.连接层
1)检验用户的合法性
2)提供两种连接方式
a)TCP/IP
[root@db02 ~]# mysql -uroot -p123 -h10.0.0.51
[root@db01 ~]# mysql -uroot -p123 -h127.0.0.1
b)socket
[root@db01 ~]# mysql -uroot -p123 -S /usr/local/mysql/tmp/mysql.sock
[root@db01 ~]# mysql -uroot -p123 -hlocalhost
[root@db01 ~]# mysql -uroot -p123
3)建立一个与SQL层交互的线程
2.SQL层
1)接收连接层传来的SQL语句
2)检查语法
3)检查语义(检查它属于哪种SQL语句:DDL,DML,DCL,DQL)
4)解析器:解析SQL语句,生成多种执行计划
5)优化器:接收解析器传来的多种执行计划,选择最优化的一条方式去执行
6)执行器:执行优化器传来的最优方式的SQL语句
a)建立一个与存储引擎层交互的线程
b)接收存储引擎层,返回的结构化成表的数据
7)写缓存
8)记录日志
3.存储引擎层
1)接收SQL层传来的SQL语句
2)与磁盘交互,找到数据并结构化成表的形式,返回给SQL层
3)建立一个与SQL层交互的线程
三.什么是实例?
1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。
多实例:
1)多个进程
2)多个线程
3)多个预分配的内存结构
多套配置文件:
多个端口
多套数据目录(--datadir=/usr/local/mysql/data)
多个socket文件
四.mysql的多实例
1.创建多个配置文件目录
[root@db01 ~]# mkdir -p /data/330{7..9}
[root@db01 ~]# tree /data/
/data/
├── 3307
├── 3308
└── 3309
[root@db01 ~]# ll /data/
total 0
drwxr-xr-x. 2 root root 6 May 9 09:59 3307
drwxr-xr-x. 2 root root 6 May 9 09:59 3308
drwxr-xr-x. 2 root root 6 May 9 09:59 3309
2.编辑多个配置文件
[root@db01 ~]# vim /data/3307/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
server-id=7
log_error=/data/3307/data/mysql.err
pid=/data/3307/data/mysql.pid
========================================
[root@db01 ~]# vim /data/3308/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
server-id=8
log_error=/data/3308/data/mysql.err
pid=/data/3308/data/mysql.pid
=========================================
[root@db01 ~]# vim /data/3309/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
server-id=9
log_error=/data/3309/data/mysql.err
pid=/data/3309/data/mysql.pid
2.进入初始化目录
[root@db01 ~]# cd /usr/local/mysql/scripts/
3.初始化多套数据目录
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data
[root@db01 scripts]# ll /data/330*
/data/3307:
total 4
drwx------. 5 mysql mysql 127 May 9 10:11 data
-rw-r--r--. 1 root root 175 May 9 10:05 my.cnf
/data/3308:
total 4
drwx------. 5 mysql mysql 127 May 9 10:12 data
-rw-r--r--. 1 root root 175 May 9 10:06 my.cnf
/data/3309:
total 4
drwx------. 5 mysql mysql 127 May 9 10:12 data
-rw-r--r--. 1 root root 175 May 9 10:07 my.cnf
4.授权
[root@db01 scripts]# chown -R mysql.mysql /data/330*
5.启动mysql
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &
6.检查端口
[root@db01 scripts]# netstat -lntup|grep 330
tcp6 0 0 :::3306 :::* LISTEN 41108/mysqld
tcp6 0 0 :::3307 :::* LISTEN 42206/mysqld
tcp6 0 0 :::3308 :::* LISTEN 42378/mysqld
tcp6 0 0 :::3309 :::* LISTEN 42550/mysqld
7.检查进程
[root@db01 scripts]# ps -ef|grep mysqld
root 40999 1 0 08:54 pts/0 00:00:00 /bin/sh /usr/local/mysql-5.6.40/bin/mysqld_safe --datadir=/usr/local/mysql-5.6.40/data --pid-file=/usr/local/mysql-5.6.40/data/db01.pid
mysql 41108 40999 0 08:54 pts/0 00:00:03 /usr/local/mysql-5.6.40/bin/mysqld --basedir=/usr/local/mysql-5.6.40 --datadir=/usr/local/mysql-5.6.40/data --plugin-dir=/usr/local/mysql-5.6.40/lib/plugin --user=mysql --log-error=db01.err --pid-file=/usr/local/mysql-5.6.40/data/db01.pid
root 42056 7747 0 10:18 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf
mysql 42206 42056 0 10:18 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/usr/local/mysql --datadir=/data/3307/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3307/data/mysql.err --pid-file=db01.pid --socket=/data/3307/mysql.sock --port=3307
root 42228 7747 0 10:18 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3308/my.cnf
mysql 42378 42228 4 10:18 pts/0 00:00:03 /usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf --basedir=/usr/local/mysql --datadir=/data/3308/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3308/data/mysql.err --pid-file=db01.pid --socket=/data/3308/mysql.sock --port=3308
root 42379 7747 0 10:18 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3309/my.cnf
mysql 42550 42379 2 10:18 pts/0 00:00:02 /usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf --basedir=/usr/local/mysql --datadir=/data/3309/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/3309/data/mysql.err --pid-file=db01.pid --socket=/data/3309/mysql.sock --port=3309
root 42577 7747 0 10:20 pts/0 00:00:00 grep --color=auto mysqld
8.多实例设置密码
[root@db01 ~]# mysqladmin -uroot -p -S /data/3307/mysql.sock password 3307
[root@db01 ~]# mysqladmin -uroot -p -S /data/3308/mysql.sock password 3308
[root@db01 ~]# mysqladmin -uroot -p -S /data/3309/mysql.sock password 3309
9.多实例连接
[root@db01 ~]# mysql -uroot -p3307 -S /data/3307/mysql.sock
[root@db01 ~]# mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 ~]# mysql -uroot -p3309 -S /data/3309/mysql.sock
10.连接技巧
[root@db01 ~]# vim /usr/local/mysql/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/mysql.sock
[root@db01 ~]# vim /usr/local/mysql/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 ~]# vim /usr/local/mysql/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db01 ~]# chmod +x /usr/local/mysql/bin/mysql330*
11.停止mysql多实例
[root@db01 ~]# mysqladmin -uroot -p3307 -S /data/3307/mysql.sock shutdown
[root@db01 ~]# mysqladmin -uroot -p3308 -S /data/3308/mysql.sock shutdown
[root@db01 ~]# mysqladmin -uroot -p3309 -S /data/3309/mysql.sock shutdown
五.mysql的结构
1.物理结构
[root@db01 ~]# ll /usr/local/mysql/data/mysql/
最底层的数据文件
2.逻辑结构
数据库管理员操作的 对象
库
表=元数据+真实的数据行
元数据=列(字段)+其他的属性(表的大小,行数...)
列=列名字+约束(数据类型,是否为空,主键,默认值...)
六.mysql 段区页
段:一个段=一张表,一个段是由多个区构成的
区:多个页构成的的,64k为一个区(4个页为一个区)
页:mysql最小单位,一个页为16k
七.mysql客户端命令
架构:C/S
mysql 常用option:
1. -u:指定用户
2. -p:指定密码
3. -S:指定socket文件
4. -P:指定端口
5. -h:指定主机域
6. -e:指定SQL语句
mysqladmin
1. -u:指定用户
2. -p:指定密码
3. -S:指定socket文件
4. -P:指定端口
5. -h:指定主机域
password:指定新密码
shutdown:停止mysql服务
create oldboy:在库外创建数据库
#库外删除数据库
[root@db01 data]# mysqladmin -uroot -p1 drop oldboy
Warning: Using a password on the command line interface can be insecure.
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'oldboy' database [y/N] y
mysqldump
八.SQL语句的种类
1.DDL:数据定义语言
1)针对数据库
create database oldboy;
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
增:
mysql> create database IF NOT EXISTS zls CHARACTER SET=utf8 COLLATE=utf8_general_ci;
删:
drop database oldboy;
改:
mysql> alter database zls CHARACTER SET=gbk;
2)针对表的
增:
create table student(
sid INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘学号’,
sname VARCHAR(20) NOT NULL COMMENT ‘学生姓名’,
sage TINYINT UNSIGNED COMMENT ‘学生年龄’,
sgender ENUM('m','f') NOT NULL DEFAULT ‘m’ COMMENT ‘学生性别’,
cometime DATETIME NOT NULL COMMENT ‘入学时间’)chatset utf8 engine innodb;
删:
mysql> drop table oldboy2;
改:
mysql> alter table stu add yyf varchar(20) first;
mysql> alter table stu add dengyifan varchar(20) after egon;
mysql> alter table stu add yuanhu varchar(10);
mysql> alter table stu drop egon;
mysql> alter table stu rename stu1;
mysql> alter table stu add test varchar(20),add qq int;
2.DCL:数据控制语言
grant
#其他参数(扩展)
max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connetions_per_hour:一个用户每小时可连接到服务器的次数
max_user_connetions:允许同时连接数量
grant all on *.* to root@'%';
所有库,所有表
grant all on mysql.* to root@'%';
mysql中的所有表:单库级别
grant all on mysql.user to root@'%';
mysql库的user表:单表级别
脱敏:单列级别
grant select(name,age,sex) on mysql.user to dev@'%';
运维或者DBA给开发人员开数据库用户:
grant select,insert,update on *.* to dev@'%' identified by '123';
revoke
mysql> revoke select on *.* from root@'%';
SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
3.DML:数据操作语言
insert:
insert into stu values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);
insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);
insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456),
('linux02',2,NOW(),'zhangsi',21,'f',NOW(),111,1234567);
update:
mysql> update oldboy set id=11;
企业中 规范用法:where条件
mysql> update oldboy set id=10 where id=1;
mysql> update oldboy set id=12 where 1=1;
delete:
mysql> delete from student;
mysql> delete from student where sid=3;
update代替delete做伪删除:
1)给表,添加一个状态列
mysql> alter table oldboy add status enum('1','0') default '1';
2)删除数据
mysql> update oldboy set status='0' where id=2;
3)查询数据
mysql> select * from oldboy where status='1';
4.DQL
select:
mysql> select * from city;
mysql> select * from city where countrycode='CHN';
mysql> select * from city where countrycode='CHN' limit 10;
mysql> select * from city limit 10,10;
mysql> select name,population from city where countrycode='CHN' and district='heilongjiang';
#世界上小于100人的人口城市是哪个国家的?
国家名,城市名,人口数量
country.name city.namecity.population
1.传统连接
select country.name,city.name,city.population from city,country where city.countrycode=country.code and city.population<100;
2.自连接:两张表中,有相同的列名字
城市名国家简称语言城市人口
SELECT city.name,city.countrycode ,countrylanguage.language ,city.population
FROM city NATURAL JOIN countrylanguage
WHERE population > 1000000
ORDER BY population limit 10;
3.内连接:小表在前,大表在后
城市名字国家名城市人口
select city.name,country.name,city.population
from city join country
on city.countrycode=country.code
where city.population<100;
范式: 减少数据冗余,防止产生一致性问题,把一个表作为一个原子,把一张表拆到不能再拆为止。(开发阶段设计规范)