MySQL数据库操作

Posted Sonfer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库操作相关的知识,希望对你有一定的参考价值。

 

一、简介

mysql是什么?

  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
  • MySQL是将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  • MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
  • 由于其社区版的性能卓越,搭配 php 和 Apache可组成良好的开发环境

数据库简介:

  是数据结构化的结合。电子化的文件柜,数据库是指以一定的方式存储在一起的数据的集合。

  数据库的组成:

    数据库由表组成,数据库映射到系统中是一个目录
    表是由相关数据组成,表映射到系统中是文件
    记录是由一定数量不同属性的字段组成的

  数据库管理系统是为了管理数据库而设计的计算机软件,一般情况下有存储、截取、维护及备份等功能。

数据库的分类:

  关系型数据库

    是建立在关系模型基础上的数据库

    常见的关系型数据库:
      MySQL:开放源代码
      MariaDB:Mysql的替代品
      Oracle:闭源
      SQL Server:微软的
      DB2:IBM
      Access:微软公司

    非关系型数据库:
      与关系型数据库最明显的区别:不再使用SQL作为查询语言
      MongoDB
      hadoop

Mysql的结构:

  C/S结构:客户端/服务器结构 客户端和服务器端都的装软件

  CentOS7:
    Server:mariadb-server
    Client :mariadb

  RedHat6:
    Server:mysql-server
    Client :mysql

二、登录、帮助

  MySQL默认情况下支持匿名登陆

匿名登陆

# mysql

给root用户设置密码

# mysqladmin -u root password
New password: 
Confirm new password:

本地登陆:

# mysql -u root -p123456
注意:-p后面一定没有空格

远程登陆:

# mysql -u root -h 192.168.1.2 -p123456

帮助:

    官方网站:http://www.mysql.com
         http://dev.mysql.com/doc

MySQL获取客户端帮助

MariaDB [(none)]>help; 或者 ? 或者 \h 
MariaDB [(none)]> create databases
-> \c 清除当前输入的sql语句,注意一定要在没敲分号的时候使用
MariaDB [(none)]> exit 退出 quit \q 

MariaDB [(none)]> use farm; 切换数据库
MariaDB [(none)]> \u test

MariaDB [(farm)]> source qqfarm.sql; 执行sql脚本
MariaDB [test]> \. qqfarm.sql

MariaDB [(none)]> system ls; 调用系统命令
MariaDB [(none)]> \! ls;

  

忘记MySQL密码

修改配置文件

#vim /etc/my.cnf
[mysqld] skip-grant-table //添加 跳过权限表 datadir=/var/lib/mysql

重启服务

# systemctl restart mariadb.service

登陆mysql

# mysql
MariaDB [(none)]> select user,password,host from mysql.user; //查看mysql库中user表的user、password、host三个字段 +------+-------------------------------------------+-----------------+ | user | password | host | +------+-------------------------------------------+-----------------+ | root | *23AE809DDACAF96A | localhost | | root | | ula.example.com | | root | | 127.0.0.1 | | root | | ::1 | | | | localhost | | | | ula.example.com | +------+-------------------------------------------+--------------------+ MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost"; //更新密码 MariaDB [(none)]> exit Bye

将配置文件中跳过权限表的选项删除或注释

#vim /etc/my.cnf
[mysqld] #skip-grant-table datadir=/var/lib/mysql

重启服务

# systemctl restart mariadb.service

  

 

三、基本SQL语句

分类:

  DML Data Manipulation Language 数据库操纵语言
    INSERT 插入数据 insert
    DELETE 删除数据 delete
    UPDATE 更新数据 update

  DDL Data Definition Language 数据库定义语言
    数据库、表、索引、存储过程、函数
    CREATE 创建 create
    DROP 删除drop
    ALTER 修改 alter

  DCL Data Control Language 数据库控制语言
    例:控制用户的访问权限
    GRANT 授权 grant
    REVOKE 撤销 revoke

  DQL Data Query Language 数据库查询语言
    SELECT 查询 select

基本的sql语句:

  SQL语句中的大小写问题:
    1)关键字、函数名、列名和索引名不区分大小写
    2)数据库的名字、表名、别名区分大小写的(因为linux是区分大小写的)

库的操作

#查看所有库
show databases;

#创建库
create database 库名;

#创建库并指定字符集
create database 库名 DEFAULT CHARACTER SET utf8;

#库的字符集
alter database databasename DEFAULT CHARACTER SET utf8;

#查看库的属性      
show create database 库名;

#切换库
use apple;

#删除库
drop database apple;

#查看现在使用的库
select database();

表的操作

#创建表
create table t1(id int,name char(10));

#查看表的结构
desc t1;

#查看当前库中所以表
show tables;  

#查看表的属性
show create table t1\G;

