
create database if not exists bilibili; #创建数据库bilibili
use bilibili; #选择bilibili数据库，即可进行下面的代码演示
drop database if exists bilibili; #代码演示结束后删除bilibili数据库。这个小文件全部代码演示完再删
show databases;  #查看是否删除完成

-- 准备数据
create table stu(
    id int primary key comment '主键ID',
    name varchar(10) comment '姓名',
    age int comment '年龄'
) comment '简单学生表';
insert into stu values (1,'tom',1),(3,'cat',3),(8,'rose',8),(11,'jetty',11),(19,'lily',19),(25,'luci',25);

-- ----------------------------------------------MySQL管理 系统数据库介绍---------------------------------------------

/*系统数据库

MySQL数据库安装完成之后，自带了四个数据库分别为information_schema、mysql、performance_schema、sys。下面那行就可查询到
show databases;

这四个系统数据库的具体作用如下:

数据库                              含义
mysql                               存储MySQL服务器正常运行所需要的各种信息(例如时区、主从、用户、权限)
information_schema         提供了访问数据库元数据的各种表和视图，包含数据库、表、字段类型以及访问权限
performance_schema        为MySQL服务器运行时状态提供了一个底层监控功能，主要用于收集数据库服务器性能参数
sys                                    包含了一系列方便DBA和开发人员利用performance_schema性能数据库进行性能调优和诊断的视图


上面的四个系统数据库的其中一部分表及其作用
一、mysq
1. db表: 性能指标的系统库
2. slave_xxxx_xxxx表: 主从复制的相关记录，后面学主从复制时会讲
3. slow_log表: 慢日志
4. time_xxxx_xxxx表: 时区操作的相关信息
5. user: 用户表，存储的是当前数据库服务器可以被哪些用户访问，以及这些用户的权限

二、information_schema
1. engines表: 当前数据库支持的存储引擎，以及各个存储引擎的特点
2. innodb_xxxx_xxxx表: 当前数据库InnoDB引擎的各项指标
3. innodb_tables表: InnoDB引擎对应的表结构，即有什么表是InnoDB引擎的
4. innodb_tablespace表: InnoDB引擎对应的表空间
5. tablespace表: 表空间
6. schema_privileges表: 数据库的权限
7. routines视图: 当前数据库服务器有的存储过程、存储函数
8. schemata视图: 数据库的说明，数据库的字符集
9. tables视图: 当前数据库服务器有哪些表，以及表是在哪个数据库里面、表的引擎
10. triggers视图: 触发器
11. views视图: 视图

三、performance_schema
1. data_locks表: 当我们在查看意向锁和行级锁的时候，就会从data_locks表查看加锁情况
2. metadata_locks表: 当我们在进行元数据锁查看的时候，就会使用metadata_locks表
3. error_log表: 错误日志
4. events_xxxx_xxxx表: 事件信息

四、sys
包含一张表和性能相关的视图*/

show databases;

#【下面所有的内容需要在xshell终端执行，远程的是linux系统】
-- ------------------------------------------------MySQL管理 常用工具1----------------------------------------------

