MySQL数据库问题

查询数据库时间

  1. select sysdate();
  2. select now();
  3. select current_date;

连接url需指定serverTimezone

1
2
3
4
5
6
jdbc:mysql://{host}:{port}/{database}?
useUnicode=true& //驱动程序在处理字符串时是否应使用Unicode字符编码?默认位true,设置false可能出现乱码
characterEncoding=UTF-8& //指定字符编码
serverTimezone=Asia/Shanghai& //指定时区位亚洲上海
useSSL=false& // 与服务器通信时使用ssl(true/false),连接到MySQL5.5.45+、5.6.26+或5.7.6+时默认为“true”,否则默认为“false”
allowPublicKeyRetrieval=true //如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启

服务器时间

  • 进入linux:输入date查看服务器时间

image-20200915222100673

  • 使用timedatectl命令

    timedatectl对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布式系统的sysvinit守护进程的date命令。

    显示当前系统时间

    1
    2
    3
    4
    5
    6
    使用timedatectl命令
    # timedatectl list-timezones |grep Shanghai #查找上海的完整名称
    Asia/Shanghai
    # timedatectl set-timezone Asia/Shanghai #其他时区以此类推
    或者直接手动创建软链接
    # ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

docker容器时间

进入docker命令:

1
docker exec -it {容器名或容器id}  /bin/bash

查看时间命令:date

复制相应的时区文件,替换系统时区文件;

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

有的容器基础镜像是有这个文件的,直接拷贝就可以,如果不能拷贝,则是因为创建镜像时依赖的基础镜像 运行的容器没有这两个文件,使用下面的办法

  1. 创建文件夹

    mkdir -p /usr/share/zoneinfo/Asia

  2. 回到宿主机,复制宿主机里的文件到容器中

    docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia

​ 3.进入容器执行命令 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

tomcat容器时区问题

描述:java的war包部署在Linux上的tomcat容器中相差8小时

解决:在tomcat的bin目录下找到catalina.sh文件在JAVA_OPTS追加添加如下配置

1
-Duser.timezone='Asia/Shanghai'

image-20200915221437392

END