#添加字段
alter table 表名 操作 字段名 数据类型 [约束];

#追加
alter table t1 add TEL int(11);

#在name字段后面插入sex字段
alter table t1 add sex char(10) after name;

#添加字段在第一列
alter table t1 add UID int(10) first;

#修改字段名及属性
alter table t1 change id ID int(5);

#仅修改字段属性
alter table t1 modify ID int(10);

#删除字段
alter table t1 drop UID;  

#修改表名
alter table t1 rename to t2;  

#删除表
drop table nametable;  

记录的操作

#添加记录
insert into t1 set id=2,name=‘jim‘;
insert into t1 (id,name) values(3,‘tom‘);

#添加多条记录
insert into t1 (id,name) values(8,‘harry‘),(9,‘kitty‘);
insert into t1 values (5,‘kiki‘),(6,‘jack‘),(7,‘banana‘);

#所有字段都要有数据
insert into t1 values (4,‘apple‘);

#更新记录
update t2 set age=18 where name is NULL;

#满足where后面的条件做什么事
update info_name set TEL="456789123" where NUM=2 ;

#多条件定位,&&=and 两个条件都满足
update info_name set SEX="m" where NUM=2 && AGE=18 ; 

#||=or  任意满足其一条件
update info_name set SEX="m" where NUM=3 || AGE=18;

#删除记录
delete from info_name where NAME=‘tom‘ and SEX=‘m‘;    
delete from info_name where SEX is null;

#清空表记录
delete from info_name;

  

四、函数

基本函数

#database()     查看当前所在的库
select database(); 

#user()     查看当前登陆的用户
select user();

聚合函数 

#sum()    求和函数
select sum(age) from t1;

#avg()    平均值函数
select avg(age) from t1;

#max()    最大值函数
select max(age) from t1;

#min()    最小值函数
select min(age) from t1;

#count()    统计sex字段每种有多少条记录
select sex,count(sex) from t1 group by sex;


#统计一下mysql成绩在80分以上的人数
select mysql,count(*) from score where mysql>80;

#统计表中有多少条非空的记录
select count(*) from pass;

时间函数

#查看当前时间
select curtime();

#查看当前日期
select curdate();

#查看系统时间
select now();
select sysdate();

其他函数

#concat()    连接函数
select concat(username,uid) from pass;
select concat(username,‘ ‘,uid) from pass;
select concat(username,‘:‘,uid) from pass;
select concat(username,‘:‘,uid) as ‘username-uid‘ from pass;

#lower()    转换成小写
update pass set username=‘ROOT‘ where username=‘root‘;
select lower(username) from pass;

#upper()    转换成大写
select upper(username) from pass;

#length()    求长度 
select username,length(username) from pass;

  

五、记录与表的复制

  要求:有两张表,但是字段数不同

准备表

MariaDB [test]> create table t1(id int primary key,name varchar(20));

MariaDB [test]> insert into t1 values (1,‘jim‘),(2,‘tom‘),(1000,‘jack‘);

记录的复制

#复制全部记录
MariaDB [test]> insert into user1(id,name) select * from user;

#复制部分记录
insert into user2(id,name) select * from user where id<1000;

复制表

复制部分表(不可以复制主键、外键和索引)

MariaDB [test]> create table user3 select * from user;

完全复制表(可以复制表的结构)

MariaDB [test]> create table user4 select name from user;

只复制表的结构

  方法一:不复制主键、外键、索引

MariaDB [test]> create table user5 select * from user where 1<0;

  方法二:完全复制

MariaDB [test]> create table user6 like user;
MariaDB [test]> select * from user6;

  

六、数据导入和导出

导入数据

  语法:load data infile ‘文件名‘ into table 表名;分割符为空格后者制表符

load data infile "/opt/test.txt" into table test;

  注意:1)文件不要放在/tmp和/root目录下,MySQL读取不到。

     2)mysql用户对导入的文件只要需要读的权限

     3)文件用引号引起来

  语法:load data infile ‘文件名‘ into table 表名 fields terminated by ‘分隔符‘;任何分隔符

load data infile ‘/opt/pass.txt‘ into table pass fields terminated by ‘:‘;

导出数据

select *from passwd into outfile ‘/test/pass‘ fields terminated by ‘:‘;

  注意:1)导出前文件名一定不存在。

     2)mysql用户对目录要有读写权限

     3)导出文件默认以|t为字段分隔符,\n为行分隔符

 

七、用户权限管理

查看用户

MariaDB [(none)]> select user,host,password from mysql.user;

删除用户

  语法:drop mysql.user 用户名@‘主机‘;

MariaDB [(none)]> drop user [email protected]‘ula.example.com‘;
MariaDB [(none)]> delete from mysql.user where user!=‘root‘;  

 创建用户

  创建无限制无密码无ip限制用户

