linux-tutorial/docs/linux/soft/mysql-ops.md

11 KiB
Raw Blame History

Mysql 维护

安装配置

通过 rpm 包安装

centos 的 yum 源中默认是没有 mysql 的,所以我们需要先去官网下载 mysql 的 repo 源并安装。

安装 mysql yum 源

官方下载地址:https://dev.mysql.com/downloads/repo/yum/

1下载 yum 源

$ wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

2安装 yum repo 文件并更新 yum 缓存

$ rpm -ivh mysql80-community-release-el7-1.noarch.rpm

执行结果:

会在 /etc/yum.repos.d/ 目录下生成两个 repo 文件

$ ls | grep mysql
mysql-community.repo
mysql-community-source.repo

更新 yum

$ yum clean all
$ yum makecache

3查看 rpm 安装状态

$ yum search mysql | grep server
mysql-community-common.i686 : MySQL database common files for server and client
mysql-community-common.x86_64 : MySQL database common files for server and
mysql-community-test.x86_64 : Test suite for the MySQL database server
                       : administering MySQL servers
mysql-community-server.x86_64 : A very fast and reliable SQL database server

通过 yum 安装 mysql 有几个重要目录:

# 数据库目录
/var/lib/mysql/
# 配置文件
/usr/share/mysqlmysql.server命令及配置文件
# 相关命令
/usr/binmysqladmin mysqldump等命令
# 启动脚本
/etc/rc.d/init.d/启动脚本文件mysql的目录
# 配置文件
/etc/my.cnf

安装 mysql 服务器

$ yum install mysql-community-server

启动 mysql 服务

# 启动 mysql 服务
systemctl start mysqld.service

# 查看运行状态
systemctl status mysqld.service

# 开机启动
systemctl enable mysqld
systemctl daemon-reload

初始化数据库密码

查看一下初始密码

$ grep "password" /var/log/mysqld.log
2018-09-30T03:13:41.727736Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: %:lt+srWu4k1

执行命令:

mysql -uroot -p<临时密码>

输入临时密码,进入 mysql如果要修改密码执行以下指令

ALTER user 'root'@'localhost' IDENTIFIED BY '你的密码';

注:密码强度默认为中等,大小写字母、数字、特殊符号,只有修改成功后才能修改配置再设置更简单的密码

配置远程访问

mysql> CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
mysql> GRANT ALL ON *.* TO 'root'@'%';
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
mysql> FLUSH PRIVILEGES;

跳过登录认证

vim /etc/my.cnf

在 [mysqld] 下面加上 skip-grant-tables

作用是登录时跳过登录认证,换句话说就是 root 什么密码都可以登录进去。

执行 service mysqld restart,重启 mysql

部署

主从节点部署

假设需要配置一个主从 Mysql 服务器环境

  • master 节点192.168.8.10
  • slave 节点192.168.8.11

配置主从同步

1主节点配置

执行 vi /etc/my.cnf ,添加如下配置:

[mysqld]
server-id=1
log-bin=mysql-bin
  • server-id - 服务器 ID 号;
  • log-bin - 同步的日志路径及文件名一定注意这个目录要是mysql有权限写入的

2从节点配置

执行 vi /etc/my.cnf ,添加如下配置:

[mysqld]
server-id=2
log-bin=mysql-bin

3创建用于复制操作的用户

mysql> CREATE USER 'sync'@'192.168.8.11' IDENTIFIED WITH mysql_native_password BY '密码'; -- 创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'sync'@'192.168.8.11'; -- 授权
mysql> FLUSH PRIVILEGES; -- 刷新授权表信息

4查看主节点状态

mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000001 |     4202 |              | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)

5在Slave节点上设置主节点参数

MASTER_LOG_FILEMASTER_LOG_POS 参数要分别与 show master status 指令获得的 FilePosition 属性值对应。

mysql> CHANGE MASTER TO
MASTER_HOST='192.168.199.149',
MASTER_USER='sync',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=4202;

6查看主从同步状态

mysql> show slave status\G;

说明:如果以下两项参数均为 YES说明配置正确。

  • Slave_IO_Running
  • Slave_SQL_Running

7启动 slave 进程

mysql> start slave;

同步主节点已有数据到从节点

主库操作:

1停止主库的数据更新操作

mysql> flush tables with read lock;

2新开终端生成主数据库的备份导出数据库

$ mysqldump -uroot -p<密码> test > test.sql