/*常用工具

一、mysql
该mysql不是指mysql服务，而是指mysql的客户端工具

语法
mysql [options] [database]

选项
-u, --user=name               #指定用户名
-p, --password[=name]     #指定密码
-h, --host=name               #指定服务器ip或域名
-P, --port=port                 #指定连接端口，注意这个P是大写的
-e, --execute=name          #执行SQL语句并退出

注意
-e选项可以在MySQL客户端执行SQL语句，而不用连接到MySQL数据库再执行，对于一些批处理脚本，这种方式尤其方便

示例
mysql -uroot -p123456 db01 -e "select * from stu"; #作用是在不登录MySQL的情况下，执行查询语句
# 打开linux终端，执行如下
# mysql -h192.168.127.138 -P3306 -u root -p228675 bilibili -e "select * from stu";
# 上面那行的优点: 在不登录MySQL的情况下，执行查询语句，注意需要指定远程ip、端口、用户、密码、某个数据库、语句

###############################################################################################

二、mysqladmin
mysqladmin是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态、创建并删除数据库等

通过帮助文档查看选项: mysqladmin --help

示例
mysqladmin -uroot -p123456 drop 'test01';
mysqladmin -uroot -p123456 version;
# 打开linux终端，执行如下
# mysqladmin --help
# mysqladmin -h192.168.127.138 -P3306 -u root -p228675 version;#查看当前数据库版本
# mysqladmin -h192.168.127.138 -P3306 -u root -p228675 variables;#查看当前数据库的系统变量信息
# mysqladmin -h192.168.127.138 -P3306 -u root -p228675 create db02;#创建db02数据库
# mysql -h192.168.127.138 -P3306 -u root -p228675 -e 'show databases';#查看当前数据库服务器中有哪些数据库
# mysqladmin -h192.168.127.138 -P3306 -u root -p228675 drop db02;#删除db02数据库

###############################################################################################

三、mysqlbinlog
由于服务器生成的二进制日志文件以二进制格式保存，所以如果想要检查这些文本的文本格式，就会使用到mysqlbinlog日志管理工具
在MySQL数据库服务器有一份二进制日志binlog，会在后续有讲

语法
mysqlbinlog [options] log-files1 log-files2 ...

选项
-d, --database=name        #指定数据库名称，只列出指定的数据库相关操作
-o, --offset=#                    #忽略掉日志文件中的前n行命令
-r, --result-file=name        #将输出的文本格式日志输出到指定文件
-s, --short-form                 #显示简单格式，省略掉一些信息
--start-datatime=date1 --stop-datetime=data2         #指定日期间隔内的所有日志
--start position=pos1 --stop-position=pos2               #指定位置间隔内的所有日志

# 打开linux终端，执行如下
cd /var/lib/mysql && ll; #里面的binlog开头的文件就是二进制文件
cat binlog.000010; #发现都是乱码，原因是cat指令不能查看二进制文件里面的内容
#执行了上面那行的命令之后，linux的终端会全部乱码，只需要退出，然后重新登录进mysql即可解决
cd /var/lib/mysql && ll;
mysqlbinlog binlog.000010;#使用看到mysqlbinlog就能查看二进制文件
mysqlbinlog -s binlog.000010;#查看的内容会比较紧凑，省略掉一些不必要的信息

###############################################################################################

四、mysqlshow
mysqlshow客户端对象查找工具，用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引

语法
mysqlshow [options] [db_name [table_name [col_name]]]

选项
--count    #显示数据库及表的统计信息(数据库、表均可以不指定)
-i         #显示指定数据库或者指定表的状态信息

示例
# 打开linux终端，执行如下
#查询每个数据库的表的数量及表中记录的数量
mysqlshow -h192.168.127.138 -P3306 -u root -p228675 --count;
#查询bilibili库中每个表中的字段数、行数
mysqlshow -h192.168.127.138 -P3306 -u root -p228675 bilibili --count;
#查询bilibili库中stu表的详细情况
mysqlshow -h192.168.127.138 -P3306 -u root -p228675 bilibili stu --count;
#查询bilibili库中stu表的id字段的详细情况
mysqlshow -h192.168.127.138 -P3306 -u root -p228675 bilibili stu id --count;

#把上面的 --count换成-i，表示展示的是状态信息。如果显示的状态信息太多，也就是一行太长了，可以把结果
#复制到Notepad++软件里面，就显得美观啦

上面的详细情况包括type类型、collation字符集、null是否可为空、key是什么键、privileges权限、comment注释、...*/

-- ------------------------------------------------MySQL管理 常用工具2----------------------------------------------