MariaDB [(none)]> create user ‘sonfer‘;

  创建本地用户并设置密码

create user [email protected] identified by ‘sonfer123‘;

  创建远程登陆的用户

    语法:create user 用户名@‘ip‘ identified by ‘sonfer123‘;

create user [email protected]‘192.168.1.71‘ identified by ‘sonfer123‘;

  注意:允许所有IP登陆不是‘%‘,应该写‘%.%.%.%‘,可能是MariaDB的一个BUG。

设置密码

使用mysqladmin命令

[[email protected] mysql]# mysqladmin -u root -p123 password ‘456‘

使用set password命令

MariaDB [(none)]> set password for ‘root‘@‘localhost‘=password(‘123‘);

更新表记录

MariaDB [(none)]> update mysql.user set password=password(‘2‘) where user=‘root‘ and host=‘localhost‘;
MariaDB [(none)]> flush privileges;

客户端登陆服务器

  语法:mysql -u用户名 -p密码 -h服务器IP

mysql -usonfer-h 192.168.1.1 -psonfer123

  

权限

  • 全局层级

    全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。

  • 数据库层级

    数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。

  • 表层级

    表权限适用于一个给定的表中的所有列。这些权限存储在mysql.tables_priv表中。

  • 列层级

    列权限适用于一个给定的表中的单一列。这些权限存储在mysql.colummns_priv表中。

授权

  语法:grant 权限 on 库名.表名 to 用户名@‘主机名‘ identified by ‘密码‘;   (修改密码,可创建用户)

  权限列表   

    1. alter
    2. create
    3. delete
    4. drop
    5. index
    6. insert
    7. select
    8. update
    9. file                    读或写服务器上的文件
    10. all                  所有权限
    11. show databases

授予全部权限

MariaDB [(none)]> grant all on *.* to [email protected] identified by ‘test‘;
MariaDB [(none)]> flush privileges;  //刷新权限

授予部分权限

MariaDB [(none)]> grant select,insert,update on test.* to [email protected]‘192.168.1.%‘ identified by ‘123‘;

查看当前用户权限

MariaDB [(none)]> show grants;

查看其他用户权限

MariaDB [(none)]> show grants for sonfer;

 

