标签 - MySQL

MySQL    2020-05-22 09:53:57    30    0    0

为什么基于Docker搭建?

  • 资源有限
  • 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐
  • 一台机器上可以运行多个Docker容器
  • Docker容器之间相互独立,有独立ip,互不冲突
  • Docker使用步骤简便,启动容器在秒级别

利用Docker搭建主从服务器

首先拉取docker镜像,我们这里使用5.7版本的mysql:

docker pull mysql:5.7

然后使用此镜像启动容器,这里需要分别启动主从两个容器

Master(主):

docker run -p 3339:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave(从):

docker run -p 3340:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的问题。

使用docker ps命令查看正在运行的容器:

mark

此时可以使用Navicat等工具测试连接mysql

mark

配置Master(主)

通过docker exec -it 627a2368c865 /bin/bash命令进入到Master容器内部,也可以通过docker exec -it mysql-master /bin/bash命令进入。627a2368c865是容器的id,而mysql-master是容器的名称。

cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim

会出现如下问题:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vi
MySQL    2020-05-22 08:34:23    24    0    0

连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loaded的错误。

出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 

这里用第二种方式 ,解决方法如下

1. 管理员权限运行命令提示符,登陆MySQL(记得添加环境变量)

   mysql -u root -p

   password:                                                                         #登入mysql

 

2. 修改账户密码加密规则并更新用户密码

   ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;   #修改加密规则 

   ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';   #更新一下用户的密码 

 

3. 刷新权限并重置密码

   FLUSH PRIVILEGES;   #刷新权限 

 上面两步对应的截图

单独重置密码命令:alter user 'root'@'localhost' identified by '111111';

MySQL    2019-11-25 11:16:01    17    0    0

一、MySQL 日期和时间戳的转换


1.日期转时间戳

select UNIX_TIMESTAMP('2018-12-25 12:25:00');
结果:1545711900


2.时间戳转日期:FROM_UNIXTIME(unix_timestamp) --unix_timestamp为时间戳

select FROM_UNIXTIME(1545711900);
结果:2018-12-25 12:25:00


3.时间戳转日期,自定义返回日期格式:FROM_UNIXTIME(unix_timestamp,format) -- format请参考后面的截图

select FROM_UNIXTIME(1545711900,'%Y-%m-%d %T');
-- 结果:2018-12-25 12:25:00

二、DATE_FORMAT(date,format)函数用于以不同的格式显示日期/时间数据

date 参数是合法的日期。format 规定日期/时间的输出格式

可以使用的格式有

 

 
select DATE_FORMAT(NOW(), '%Y-%m-%d %T');
结果:2018-12-25 12:25:00

 

MySQL    2019-11-06 11:07:23    20    0    0

 在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int、timestamp、datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好呢?飘易就这个问题,来一个实践出真知吧。


MYSQL版本号:5.5.19


建立表:

CREATE TABLE IF NOT EXISTS `datetime_test` (
  `id` int(11) NOT NULL,
  `d_int` int(11) NOT NULL DEFAULT '0',
  `d_timestamp` timestamp NULL DEFAULT NULL,
  `d_datetime` datetime DEFAULT NULL
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8;
ALTER TABLE `datetime_test`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;

插入100万条测试数据:

  1.  
    <?php header( 'Content-Type: text/html; charset=UTF-8' );
  2.  
    set_time_limit(300); //最大执行时间这里设置300秒
  3.  
     
  4.  
    //连接数据库
  5.  
    $pdo = new PDO("mysql:host=localhost;dbname=test","root","123"); 
  6.  
     
  7.  
    for ($i = 1; $i <= 1000000; $i++) { 
  8.  
    $d_int=$i;
  9.  
    $pdo->exec("insert into datetime_test(d_int,d_timestamp,d_datetime) 
  10.  
    values($d_int,FROM_UNIXTIME($d_int),FROM_UNIXTIME($d_int))");
  11.  
    }

取中间的20万条做查询测试:

SELECT FROM_UNIXTIME(400000), FROM_UNIXTIME(600000)
1970-01-05 23:06:40, 1970-01-08 06:40:00


第一种情况,MyISAM引擎, d_int/d_timestamp/d_datetime这三个