3将备份文件传到从库

$ scp test.sql root@192.168.8.11:/root/

4主库解锁

mysql> unlock tables;

从库操作:

1停止从库slave

mysql> stop slave;

2新建数据库test

mysql> create database test default charset utf8;

3导入数据

$ mysql -uroot -ptest123 cmdb<cmdb.sql 

4查看从库已有该数据库和数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cmdb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+

运维

创建用户

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

说明:

  • username你将创建的用户名
  • host指定该用户在哪个主机上可以登陆如果是本地用户可用 localhost如果想让该用户可以从任意远程主机登陆,可以使用通配符%
  • password该用户的登陆密码密码可以为空如果为空则该用户可以不需要密码登陆服务器

示例:

CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%';

授权

命令:

GRANT privileges ON databasename.tablename TO 'username'@'host'

说明:

  • privileges用户的操作权限SELECTINSERTUPDATE等,如果要授予所的权限则使用ALL
  • databasename数据库名
  • tablename表名如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*

示例:

GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';
GRANT ALL ON maindataplus.* TO 'pig'@'%';

注意:

用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

撤销授权

命令:

REVOKE privilege ON databasename.tablename FROM 'username'@'host';

说明:

privilege, databasename, tablename同授权部分

例子:

REVOKE SELECT ON *.* FROM 'pig'@'%';

注意:

假如你在给用户'pig'@'%'授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'pig'@'%',则在使用REVOKE SELECT ON *.* FROM 'pig'@'%';命令并不能撤销该用户对 test 数据库中 user 表的SELECT 操作。相反,如果授权使用的是GRANT SELECT ON *.* TO 'pig'@'%';REVOKE SELECT ON test.user FROM 'pig'@'%';命令也不能撤销该用户对 test 数据库中 user 表的Select权限。

具体信息可以用命令SHOW GRANTS FOR 'pig'@'%'; 查看。

更改用户密码

SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');

如果是当前登陆用户用:

SET PASSWORD = PASSWORD("newpassword");

示例:

SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");

备份与恢复

Mysql 备份数据使用 mysqldump 命令。

mysqldump 将数据库中的数据备份成一个文本文件,表的结构和表中的数据将存储在生成的文本文件中。

备份:

1备份一个数据库

语法:

mysqldump -u <username> -p <database> [<table1> <table2> ...] > backup.sql
  • username 数据库用户
  • dbname 数据库名称
  • table1 和 table2 参数表示需要备份的表的名称,为空则整个数据库备份;
  • BackupName.sql 参数表设计备份文件的名称,文件名前面可以加上一个绝对路径。通常将数据库被分成一个后缀名为 sql 的文件

2备份多个数据库

mysqldump -u <username> -p --databases <database1> <database2> ... > backup.sql

3备份所有数据库

mysqldump -u <username> -p -all-databases > backup.sql

恢复:

Mysql 恢复数据使用 mysqldump 命令。

语法:

mysql -u <username> -p <database> < backup.sql

卸载

1查看已安装的 mysql

$ rpm -qa | grep -i mysql
perl-DBD-MySQL-4.023-6.el7.x86_64
mysql80-community-release-el7-1.noarch
mysql-community-common-8.0.12-1.el7.x86_64
mysql-community-client-8.0.12-1.el7.x86_64
mysql-community-libs-compat-8.0.12-1.el7.x86_64
mysql-community-libs-8.0.12-1.el7.x86_64

2卸载 mysql

$ yum remove mysql-community-server.x86_64

问题

JDBC 与 Mysql 因 CST 时区协商无解导致偏差了 14 或 13 小时

现象

数据库中存储的 Timestamp 字段值比真实值少了 13 个小时。

原因

  • 当 JDBC 与 MySQL 开始建立连接时,会获取服务器参数。
  • 当 MySQL 的 time_zone 值为 SYSTEM 时,会取 system_time_zone 值作为协调时区,若得到的是 CST 那么 Java 会误以为这是 CST -0500 ,因此会给出错误的时区信息(国内一般是CST +0800,即东八区)。

查看时区方法:

通过 show variables like '%time_zone%'; 命令查看 Mysql 时区配置:

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+

解决方案

方案一

mysql> set global time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)

mysql> set time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)

方案二

修改 my.cnf 文件,在 [mysqld] 节下增加 default-time-zone = '+08:00' ,然后重启。

参考资料

🚪 传送门

| 技术文档归档 | 数据库教程系列 |