授权经验原则(权限控制主要出于安全考虑,因此需要遵循一个几个经验原则

  1. 只授予能满足需要的最小权限,防止用户干坏事。比如说用户只是需要查询,那就只给select权限就可以了。不要给用户赋予update,insert或者delete。
  2. 创建用户的时候限制用户的登陆主机
  3. 初始化数据库的时候删除没有密码的用户。
  4. 为每个用户设置满足密码复杂度的密码。
  5. 定期清理不需要的用户。

回收权限

  语法:revoke 权限 on 库名.表名 from 用户@‘主机‘;

MariaDB [(none)]> revoke all on *.*  from  [email protected]‘%‘;      //回收全部权限
MariaDB [(none)]> revoke insert on *.*  from  [email protected]‘%‘;   //回收部分权限

  

八、备份

备份的分类

 类型

   根据服务是否在线继续分为热备份、温备份和冷备份
     热备份:读写均不受影响
     温备份:仅可以执行读操作
     冷备份:也称为离线备份,读写操作均终止。

   根据备份时是否之间复制数据文件分为物理备份和逻辑备份
     物理备份:直接复制数据文件,速度快。
     逻辑备份:通常是将数据导出至文本文件中。速度慢、丢失浮点精度;方便使用文本根据直接进行处理、可移植能力强。

   根据备份数据内容分为完全备份、增量备份和差异备份
     完全备份:备份全部数据。
     增量备份:仅备份上次完全备份或增量备份以后变化的数据。
     差异备份:仅备份上次完全备份以来变化的数据

     备份时间的选择:数据库访问量较小的时候做备份

 


使用mysqldump备份

备份单个数据库

  语法:mysqldump -u root -p2 库名 > /tmp/name.sql

[[email protected] mysql]# mysqldump -u root -p2 data1 > /tmp/data1.sql

备份单个表
  语法:# mysqldump -u root -p2 库名 表名 > /tmp/name.sql

备份多个表
  语法:mysqldump -u root -p2 库名 表名 表名 > /tmp/name.sql

多库备份 -B,--databases
  语法:mysqldump -u root -p2 -B 库名 库名 > /tmp/name.sql

全库备份 -A, --all-databases
  语法:mysqldump -u root -p2 -A > /tmp/name.sql

 

恢复

单库恢复

MariaDB [(none)]> drop database data1;   //删库
MariaDB [(none)]> create database data1; //再建库

#第一种恢复方式:
[[email protected] mysql]# mysql -u root -p2 data1 < /tmp/data1.sql 

#第二种恢复方式:
[[email protected] mysql]# mysql -u root -p2
MariaDB [(none)]> use school
MariaDB [school]> source /tmp/data1.sql

表恢复

[[email protected] mysql]# mysql -u root -p2 school < /tmp/table.sql

多库恢复(恢复之前是不需要手动创建数据库的)

[[email protected] mysql]# mysql -u root -p2 < /tmp/ddata.sql

全库恢复

[[email protected] mysql]# mysql -u root -p2 < /tmp/all.sql

 

九、日志管理

四种日志

日志存放的位置:数据目录下
/var/lib/mysql/ rpm

  错误日志:记录mysql服务器的启动、运行和关闭过程。

/var/log/mariadb/mariadb.log

MariaDB [(none)]> show variables like ‘log_error‘;
+---------------+------------------------------+
| Variable_name | Value | 
+---------------+------------------------------+
| log_error | /var/log/mariadb/mariadb.log |
+---------------+------------------------------+
1 row in set (0.03 sec)

  二进制日志

    记录用户对数据库所做的所有的ddl和dml操作,不会记录查询语句,对数据的灾难恢复有至关重要的作用。
    ddl:create、drop、alter
    dml:insert、update、delete
    二进制日志作用:做AB复制、恢复

  通用查询日志:general_log

    记录所有对数据库的请求信息(包括登陆、查询),默认不开启
    日志量较大、占用磁盘空间,一般不开启

  慢查询日志:

    记录的是查询时间超过指定时间的查询语句,一般用于优化查询,默认不开启

 

开启各种日志,修改配置文件

开启通用查询日志

临时开启,重启服务失效

MariaDB [(none)]> show variables like ‘general_log‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+S
1 row in set (0.00 sec)

MariaDB [(none)]> set global general_log=on;

MariaDB [(none)]> show variables like ‘general_log‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
1 row in set (0.00 sec)

通用查询日志/var/lib/mysql/短主机名.log

[[email protected] mysql]# cat /var/lib/mysql/name.log 

永久设置

[[email protected] mysql]# vim /etc/my.cnf
log=general_select_log //=号右边的日志文件名可自定义

[[email protected] mysql]# systemctl restart mariadb

[[email protected] mysql]# cat /var/lib/mysql/general_select_log 

开启慢查询日志

[[email protected] mysql]# vim /etc/my.cnf
log-slow-queries=slow-log //=号右边的日志文件名可自定义
long_query_time=5 //设置慢查询超时时间 单位是:秒

[[email protected] mysql]# systemctl restart mariadb

[[email protected] mysql]# mysql -u root -p2
MariaDB [(none)]> select sleep(6); //执行一个超过5秒的查询操作

[[email protected] mysql]# cat /var/lib/mysql/slow-log 

开启二进制日志

[[email protected] mysql]# vim /etc/my.cnf
log-bin=log_bin.log //=号右边的日志文件名可自定义
log-bin-index=log_bin.index

[[email protected] mysql]# systemctl restart mariadb

二进制日志的查看 mysqlbinlog

[[email protected] mysql]# mysqlbinlog log_bin.000001 
# at 4 //事件发生的位置信息
#170606 14:51:00 //事件发生的时间信息

使用二进制日志进行数据恢复

使用位置点进行恢复

[[email protected] mysql]# mysqlbinlog --start-position=245 --stop-position=534 log_bin.000001 |mysql -u root -p2
--start-position 起始位置点
--stop-position 结束位置点

使用事件发生的时间

# mysqlbinlog --start-datetime=‘17-06-06 15:25:04‘ --stop-datetime=‘17-06-06 15:26:15‘ log_bin.000002 | mysql -u root -p2
--start-datetime 起始时间
--stop-datetime 结束时间

查看日志信息

MariaDB [(none)]> show master logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| log_bin.000001 | 1079 |
| log_bin.000002 | 1523 |
+----------------+-----------+
2 rows in set (0.00 sec)

查看二进制日志里的操作记录

MariaDB [(none)]> show binlog events;

查看当前使用的二进制日志文件及所处的位置

MariaDB [(none)]> show master status\G;

  

对日志的管理

删除日志(不要轻易删除)

删除某个日志文件之前的所有日志

MariaDB [(none)]> purge master logs to ‘log_bin.000002‘;
Query OK, 0 rows affected (0.05 sec)

删除多少天以前的日志文件

MariaDB [(none)]> purge master logs before date_sub(current_date,interval 1 day);

重置二进制日志

MariaDB [(none)]> reset master;

手动生成新的二进制日志文件

MariaDB [(none)]> flush logs;

  





























































以上是关于MySQL数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中填充列表视图?

MySQL触发器

MySql触发器使用

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程