精华内容
下载资源
问答
  • 最近进行项目开发,发现存在数据库内的数据和系统查询到的数据相差8小时发现有2种比较合适的方法(一)修改mysql服务的区时centos进入mysql查看/修改时区1.输入以下命令进入mysqlmysql -uroot -p然后输入 password2....

    最近进行项目开发,发现存在数据库内的数据和系统查询到的数据相差8小时

    发现有2种比较合适的方法

    (一)修改mysql服务的区时

    centos进入mysql查看/修改时区

    1.输入以下命令进入mysql

    mysql -uroot -p

    然后输入 password

    2.查看mysql上的当前时间

    select curtime();

    3.查看时区

    show variables like "%time_zone%";

    8a3093b480215eb28d11e64dad824bdf.png

    #time_zone如果是system说明mysql使用system的时区(东八区获取到的时间会实际时间少4小时,需要在程序application.yml),system_time_zone说明system使用CST时区

    4.设置区时(time_zone)为东八区

    set time_zone='+8:00';

    上图我的时间是已经执行设置好后的显示

    (二)在程序中设置mysql的区时

    --针对application 可以设置:

    serverTimezone=Asia/Shanghai

    d718d274557659850e9bc459c21125ee.png

    与修改服务器上mysql区时效果一致

    注:

    生产服务器尽量不要改动,建议大家在程序中进行区时设置。

    展开全文
  • mysql之从入门到删跑路

    万次阅读 多人点赞 2019-10-27 13:53:41
    sudo /usr/local/mysql/support-files/mysql.server start 停止mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启mysql服务 sudo /usr/local/mysql/support-files/mysql.server resta...
    启动与停止
    • 启动mysql服务
      sudo /usr/local/mysql/support-files/mysql.server start
    • 停止mysql服务
      sudo /usr/local/mysql/support-files/mysql.server stop
    • 重启mysql服务
      sudo /usr/local/mysql/support-files/mysql.server restart
    • 进入mysql目录文件
      cd /usr/local/mysql/support-files
    • 进入mysql命令行
      /usr/local/MySQL/bin/mysql -uroot -p12345678
    • 退出数据库
      exit;
    数据库相关操作
    • 查询所有数据库
      show databases;
    • 选择(使用)数据库
      use mybatis;
    • 查询当前正在使用的数据库名称
      select database();
    • 创建数据库
      create database 数据库名称;
      创建数据库,判断不存在,再创建: create database if not exists 数据库名;
    • 删除数据库
      drop database 数据库名称;
      判断数据库存在,存在再删除:drop database if exists 数据库名称;
    数据库表相关操作
    • 创建数据库表
    create table 表名(
    	列名1 数据类型1,
    	列名2 数据类型2,
    	....
    	列名n 数据类型n
    	);
    
    • 复制表
      create table 表名 like 被复制的表名;
    • 查看某个数据库中的所有的数据表
      show tables;
    • 查看数据表的结构
      desc pet;describe pet;
    • 修改表名
      alter table 表名 rename to 新的表名;
    • 修改表的字符集
      alter table 表名 character set 字符集名称;
    • 添加一列
      alter table 表名 add 列名 数据类型;
    • 删除列
      alter table 表名 drop 列名;
    • 删除表
      drop table 表名;drop table if exists 表名 ;

    • 添加数据
      insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
      其中列名和值要一一对应。如果表名后,不定义列名,则默认给所有列添加值,如:insert into 表名 values(值1,值2,...值n);除了数字类型,其他类型需要使用引号(单双都可以)引起来.
    • 删除数据
      delete from 表名 where 条件
      其中:如果不加条件,则删除表中所有记录。如果要删除所有记录, 使用delete from 表名;一般不推荐使用。这种操作有多少条记录就会执行多少次删除操作.
      TRUNCATE TABLE 表名;推荐使用,效率更高 先删除表,然后再创建一张一样的表.
    • 修改数据
      update 表名 set 列名1 = 值1, 列名2 = 值2,... where 条件;如果不加任何条件,则会将表中所有记录全部修改.
    insert into user2 values (1,'李四','123'); // 增
    delete from pet where ower = 'disn'; //删
    update pet set name = '后裔' where ower = 'dfn'; //改
    
    
    • 查询数据
    ><<=>==<>BETWEEN...ANDIN( 集合)LIKE 模糊查询	
    ⑤_单个任意字符
    ⑥%多个任意字符
    ⑦IS NULLand&&or||not!
    查询条件应用举例:
    SELECT * FROM user WHERE age >= 18;
    SELECT * FROM user WHERE age >= 18 AND  age <=36;
    SELECT * FROM user WHERE age BETWEEN 40 AND 70;
    SELECT * FROM user WHERE age IN (6,18,37);
    // 关于NULL
    SELECT * FROM user WHERE height = NULL; 错误,因为null值不能使用=或(!=) 判断
    SELECT * FROM user WHERE height IS NULL;(正确)
    SELECT * FROM user WHERE height  IS NOT NULL;(正确)
    // 查询姓陈的有哪些?< like>
    SELECT * FROM user WHERE NAME LIKE '陈%';
    // 查询姓名第二个字是新的人
    SELECT * FROM user WHERE NAME LIKE "_新%";
    // 查询姓名是三个字的人
    SELECT * FROM user WHERE NAME LIKE '___';
    // 查询姓名中包含狗的人
    SELECT * FROM user WHERE NAME LIKE '%狗%';
    
    约束相关
    • 主键约束 (primary key)
      能够唯一确定一张表中的的一条记录,我们通过给某个字段添加约束, 可以使得这个字段不重复且不为空.
     create table user (
    	id int primary key auto_increment, // 在创建表时,添加主键约束,并且完成主键自增	
    	name varchar(20)
     );
    -- 联合主键: 由多个字段联合组成的主键, 只要联合的主键加起来不重复就可以.联合主键中的任何一个字段都不能为空.
    create table user2 (
     	id int,
     	name varchar(20),
     	password varchar(20),
     	primary key(id, name)
    );
    
    

    表创建完成后:
    添加主键.如:
    alter table user add primary key(id);alter table user modify id int primary key;
    删除主键:alter table user drop primary key;

    • 唯一约束:unique 约束修饰的字段的值不可以重复.
     create table user1 (
     	id int primary key auto_increment,
      	phone_num varchar(20) unique
      	 );
     create table user2 (
     	id int primary key auto_increment,
      	name varchar(20),
      	unique(id, name) // 表示两个字段在一起不重复就可以
      	 );
      	 
    

    也可以在表创建完成后, 通过alter table user3 add unique(phone_num);alter table user3 modify phone_num varchar(20) unique;来添加unique约束.
    删除unique约束:alter table user3 drop index phone_num;

    • 非空约束:not null 修饰的字段不能为空NULL
    create table user3 (
    	id int primary key auto_increment,
    	name varchar(20) not null
    	);
    

    删除非空约束:alter table user3 modify name varchar(20);

    • 默认约束
      当我们插入字段值时候,如果对应的字段没有插入值,则会使用默认值.如果传入了值,则不会使用默认值.
    create table user4(
    	id int primary key auto_increment,
    	age int default 18,
    	name varchar(20) not null
    	);
    
    • 外键约束:foreign key
    create table 表名(
    ....
    外键列
    constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
    );
    // 班级
    create table classes(
    	id int primary key,
    	name varchar(20)
    	);	
    // 学生表
    create table student (
    		id	int primary key,
    		name varchar(20),
    		class_id int,
    		foreign key(class_id) references classes(id)
    		);
    		
    
    数据库查询进阶
    • 查询所有记录
      例如:查询student表中的所有记录.
      select * from student;
    • 查询指定字段
      例如:查询student中的sname,ssex,class.
      select sname,ssex,class from student;
    • 查询教师表中所有的单位即不重复的depart列. <排除重复distinct>
      select distinct depart from teacher;
    • 查询score表中成绩在60到80之间的所有记录 <查询区间 between…and…>
      select * from score where degree between 60 and 80;
      select * from score where degree > 60 and degree < 80;
    • 查询score表中成绩为85,86或88的记录
      select * from score where degree in(85, 86, 88);
    • 查询student表中’95031’班或性别为’女’的同学记录. <or 表示或者>
      select *from student where class = '95031' or sex = '女';
    • 以class降序查询student表的所有记录 <降序:desc, 升序asc,默认升序(省略)>.
      select * from student order by class desc;
    • 以cno升序,degree降序查询score表的所有记录
      select * from score order by cno asc,degree desc;
    • 查询"95031’班的学生人数 <统计 count>
      select count(*) from student where class = '95031';
    • 查询score表中最高分的学生学号和课程号(子查询)
      select sno, cno from score where degree = (select max(degree) from score );其中:select max(degree) from score 先查出最高分.
      select sno,cno degree from score order by degree desc limit 0,1;其中:limit第一个数字表示从多少开始,第二个表示多少条.当有多个相同最高分时,容易出bug,不推荐使用这种方式查询.
    • 查询每门课的平均成绩
      select cno, avg(degree) from score group by cno;
    • 查询score表中至少有2名学生选修的并以3开头的课程的平均分数.
      select cno, avg(degree) from score group by cno having count(cno) >= 2 and cno like '3%';
    • 查询分数大于70, 小于90的sno列.
      select sno, degree from score where degree between 70 and 90;
    • 查询所有学生的sname, cno和degree列.
      select sname, cno, degree from student, score where student.sno = score.sno;
    • 查询所有学生的sno,cname和degree列
      select sno,cname,degree from course ,score where course.cno = score.cno;
    • 查询"95031"班学生每门课的平均分.
      select cno, avg(degree) from score where sno in (select sno from student where class = '95031') group by cno;
    • 查询选修"3-105"课程的成绩高于"109"号同学"3-105"成绩的所有同学的记录.
      select * from score where cno = '3-105' and degree > (select degree from score where sno = '109' and cno = '3-105');
    • 查询成绩高于学号为"109", 课程号为"3-105"的成绩的所有记录
      select * from score where degree > (select degree from score where sno = '109' and cno = '3-105');
    • 查询和学号为108,101的同学同年出生的所有的sno, sname, sbirthday
      select *from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108, 101));
    • 查询"张旭"教师任课的学生成绩
      select * from score where cno = ( select cno from course where tno = (select tno from teacher where tname = "张旭"));
    • 查询选修某课程的同学人数多于5人的教师姓名.
      select tname from teacher where tno = (select tno from course where cno = (select cno from score group by cno having count(*) > 5));
    • 查询存在有85分以上的成绩的课程的cno
      select cno, degree from score where degree > 85;
    • 查询出"计算机系"教师所教课程的成绩表
      select * from score where cno in (select cno from course where tno in (select tno from teacher where depart = "计算机系"));
    • 查询选修编号为"3-105"课程且成绩至少高于选休息编号为"3-245"的同学的cno,sno和degree,并按degree从高到低次序排序.
      any 至少一个.
    select * from score where cno = '3-105' and degree > any(select degree from score where cno = '3-245') order by degree desc;
    
    
    • 查询选修编号为"3-105"课程且成绩高于选休息编号为"3-245"的同学的cno,sno和degree,并按degree从高到低次序排序.
      all 表示所有
    select * from score where cno = '3-105' and degree > all(select degree from score where cno = '3-245') order by degree desc;
    
    
    • 查询所有教师和同学的name, sex和birthday
    select tname as name, tsex as sex, tbirthday as birthday from teacher union select sname, ssex, sbirthday from student;
    
    
    • 查询所有"女"教师和"女"同学的name,sex和birthday
    select tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女' union select sname, ssex, sbirthday from student where ssex = '女';
    
    
    
    • 查询成绩比该课程成绩低的同学的成绩表
      思路: 从a表查出对应的分数跟b表筛选出来的平均分作比较.
    select * from score a where degree < (select avg(degree) from score b where a.cno = b.cno);
    表a
    +-----+-------+--------+
    | sno | cno   | degree |
    +-----+-------+--------+
    | 101 | 3-105 |     91 |
    | 102 | 3-105 |     92 |
    | 103 | 3-105 |     92 |
    | 103 | 3-245 |     86 |
    | 103 | 6-166 |     85 |
    | 104 | 3-105 |     81 |
    | 105 | 3-105 |     88 |
    | 105 | 3-245 |     75 |
    | 105 | 6-166 |     79 |
    | 109 | 3-105 |     76 |
    | 109 | 3-245 |     68 |
    | 109 | 6-166 |     81 |
    +-----+-------+--------+
    12 rows in set (0.00 sec)   
    
    表b
    | sno | cno   | degree |
    +-----+-------+--------+
    | 101 | 3-105 |     91 |
    | 102 | 3-105 |     92 |
    | 103 | 3-105 |     92 |
    | 103 | 3-245 |     86 |
    | 103 | 6-166 |     85 |
    | 104 | 3-105 |     81 |
    | 105 | 3-105 |     88 |
    | 105 | 3-245 |     75 |
    | 105 | 6-166 |     79 |
    | 109 | 3-105 |     76 |
    | 109 | 3-245 |     68 |
    | 109 | 6-166 |     81 |
    +-----+-------+--------+
    12 rows in set (0.00 sec) 
    
    
    • 查询所有任课教师的tname和depart
      select tname, depart from teacher where tno in (select tno from course);
    • 查询至少有两名男生的班号
    select class from student where ssex= '男' group by class having count(*) > 1
    
    
    • 查询student表中不姓"王"的同学记录
    select * from student where sname not like '王%';
    
    • 查询student表中每个学生的姓名和年龄
    select sname, year(now()) - year(sbirthday)  as '年龄' from student;
    
    • 查询student表中最大和最小的sbirthday日期值
    select max(sbirthday) as '最大', min(sbirthday) as '最小' from student;
    
    • 以班号和年龄从大到小的顺序查询student表中的全部记录
    select * from student order by class desc, sbirthday;
    
    • 查询"男"教师及其所上的课程
    select * from course where tno in (select tno from teacher where tsex = '男');
    
    
    • 查询最高分同学的sno, cno和degree列
    select * from score where degree = (select max(degree) from score);
    
    • 查询和李军同性别的所有同学的sname
    select sname from student where ssex = (select ssex from student where sname = '李军');
    
    
    • 查询和李军同性别并同班 同学sname
    select sname from student where ssex = (select ssex from student where sname = "李军") and class = (select class from student where sname = '李军');
    
    
    • 查询所有选修"计算机导论"课程的"男"的成绩表
    select * from score where cno = (select cno from course where cname = '计算机导论') and sno in(select sno from student where ssex = '男');
    
    
    SQL的四种连接查询
    分析用例的数据准备:
    mysql> select * from person;
    +----+--------+--------+
    | id | name   | cardId |
    +----+--------+--------+
    |  1 | 张三   |      1 |
    |  2 | 李四   |      3 |
    |  3 | 王五   |      6 |
    +----+--------+--------+
    3 rows in set (0.00 sec)
    mysql> select * from card;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 饭卡      |
    |    2 | 建行卡    |
    |    3 | 农行卡    |
    |    4 | 工商卡    |
    |    5 | 邮政卡    |
    +------+-----------+
    5 rows in set (0.00 sec)
    
    • 内连接
      inner join 或者 join, 后面通常跟对一个on表示条件
      ---- 内联查询: 就是两张表中的数据, 通过某个字段相等,查询出相关记录数据.
      <当前表中的cardid与id相同.>
    select * from person inner join card on person.cardId = card.id;
    +----+--------+--------+------+-----------+
    | id | name   | cardId | id   | name      |
    +----+--------+--------+------+-----------+
    |  1 | 张三   |      1 |    1 | 饭卡      |
    |  2 | 李四   |      3 |    3 | 农行卡    |
    +----+--------+--------+------+-----------+
    2 rows in set (0.00 sec)
    
    
    • 外连接
      左外连接:左连接 left join 或者 left outer join
      ---- 左外连接, 会把左边表里面的所有数据取出来, 而右边表中的数据,如果有相等的,就显示出来, 如果没有, 则会补NULL.
    select * from person left join card on person.cardId = card.id;
    
    +----+--------+--------+------+-----------+
    | id | name   | cardId | id   | name      |
    +----+--------+--------+------+-----------+
    |  1 | 张三   |      1 |    1 | 饭卡      |
    |  2 | 李四   |      3 |    3 | 农行卡    |
    |  3 | 王五   |      6 | NULL | NULL      |
    +----+--------+--------+------+-----------+
    3 rows in set (0.00 sec)
    
    

    右外连接:右连接 right join 或者right outer join
    ----右外连接, 会把右边表里面的所有数据取出来, 而左边表中的数据,如果有相等的,就显示出来, 如果没有, 则会补NULL.

    select * from person right join card on person.cardId = card.id;
    
    +------+--------+--------+------+-----------+
    | id   | name   | cardId | id   | name      |
    +------+--------+--------+------+-----------+
    |    1 | 张三   |      1 |    1 | 饭卡      |
    |    2 | 李四   |      3 |    3 | 农行卡    |
    | NULL | NULL   |   NULL |    2 | 建行卡    |
    | NULL | NULL   |   NULL |    4 | 工商卡    |
    | NULL | NULL   |   NULL |    5 | 邮政卡    |
    +------+--------+--------+------+-----------+
    5 rows in set (0.01 sec)
    
    

    全外连接:完全外连接 full join 或者full outer join<mysql不支持full join>

    mysql> select * from person full join card on person.cardId= card.id;
    ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'
    **** 解决mysql不支持full join的方法****
     <左连接 + 右链接> , 即通过union来连接左右连接. <左连接 union 右链接>.
    eg:
    
    select * from person left join card on person.cardId = card.id union select * from person right join card on person.cardId = card.id;
    
    +------+--------+--------+------+-----------+
    | id   | name   | cardId | id   | name      |
    +------+--------+--------+------+-----------+
    |    1 | 张三   |      1 |    1 | 饭卡      |
    |    2 | 李四   |      3 |    3 | 农行卡    |
    |    3 | 王五   |      6 | NULL | NULL      |
    | NULL | NULL   |   NULL |    2 | 建行卡    |
    | NULL | NULL   |   NULL |    4 | 工商卡    |
    | NULL | NULL   |   NULL |    5 | 邮政卡    |
    +------+--------+--------+------+-----------+
    6 rows in set (0.01 sec)
    
    
    要点梳理
    • where 和 having 的区别?
      (1) having通常用在聚合函数前面,对聚合函数进行过滤,(MAX、MIN、COUNT、SUM).having通常和group by 一起连用,因为where不能加在group by的后面.
      (2) where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
    MYSQL执行语句顺序,严格遵循次顺序,不能改变
    select
    from
    where
    group by
    having
    order by
    
    mysql的事务
    • 关于事务
      mysql中, 事务其实是一个最小的不可分割的工作单元. 事务能够保证一个业务的完整性.
      分析:
    例如:
    a --> -100
    update user set money = money - 100 where name = 'a';
    b --> +100
    update user set money = money + 100 where name = 'b';
    -- 实际程序中, 如果只有一条sql语句执行成功了,而另外一条没有执行成功?则会出现前后数据不一致的情况.
    update user set money = money - 100 where name = 'a';
    update user set money = money + 100 where name = 'b';
    在多条sql语句,可能会有同时成功的要求,要么就同时失败.
    
    
    • 事务控制
      (1)事务主要包含自动提交@@autocommit=1;,手动提交commit;和事务回滚rollback;.
      (2) mysql默认是开启事务的(自动提交).
      ----当我们去执行一个sql语句的时候,效果会立即提现出来,且不能回滚.
      set autocommit = 0;设置mysql是否自动提交,<0为否, 1为是.>
      select @@autocommit;查看mysql的自动提交方式.
      commit; 手动提交.
      具体事务控制相关参照下面代码分析:
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    1 row in set (0.00 sec)
    // 建表
    create database bank;
    create table user (
    	id int primary key,
        name varchar(20),
        money int
        );
    // 首先在表中插入一条用户数据a.
    insert into user values (1,'a',1000);
    Query OK, 1 row affected (0.00 sec)
    // 进行回滚操作.
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    // 执行回滚后,查看数据表信息,发现即使调用了rollback,但插入的数据依然存在.说明当前不能回滚.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    +----+------+-------+
    1 row in set (0.00 sec)
    // 可以通过设置msql的回滚自动提交为false.
    set autocommit = 0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            0 |
    +--------------+
    1 row in set (0.00 sec)
    // 也就说, 通过上面的set autocommit = 0;操作关闭了mysql的自动提交(commit).
    *******再次插入数据:*******
    insert into user values (2,'b',1000);
    Query OK, 1 row affected (0.00 sec)
    // 插入数据后查看表,用户2数据添加成功.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    |  2 | b    |  1000 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    // 执行回滚操作.
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    // 回滚后再次查看表,发现刚才插入的数据已经被干掉了.
    mysql> select * from user;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    +----+------+-------+
    1 row in set (0.01 sec)
    **** 对于这种场景,如果想让用户b数据成功提交, 可以通过commit;命令执行手动提交操作.手动提交后,如果想再次通过rollback来撤销,则是不可以的.也就是说,事务一旦提交,执行的sql语句就不可以再撤销,也就是说事务一旦提交数据就会持久的产生效果.
    
    
    
    

    (3)手动开启事务
    beginstart transaction都可以手动开启一个事务. 也就是说,当我们当前的mysql如果默认的是自动提交模式,则执行rollback进行事务回滚则是无效的. 但是可以通过beginstart transaction手动开启事务.

    即:
      当前默认为自动提交模式,此时执行rollback无效.执行下面sql语句:
      start transaction;(或者begin;)
      update user set money = money - 100 where name = 'a';
      update user set money = money + 100 where name = 'b';
      执行完插入a,b用户数据后,再执行rollback,发现可以成功回滚事务.可以成功切换成手动开启事务的模式.若想使得插入的数据生效,也需要手动执行commit进行提交操作.
      事务开启之后,一旦commit提交,就不可以回滚,也就说,当前的这个事务在提交的时候就已经结束了.
      
    
    • 事务的四大特征
      A 原子性: 事务是最小的单元, 不可以在分割.
      C 一致性: 事务要求, 同一事务中的sql语句必须保证同时成功,同时失败.
      I 隔离性: 事务1 和事务2之间shi具有隔离性的.
      D 持久性: 事务一旦结束(commit,rollback),就不可以返回.
    • 事务的隔离性
      多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题.
      存在问题:
      (1) 脏读:一个事务,读取到另一个事务中没有提交的数据.
      (2)不可重复读(虚读):在同一个事务中,两次读取到的数据不一样.
      (3)幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改.
      read uncommitted; 读未提交的–>产生的问题:脏读、不可重复读、幻读.
      read committed; 读已经提交的–>产生的问题:不可重复读、幻读repeatable read; 可以重复读–>产生的问题:幻读
      serializable; 串行化<性能特差>
      通常是隔离级别越高,性能越差.
      (1)查看数据库的隔离级别
      mysql默认的隔离级别: REPEATABLE-READ
      mysql8.0:
      系统级别的:select @@global.transaction_isolation;
      会话级别的:select @@transaction_isolation;
      mysql5.x:
      系统级别的:select @@global.tx_isolation;
      会话级别的:select @@tx_isolation;
    mysql> select @@global.transaction_isolation;
    +--------------------------------+
    | @@global.transaction_isolation |
    +--------------------------------+
    | REPEATABLE-READ                |
    +--------------------------------+
    1 row in set (0.00 sec)
    

    (2)修改隔离级别
    set global tansaction isolation level read uncomitted;

    数据库的三大范式
    • 第一范式
    • 数据表中的所有字段都是不可分割的原子项.初步可以理解为:字段值还可以继续拆分的,就不满足第一范式.
      比如某表中有一个address的字段,插入值为"中国陕西省西安市碑林区柏树林11号".该字段值是可以继续拆分的,原则上就不满足第一范式.可以依次拆分为:国家/省/市/区/街道等等.
      当然,范式设计的越详细,对某些实际操作可能会更好.但不一定都是好处.<比如对address字段来说,可能拆分开来永远都用不到这么详细的信息,可能就没有拆分的必要.>
    • 第二范式
      必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖主键.如果要出现不完全依赖,只可能发生在联合主键的情况下.
    例如:
    create table myorder(
    		product_id int,
    		customer_id int,
    		product_name varchar(20),
    		customer_name varchar(20),
    		primary key(product_id, customer_id
    	);
    	当前表中, 除主键以外的其他列, 只依赖于主键的部分字段.则不满足第二范式,通常需要拆表.
    create table myorder(
    		order_id int primary key,
    		product_id int,
    		customer_id int
    	);
    create  table product (
    		id int primary key,
    		name varchar(20)
    	);
    create table customer(
    		id int primary key,
    		name varchar(20)
    		);
    拆分成三个表后,满足第二范式.
    
    • 第三范式
      必须先满足第二范式.除开主键列的其他列之间不能有传递依赖关系.
    附件

    查询语句所涉及的sql语句

    create table student(
    	sno varchar(20) primary key,
    	sname varchar(20) not null,
    	ssex varchar(20) not null,
    	sbrithday datetime,
    	class varchar(20)
    	);
    
    create table student(
    	sno varchar(20) primary key,
    	sname varchar(20) not null,
    	ssex varchar(10) not null,
    	sbirthday datetime,
    	class varchar(20)
    )
    
    create table teacher(
    	tno varchar(20) primary key,
    	tname varchar(20) not null,
    	tsex varchar(20) not null,
    	tbirthday datetime,
    	prof varchar(20) not null,
    	depart varchar(20) not null
    	);
    
    create table course(
    	cno varchar(20) primary key,
    	cname varchar(20) not null,
    	tno varchar(20) not null,
    	foreign key(tno) references teacher(tno)
    	);
    
    create table score(
    	sno varchar(20) not null,
    	degree decimal,
    	primary key (sno, cno),
    	foreign key (sno) references student(sno),
    	foreign key (cno) references course(cno)
    	);
    
    insert into student values ('101','曾华','男','1977-09-01','95033');
    insert into student values ('102','匡明','男','1975-10-02','95031');
    insert into student values ('103','王丽','女','1976-01-23','95033');
    insert into student values ('104','李军','男','1976-02-20','95033');
    insert into student values ('105','王芳','女','1975-02-10','95031');
    insert into student values ('106','陆君','男','1974-06-03','95031');
    insert into student values ('107','王尼玛','男','1976-02-20','95033');
    insert into student values ('108','张全蛋','男','1975-02-10','95031');
    insert into student values ('109','赵铁柱','男','1974-06-03','95031');
    
    insert into teacher values ('804','李成','男','1958-12-02','副教授','计算机系');
    insert into teacher values ('856','张旭','男','1969-03-12','讲师','电子工程系');
    insert into teacher values ('825','王萍','女','1972-05-05','助教','计算机系');
    insert into teacher values ('831','刘冰','女','1977-08-14','助教','电子工程系');
    
    insert into course values ('3-105','计算机导论', '825');
    insert into course values ('3-245','操作系统', '804');
    insert into course values ('6-166','数字电路', '856');
    insert into course values ('9-888','高等数学', '831');
      
    insert into score values('103','3-245','86');
    insert into score values('105','3-245','75');
    insert into score values('109','3-245','68');
    insert into score values('103','3-105','92');
    insert into score values('105','3-105','88');
    insert into score values('109','3-105','76');
    insert into score values('103','3-105','64');
    insert into score values('105','6-166','79');
    insert into score values('109','6-166','81');
    
    
    create table person(
    	id int primary key auto_increment,
    	name varchar(20),
    	cardId int
    );
    
    create table card (
    	id int,
    	name varchar(20)
    );
    
    insert into card values (1,'饭卡');
    insert into card values (2,'建行卡');
    insert into card values (3,'农行卡');
    insert into card values (4,'工商卡');
    insert into card values (5,'邮政卡');
    
    insert into person values (1,'张三',1);
    insert into person values (2,'李四',3);
    insert into person values (3,'王五',6);
    
    
    
    
    展开全文
  • 如果我们需要在生产环境中修改MySQL数据库中某个表的结构。那么,需要考虑哪些要点,才能确保不会出问题呢? 碰到的问题 这里先描述一下我在生产环境MySQL数据库中修改库表结构时遇到的问题。 在开发过程中,我...

    背景

    如果我们需要在生产环境中修改MySQL数据库中某个库表的结构。那么,需要考虑哪些要点,才能确保不会出问题呢?

    碰到的问题

    这里先描述一下我在生产环境MySQL数据库中修改库表结构时遇到的问题。
    在开发过程中,我发现MySQL中某个库表需要添加一个字段,比如库表:
    在这里插入图片描述

    需要给Sname后面添加一个字段:Sheight。那么就使用命令:
    alter table practice.Student add column Sheight int(4) not null default 0 comment '"身高"
    输入完这个命令后,我就去做别的事情去了。
    直到过了一小会,有人反馈说线上的系统有些界面没有数据。这个时候我才意识到,是这个操作出了问题。导致了线上bug。

    问题的解决

    我立马查看这个操作,发现还没有执行结束。首先kill了这个执行任务,于是线上系统恢复了正常。

    导致该问题的原因

    当时,我用命令:show processlist查询,看到这个语句的State显示的是:
    Waiting for table metadata lock。我们知道,这个状态是说,该表在等待获取表的metadata lock,也就是MDL。
    也就是说,由于前面有MDL读锁没有被释放,因此我这个命令也就获取不到MDL写锁。导致后面再过来的各种操作都无法被执行,都在等待MDL读锁。
    这里解释下metadata的概念,metadata lock(MDL)也就是元数据锁,它是一种表级锁。
    各种对该表的操作,比如增删改查,都会占有MDL的读锁。当修改表结构时,会占用MDL的写锁。
    读锁和读锁之间互不冲突,而读锁与写锁、写锁与写锁之间互相冲突。
    简单说,就是对一个表增删改查同时进行,MDL锁不会冲突,我们可以用多线程同时执行这些操作,只会导致行锁,而不会锁整个表。
    但是,如果在对表增删改查的同时,要对表结构进行修改,那么就会造成锁等待的状态。
    如果有一个长事务在对该表进行操作,那么在修改表结构时,就会有状态:Waiting for table metadata lock,也就是锁等待。如果这个时候,另外又有查询操作过来,那么,后面这个操作就也要进行Waiting for table metadata lock,也就是锁等待了。当然,对该表的查询操作就会全部阻塞。
    我当时的情况就是这样,有一个事务操作了该表,但是可能由于大意没有关掉该事务,该事务长时间存在。而我同时又进行表结构的更改,于是导致了这次事故。

    如何做

    首先,我们要了解一下有没有什么事务对该表进行了操作,却长期没有提交。因为,只有对该表操作的事务最终提交了,MDL锁才会被释放。
    换句话说,如果某个事务对该表进行了操作,比如读操作,但是最终没有做提交,那么,该事务依然会占用MDL锁的。
    查看事务可以用命令:SELECT * FROM information_schema.INNODB_TRX
    做完这一步之后,基本上可以避免出现Waiting for table metadata lock的情况了,但还有一点需要注意,就是线上会不会对该表进行频繁的操作,
    有些热表可能一直处于有人在查询的状态,这种时候怎么做呢?
    我们可以在变更表结构的命令中添加一个超时时间,如果这个命令在该时间段内一直无法执行,那么会自动超时的,起码可以保证不会长时间的影响用户的操作。
    该命令为:alter table practice.Student wait 100 add column Sheight int(4) not null default 0 comment '"身高"

    总结

    在生产环境中变更MySQL数据库中库表结构是一件比较有风险的事情,所以一定要三思而后行,避免引起任何可能的线上事故。

    展开全文
  • 作者 罗小波 · 沃趣科技高级数据库技术专家出品 沃趣科技在上一期《优化器成本记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql 系统库中的优化器成本记录表,本期我们将为大家带来系列第六篇《时区信息...
    016cbfbded96e0b575275e0fcf418e64.png

    作者  罗小波 · 沃趣科技高级数据库技术专家

    出品  沃趣科技

    8a9f20450b7c69d4d43abc536d00998e.png

    在上一期《优化器成本记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql 系统库中的优化器成本记录表,本期我们将为大家带来系列第六篇《时区信息记录表|全方位认识 mysql 系统库》,下面请跟随我们一起开始 mysql 系统库的系统学习之旅吧

    01 时区信息概述

    MySQL服务器维护几个时区设置:
    • 系统时区:当Server启动时,尝试确定主机的时区并使用它来设置Server的system_time_zone系统变量值。该变量为只读变量,此外,您还可以在Server启动时使用--timezone = timezone_name选项为mysqld_safe设置MySQL服务器的系统时区。或者在Server启动之前设置 TZ系统环境变量为timezone_name值。
    • Server的当前时区。全局系统变量time_zone的值表示当前正在运行的Server时区,该系统变量的初始值为'SYSTEM',表示Server时区与系统时区相同。* 如果系统变量time_zone设置为SYSTEM,则每个有时区计算需要的MySQL函数在调用时,都会调用系统库来确定当前的系统时区。因此,此系统调用可能会受全局互斥保护,从而导致争用发生。* Server的全局当前时区可以在启动时使用--default-time-zone = timezone启动选项明确指定,也可以在my.cnf中使用default-time-zone='timezone' 指定,如果您具有SUPER权限,则可以使用语句SET GLOBAL time_zone = timezone; 在Server运行时设置全局Server时区值。* time_zone是全局,会话变量,可以在会话级别为每个会话单独设置自己的时区(连接时区),每个会话的time_zone值默认会继承time_zone系统变量的全局值,但每个会话可以使用SET time_zone = timezone;语句进行 修改。要注意:当前会话的时区设置会影响对时区敏感的时间值的显示和存储。例如:NOW()或CURTIME()等函数显示的值是使用会话时区值、TIMESTAMP数据类型列中存储和检索的值使用的是会话时区值-- TIMESTAMP列的值会从当前时区转换为UTC存储,查询时从UTC转换为当前时区。但当前时区设置不影响诸如UTC_TIMESTAMP()函数或DATE、TIME或DATETIME数据类型列中值的显示和存储--这些数据类型中的值不以UTC存储;如果有需要针对DATE、TIME或DATETIME显示时区影响,可以将它们的值转换为UTC,然后执行算术运算,然后再转换回去。* time_zone系统变量可以设置为SYSTEM,表示与系统时区相同,也可以设置具体的时区,例如:'+10:00'或'-6:00' 表示在UTC时区的基础上,+ 10个时区或 -6个时区(与UTC时区的偏移量),实际上相当于东十区和西六区。还可以设置为具体的时区名称,例如: 'Europe/Helsinki', 'US/Eastern', or 'MET',但是,可设置的有效值来自mysql系统字典库的time_zone表,该表中的信息需要手工使用相应的命令插入,稍后会介绍插入方法。
    如何填充时区表(mysql 系统字典库下有时区相关的表time_zone、time_zone_leap_second、time_zone_name、time_zone_transition、time_zone_transition_type,这些表是在MySQL初始化时创建,但不会加载数据到这些表中):
    • 如果您的系统具有自己的zoneinfo数据库(描述时区的文件集,通常在/usr/share/zoneinfo目录下),则可以使用mysql自带的mysql_tzinfo_to_sql程序来填充时区表。如果您的系统没有zoneinfo数据库,则可以使用本节后面所述的可下载软件包来进行填充时区表:
    # 使用系统自带的时区数据集文件来填充MySQL 时区表(一次加载操作系统支持的所有时区),mysql_tzinfo_to_sql命令会读取您系统的时区文件并生成SQL语句来插入到MySQL的时区表中。注意:这种方式不会导入跳秒信息到time_zone_leap_second表中,需要单独操作

    02 时区信息记录表详解

    2.1. time_zone

    该表提供查询时区ID和跳秒之间的映射关系数据。

    下面是该表中存储的信息内容(需要手工导入时区数据信息到数据库才有数据)。

    04

    表字段含义。

    • Time_zone_id:时区ID。

    • Use_leap_seconds:表示该时区是否使用了跳秒(GPS原子钟时间和UTC时间之差,因为两个时间系统的秒长不一样,也就是我们所说的时间尺度不一样,最终随着时间的累积,两者之间就会差。而世界协调时为了协调人们生活中的时间,就采用了跳秒的办法来处理这种差异。目前两者之差为15秒)。

    2.2. time_zone_leap_second

    该表提供查询跳秒机器修正值信息,该表中的信息与time_zone_transition表中的类似,但time_zone_transition表中还记录了时区ID等信息。

    下面是该表中存储的信息内容。

    04

    表字段含义。

    • Transition_time:跳秒的瞬变时间(表示UTC和GPS时间的差异 ?

    • Correction:跳秒的修正值。

    2.3. time_zone_name

    该表提供查询时区的名称列表和时区ID的映射关系。

    下面是该表中存储的信息内容。

    04

    表字段含义。

    • Name:时区名称,该值为time_zone系统变量的有效值之一。

    • Time_zone_id:时区ID,该ID和表time_zone中的ID相对应。

    2.4. time_zone_transition

    该表提供查询时区的跳秒数据。

    下面是该表中存储的信息内容。

    04

    表字段含义。

    • Time_zone_id:时区ID。

    • Transition_time:与time_zone_leap_second表中的Transition_time字段含义相同。

    • Transition_type_id:与time_zone_transition_type表中的Transition_type_id相对应。

    2.5. time_zone_transition_type

    该表提供查询具体的跳秒信息以及与时区的对应数据。

    下面是该表中存储的信息内容。

    05

    表字段含义。

    • Time_zone_id:时区ID。

    • Transition_type_id:与time_zone_transition表中的Transition_type_id值对应。

    • Offset:与UTC时间之间的偏移量。

    • Is_DST:

    • Abbreviation:某某标准时间的缩写,例如:GMT,该值为time_zone系统变量的有效值之一。

    本期内容就介绍到这里,本期内容参考链接如下:

    https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html

     

    "翻过这座山,你就可以看到一片海!"。坚持阅读我们的"全方位认识 mysql 系统库"系列文章分享,你就可以系统地学完它。谢谢你的阅读,我们下期不见不散!

    | 作者简介

    罗小波·沃趣科技高级数据库技术专家

    IT从业多年,主要负责MySQL 产品的数据库支撑与售后二线支撑。曾参与版本发布系统、轻量级监控系统、运维管理平台、数据库管理平台的设计与编写,熟悉MySQL体系结构,Innodb存储引擎,喜好专研开源技术,多次在公开场合做过线下线上数据库专题分享,发表过多篇数据库相关的研究文章。

    相关链接

    MySQL 一个让你怀疑人生的hang死现象

    揭秘 MySQL 主从环境中大事务的传奇事迹

    MySQL 执行DDL语句 hang住了怎么办?

    手把手教你认识OPTIMIZER_TRACE

    MySQL行级别并行复制能并行应用多少个binlog group?

    binlog server还是不可靠吗?

    MySQL binlog基于时间点恢复数据失败是什么鬼?

    select into outfile问题一则

    开源监控系统Prometheus的前世今生

    prometheus监控多个MySQL实例

    MySQL问题两则

    Kubernetes scheduler学习笔记

    执行计划-3:解释规则

    执行计划-2:查看更多的信息

    执行计划-1:获取执行计划

    大数据量删除的思考(四)

    大数据量删除的思考(三)

    大数据量删除的思考(二)

    大数据量删除的思考(一)

    优化器成本记录表|全方位认识 mysql 系统库

    统计信息记录表|全方位认识 mysql 系统库

    数据库对象信息记录表|全方位认识 mysql 系统库

    访问权限控制系统|全方位认识 mysql 系统库

    权限系统表 | 全方位认识 mysql 系统库

    Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part Two

    Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part One

    Oracle RAC Cache Fusion 系列十三:PCM资源访问

    c90a15e624d464ca6ddf3784324bd05f.png

    更多干货,欢迎来撩~

    展开全文
  • 废话不多说,直接上图,第一个,是程序日志打印时间,第二个是插入到数据库中的时间,数据库为mysql,时区设置为北京 问题背景:直接在数据库中写sql插入,没有出现时间不同的问题,但是程序一运行就出问题。日志...
  • MySQL库的详细操作

    2021-01-29 23:01:27
    MySQL刚安装好, 我们使用SQL语句 show databases 查看有哪些的时候, 会显示出一些系统默认的一些数据库 : 1.information_schema 这是虚拟, 不占用磁盘空间, 存储的是数据库启动后的一些参数, 如用户表信息、列...
  • MySQL - 高效的设计MySQL库

    千次阅读 多人点赞 2020-08-16 21:42:15
    文章目录 学习更多干货 范式与反范式 范式 第一范式 第二范式 第三范式 第二范式 VS 第三范式 设计符合 2NF 的表 范式优缺点 反范式 范式 VS 反范式 MySQL 使用原则和设计规范 基本设置规则 线上系统转不区分大小写 ...
  • MySQL分表

    千次阅读 2020-07-14 13:31:46
    MySQL分表 互联网系统需要处理大量用户的请求。比如微信日活用户破10亿,海量的用户每天产生海量的数量;美团外卖,每天都是几千万的订单,那这些系统的用户表、订单表、交易流水表等是如何处理呢? 数据量只增...
  • mysql 日志系统详解

    千次阅读 2020-02-03 14:28:21
    mysql 日志种类 1.错误日志(error log):记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。...4.慢查询日志(slow log):记录所有执行时间超过long_query_time的所有查询或不使...
  • MySQLMySQL分表详解

    千次阅读 多人点赞 2020-02-25 16:47:21
    目录 一、前言 1.1 数据量 1.2 磁盘 1.3 数据库连接 二、垂直拆分 or 水平拆分? 三、垂直拆分 3.1 垂直分 3.2 垂直分表 ...4.2 水平分分表 ...五、几种常用的分分表的策略 ...六、分分表...
  • MySql分表实践

    千次阅读 2017-08-30 16:27:31
    Mysql分表技术层面的文章已经很多,但涉及的如何实施的文章并不多,本人结合刚刚结束的迁移项目经历整理此文,由于本文为纯文字性文章,内容可能比较枯燥,但仍希望能够为即将执行迁移的人提供些许帮助。...
  • MySQL分表方案

    千次阅读 2019-01-26 23:29:16
    一、Mysql分表方案 1.为什么要分表: 2. mysql proxy:amoeba 3.大数据量并且访问频繁的表,将其分为若干个表 4. 利用merge存储引擎来实现分表 二、数据库架构 1、简单的MySQL主从复制: 2、MySQL垂直...
  • MySQL常用系统表大全

    千次阅读 2018-06-22 16:33:47
    原文:https://blog.csdn.net/xlxxcc/article/details/51754524MySQL5.7 默认的模式有:information_schema, 具有 61个表; m ysqL, 具有31个表;... Information_schema数据库是MySQL自带的,...
  • mysql 数据库 修改默认时区

    万次阅读 多人点赞 2018-03-15 13:59:19
    所以需要修改mysql系统时区。使用mysql连接工具或者命令好工具都可以。我用workbench输入命令行:select now(); 查看mysql系统时间。和当前时间做对比set global time_zone = '+8:00';设置时区更改为东八区flush ....
  • 基于Java和MySQL的图书管理系统

    万次阅读 多人点赞 2018-06-20 21:41:17
    Java图书管理系统 设计人:wangyunpeng_bio ...本次作业利用JAVA开发工具Eclipse和MySQL数据库来开发这个图书管理系统。该系统要解决的图书管理所要解决的问题,可以满足图书管理基本要求,包括添加、管理等功能。...
  • 1.数据库url后追加 &serverTimezone=Asia/Shanghai 2.修改数据库默认时区 > show variables like "%time_zone%";... ##修改mysql全局时区为北京时间,即我们所在的东8区 > set time_zone = '+8:...
  • Mycat之——实现MySQL垂直分

    千次阅读 2020-03-01 15:15:40
    对于一个早期的商城系统来说,由于业务量不太大,数据承载压力不高,我们可以将所有的数据放在一台MySQL服务器上,此时的数据库架构就类似于下图所示。 随着业务量的不断增加,数据库的压力越来越大,此时我们可以...
  • 能看到几个数据库,是mysql系统自带的,有: information_schema mysql performance_schema sys 这些都是mysql系统自带的数据库。 其中information_schema数据库,里面是mysql数据库系统在工作时的存储的...
  • 数据据的英文单词:DataBase 简称:DB 什么是数据库? 用于存储和管理数据的仓库 数据库的特点 持久化储存数据。其实数据库就是一个文件系统 方便存储和管理数据 使用了统一的方式操作数据库 SQL 常见...
  • MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。最重要是MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库信息 功能非常...
  • 若依框架3.0从MYSQL库改成orcale库

    千次阅读 2018-11-22 22:19:36
    2.因为公司的业务需求要求把若依框架的数据库从MYSQL修改为ORCALE,版本是若依3.0的修改方案,基本低版本的也可以安装此思路来修改。 3.若依框架下载地址http://www.ruoyi.club/,下载好了之后可以看到SQL文件, ...
  • Mysql分表方案

    千次阅读 2018-08-20 15:03:03
    Mysql分表方案   1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。   ...
  • 在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量、连接数、处理能力等都很有限,数据库本身的“有状态性”导致了它并不像Web和应用服务器那么容易扩展。那么在我们的业务中,...
  • MySQL用户权限系统

    千次阅读 2016-09-15 22:42:34
    MySQL权限系统主要功能是验证从给定地址(host)登录的用户(user),同时将用户与数据库的权限如SELECT、INSERT、UPDATE和DELETE等关联起来。其他功能包括访客功能,授权MySQL 特定功能如LOAD_DATA_INFILE和管理...
  • mysql存储引擎

    万次阅读 多人点赞 2019-07-31 19:28:44
    数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的...
  • mysql、分表解决方案

    千次阅读 2019-01-30 16:03:40
    一、Mysql分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间mysql...
  • 需要注意的是mysql语句中不能有反引号或者单引号 脚本需要授权,命令为: chmod 777 genera.sh mysql版本为5.7 genera.sh USERNAME="root" PASSWORD="***" DBNAME="luntek_icplatform_test" #数据库名称 ...
  • Linux系统CentOS7.7安装MySQLMySQL主从同步配置MySQL安装下载MySQL包检查是否存在已安装的MySQL或mariadb解压文件创建mysql用户组和用户并修改权限移动并重命名主库配置my.cnf主库配置my.cnf初始化并查看密码启动...
  • [以下操作使用root用户进行] 一、主从库系统环境 1.主库系统:CentOS Linux release 7.6....二、主从库系统MYSQL版本 1.主库MYSQL版本:mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,173
精华内容 60,469
关键字:

修改mysql库系统日期

mysql 订阅