/*五、mysqldum
mysqldump客户端工具是用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表，以及插入表的SQL语句
简单说这个mysqldum工具只负责导出，是用来数据备份的，其中-T参数的用法一定要掌握，因为跟下一个要学习的工具有关

语法
mysqldump [options] db_name [tables]
mysqldump [options] --database/-B db1 [db2 db3 ...]
mysqldump [options] --all-databases/-A

连接选项
-u, --user=name                 #指定用户名
-p, --password[=name]       #指定密码
-h, --host=name                 #指定服务器ip或域名
-P, --port=#                        #指定连接端口，注意是大写的P

输出选项
--add-drop-database            #在每个数据库创建语句前加上drop database语句
--add-drop-table                  #在每个表创建语句前加上drop table语句，默认开启; 不开启(--skip-add-drop-table)
-n, --no-create-db                #不包含数据库的创建语句
-t, --no-create-info               #不包含数据表的创建语句
-d, --no-data                        #不包含表数据
-T,--tab=name                      #自动生成两个文件:一个.sql文件(创建表结构的语句)，另一个.txt文件(数据文件)

【在文件备份时，要么备份到当前目录，要么备份到指定路径(当带参数的时候才能，不带参数的话是不可以指定路径的)，这里来讲一下如何才能备份到指定路径】
进行文件备份时，如何指定MySQL认为安全的目录路径，即我们指定路径的时候如何指定才不会报错
mysql -h192.168.127.138 -P3306 -u root -p228675;
show variables like '%secure_file_priv%'; #输出/var/lib/mysql-files/，也就是我们只能指定输出的备份文件为这个路径，否则就会报错
exit; #退出，因为这节课不需要登录进MySQL，这里讲，所以就临时登录一下

###################################################################################################################

# 打开linux终端，执行如下

# mysqldump -h192.168.127.138 -P3306 -u root -p228675 bilibili > dumpbeifen.sql; #把bilibili数据库备份到当前目录
# cat dumpbeifen.sql; #查看文件数据
# mysqldump -h192.168.127.138 -P3306 -u root -p228675 bilibili stu > dumpstu.sql; #把bilibili数据库的stu表备份到当前目录
# cat dumpstu.sql; #查看文件数据
# 【上面生成的dumpbeifen.sql和dumpstu.sql文件是在没有参数的情况下备份生成的，里面的数据有注释信息、建表语句、删表语句、插入语句】

# 下面演示一下输出参数，看生成的备份文件的数据会有什么变化
# mysqldump -h192.168.127.138 -P3306 -u root -p228675 -t bilibili > dumpbeifen_t.sql; #把bilibili数据库备份到当前目录，-t参数:备份文件不含建表语句
# cat dumpbeifen_t.sql; #查看文件数据(里面就少了建表删表语句，也就是没有对表结构备份。只备份了表里面的数据)
# mysqldump -h192.168.127.138 -P3306 -u root -p228675 -d bilibili > dumpbeifen_d.sql; #把bilibili数据库备份到当前目录，-d参数:备份文件不含表数据
# cat dumpbeifen_d.sql; #查看文件数据(里面只有建表删表语句，也就是只备份了表结构，没有备份表里面的数据)

# mysqldump -h192.168.127.138 -P3306 -u root -p228675 -T /root bilibili stu; #把bilibili数据库的stu表备份到/root目录，-T参数:自动备份成两个文件
# 上面那个在/root目录只出现stu.sql文件，没有stu.txt文件。原因是'当前目录'不安全，txt文件只能指定一个安全的路径才能让你备份。如下
# mysqldump -h192.168.127.138 -P3306 -u root -p228675 -T /var/lib/mysql-files/ bilibili stu;
# cd /var/lib/mysql-files/ && ll; #即可查到/var/lib/mysql-files/路径下的stu表对应的stu.sql和stu.txt文件
# cat stu.txt;#查看表数据，这个文件是纯数据，没有任何字段信息，而且信息的格式非常整齐


六、mysqlimport/source
mysqlimport是客户端数据导入工具，用来导入'mysqldump加-T参数后导出的文本文件',
(1)简单说这个mysqldum工具只负责导入，并且只能导入特定的txt文件
(2)简单说这个source工具只负责导入，并且只能导入特定的sql文件
上一个mysqldump工具使用T参数之后生成的文本文件(自动备份成.sql和.txt文件，对于这两种文件，我们这节课会有mysqldum工具和source工具来导入)

语法
mysqlimport [options] db_name textfile1 [textfile2 ...]

如果需要导入sql文件，可以使用source工具，语法如下
source /root/xxxx.sql;

示例如下

【mysqlimport工具-导入txt文件-表数据】
mysql -h192.168.127.138 -P3306 -u root -p228675 -e "create database if not exists test";#创建test数据库，我们等下会把数据导入进test数据库
mysql -h192.168.127.138 -P3306 -u root -p228675 test -e "create table stu(
    id int primary key comment '主键ID',
    name varchar(10) comment '姓名',
    age int comment '年龄'
) comment '简单学生表';";
mysql -h192.168.127.138 -P3306 -u root -p228675 test -e "select * from stu;";#查看stu表有没有数据，目前没有数据只有表结构(字段)，查不出来任何
#上面那些的目的是创建新数据库test，并在test数据库里面创建只有表结构的stu表，stu表的具体数据需要下面来导入
mysqlimport -h192.168.127.138 -P3306 -u root -p228675 test /var/lib/mysql-files/stu.txt;#导入数据
mysql -h192.168.127.138 -P3306 -u root -p228675 test -e "select * from stu;";#查看stu表有没有数据，有就说明导入数据成功了

【source工具-导入sql文件-表结构+表数据】
rm -rf dumpbeifen.sql;
mysqldump -h192.168.127.138 -P3306 -u root -p228675 bilibili > dumpbeifen.sql; #把bilibili数据库备份到当前目录，会生成dumpbeifen.sql备份文件
mysql -h192.168.127.138 -P3306 -u root -p228675 -e "drop database if exists bilibili;";#删除bilibili数据库里面的数据，等下我们使用备份恢复表结构+表数据
mysql -h192.168.127.138 -P3306 -u root -p228675 -e "create database if not exists bilibili;";#创建bilibili数据库，只有库，里面没有任何表和数据
#注意source工具需要登录进mysql里面使用，如下
mysql -h192.168.127.138 -P3306 -u root -p228675;#登录
use bilibili;
source /root/dumpbeifen.sql;#即可使用备份文件，恢复bilibili数据库里面的所以表，以及表数据
show tables;#验证

#####################################################################################################################

tip: 不要慌，那些命令都是我试过一次的，没有问题。a_113_0和a_114_0在没有说明需要登录进mysql的情况下，都是直接在xshell终端(远程的是linux系统)进行的。
需要登录进mysql的话，我都有把命令写出来的，只需要换成你的ip和密码即可。介绍的数据库管理工具主要就六种，这节课的两种是数据的导出备份+导入恢复，是
一起的，所以这两种放在同一课，也就是同一个a_114_0文件。首先恭喜学到这里的你，以及苦逼写笔记的我，因为目前已经学了mysql的半壁江山啦，后续的知识
将是运维篇的，会更难哦，如果你只是学脚本或者前端，那么就可以退了，目的是把接下来的时间去学你想学的其他东西，但是，如果你是全栈，那么请跟我继续
MySQL运维篇的学习，时间宝贵，下节课的运维篇见*/

