一.誤刪除root用戶如何恢復?mysql
1.中止數據庫
[root@db01 ~]# /etc/init.d/mysqld stoplinux
2.跳過受權表啓動mysql
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &sql
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'),'','','');vim
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;socket
二.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.name city.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; 範式: 減小數據冗餘,防止產生一致性問題,把一個表做爲一個原子,把一張表拆到不能再拆爲止。(開發階段設計規範)