MySQL集群运维
MySQL运维操作
用户管理(创建、删除、授权)
- 用户分类:管理员用户、普通用户
- 管理员用户:'root'@'localhost',系统默认创建,拥有所有权限;
- 普通用户:管理员创建的用户,默认只能看到语法库,权限来自管理员赋予;
创建用户
#创建用户(本地用户、远程用户)
mysql> create user '用户名'@'localhost' idntified by '用户密码';
mysql> create user '用户名'@'%' identified by '用户密码';
#管理权限
mysql> grant 用户权限 on 数据库名.数据库表 to '用户名'@'登录地址';
mysql> show grants for '用户名'@'登录地址';
mysql> revoke 用户权限 on 数据库名.数据库表 from '用户名'@'登录地址';
#创建新用户的同时直接授权
mysql> grant 用户权限 on 数据库名.数据库表 to '用户名'@'登录地址' identified by '用户密
码';
密码管理(设置、修改、忘记)
#初始化密码,即为用户第一次设置密码
#普通用户
mysql> create user '用户名'@'登录地址' identified by '用户密码';
#管理员用户(root@localhost)
mysql> alter user '用户名'@'登录地址' identified by '用户密码';
修改密码
- 普通用户修改密码:set password=password('新密码');[管理员也可以用]
- 管理员用户修改密码: alter user '用户名'@'登录地址' identified by '用户密码';或:set password for '用户名'@'登录地址'= password("新密码");
忘记密码找回
- 普通用户:找管理员初始化
- 管理员用户:修改配置文件,重设密码
步骤——
(1)在mysql配置文件中跳过权限验证
vim /etc/my.cnf.d/mariadb-server.cnf[mysqld]
skip-grant-tables #添加跳过权限表验证#重启mysql服务
systemctl restart mariadb
(2)直接无密码进入mysql即可
[root@localhost ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.22-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]>
(3)数据库重设密码
#重启数据库后,若没有更新权限,是无法重设密码的
MariaDB [(none)]> alter user 'root'@'localhost' identified by '123';
ERROR 1290 (HY000): The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement#刷新权限
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.003 sec)
#重设密码
MariaDB [(none)]> alter user 'root'@'localhost' identified by '123';
Query OK, 0 rows affected (0.002 sec)或:
mysql> set password for root@localhost= password("新密码");
mysql> exit
(4)恢复配置文件,重启数据库,用新密码登录
vim /etc/my.cnf.d/mariadb-server.cnf
#去掉skip-grant-table
systemctl restart mariadb
#登录
[root@localhost ~]# mysql -uroot -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.5.22-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]>
数据管理(备份与恢复)
注:数据管理就是数据的备份和同步;若备份的是用户密码,恢复备份时记得刷新权限
方法一:rsync
- 备份数据位置:/var/lib/mysql
- 备份策略:日增量备份、周完全备份、每月进行还原测试
- 还原测试:搭建另一个生产测试环境,导入备份数据,测试
方法二:mysqldump
注:mysqldump命令备份、mysql还原
(1)备份一个数据库
- mysqldump -u用户名 -p密码 要备份的数据库名 > 文件名.sql
(2)备份一个数据库表
- mysqldump -u用户名 -p密码 要备份的数据库名 表名 > 文件名.sql
(3)备份多个数据库(或-B)
- mysqldump -u用户名 -p密码 --databases 数据库名1 数据库名2 > 文件名.sql
(4)备份所有数据库(或-A)
- mysqldump -u用户名 -p密码 --all-databases > 文件名.sql
(5)还原数据库
注:复备份的是一个数据库的时候需要手动创建数据库、再指定还原
- mysql -u用户名 -p密码 要还原到的数据库名 < 文件名.sql
(6)还原多个数据库
- mysql -u用户名 -p密码 < 文件名.sql
注:-B——备份多个库;-A:备份所有库;-d:只备份表;-t:只备份表中数据
方法三:日志备份
(1)查看二进制日志文件
MariaDB [(none)]> show variables like '%log%';
- 查询日志:general_log,记录所有查询语句
- 慢查询日志:slow_query_log,显示时间较慢的查询
- 二进制日志:log_bin,记录改变数据结构的语句
- 中继日志:relay_log,主从结构中的同步的日志
(2)开启二进制日志配置,产生二进制日志
vim /etc/my.cnf.d/mariadb-server.cnf
#等号左边是开启二进制日志、等号右边的是二进制日志的文件名
log-bin=mysql-bin#重启服务
systemctl restart mariadb
(3)查看二进制日志
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# ls
@65b0@5e93 db1 ib_buffer_pool ibtmp1 mysql-bin.000001 mysql_test
aria_log.00000001 db10 ibdata1 multi-master.info mysql-bin.index mysql_upgrade_info
aria_log_control db2 ib_logfile0 mysql mysql.sock performance_schema
[root@localhost mysql]# mysqlbinlog mysql-bin.000001或:
MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+
1 row in set (0.000 sec)MariaDB [(none)]> show binlog events in 'mysql-bin.000001';
+------------------+-----+-------------------+-----------+-------------+------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------------+-----------+-------------+------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 256 | Server ver: 10.5.22-MariaDB-log, Binlog ver: 4 |
| mysql-bin.000001 | 256 | Gtid_list | 1 | 285 | [] |
| mysql-bin.000001 | 285 | Binlog_checkpoint | 1 | 328 | mysql-bin.000001 |
+------------------+-----+-------------------+-----------+-------------+------------------------------------------------+
3 rows in set (0.001 sec)
(4)指定二进制事件的起止位置进行数据恢复
mysqlbinlog --start-position [起始值] --stop-position [终止值] erjinzhi.000001 | mysql -
uroot -p123
相关日志操作
- 查看系统中的日志相关的参数,有:general_log, bin_log, relay_log, slow_query_log
- relay_log用于主从同步时从主上同步过来的日志,存储格式是二进制的,但没有开关,需要时用即可
(1)开启通用查询日志(gennral_log)
vim /etc/my.cnf.d/mariadb-server.cnfgeneral_log=on #指定通用日志文件名,默认在数据文件位置、名字为:主机名.log
general_log_file=/var/lib/mysql/general.log systemctl restart mariadb
重启服务后,在/var/lib/mysql目录下会创建一个general.log日志记录操作信息
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# ls
@65b0@5e93 db1 general.log ib_logfile0 mysql mysql-bin.state mysql_upgrade_info
aria_log.00000001 db10 ib_buffer_pool ibtmp1 mysql-bin.000001 mysql.sock performance_schema
aria_log_control db2 ibdata1 multi-master.info mysql-bin.index mysql_test#另开一个窗口操作数据库,这边可以实时监控
[root@localhost mysql]# tail -f general.log
/usr/libexec/mariadbd, Version: 10.5.22-MariaDB-log (MariaDB Server). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
250919 19:57:12 3 Connect root@localhost on using Socket3 Query select @@version_comment limit 1
250919 19:57:25 3 Query show databases
250919 19:57:40 3 Query SELECT DATABASE()3 Init DB db23 Query show databases3 Query show tables3 Field List paihangbang 3 Field List tzhong 3 Field List xinxi
250919 19:57:46 3 Query show tables
250919 19:57:54 3 Query select * from xinxi
(2)开启慢查询日志(slow_query_log)
vim /etc/my.cnf.d/mariadb-server.cnfslow_query_log=on #指定通用日志文件名,默认在数据文件位置、名字为:主机名-slow.log
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=3systemctl restart mariadb
数据库执行一个耗时较长的查询:
MariaDB [db2]> select sleep(4);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: db2+----------+
| sleep(4) |
+----------+
| 0 |
+----------+
1 row in set (4.016 sec)MariaDB [db2]> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 1 |
+---------------+-------+
1 row in set (0.001 sec)
注:一般找到执行较慢的sql语句,进行优化,建立索引;添加没有任何约束力的一般索引:create index...
MySQL异步复制集群
主从服务原理
从服务器:
- I/O thread:I/O线程,用于读写操作,即远程获取主服务上的二进制日志、并写到自己的中继日志中
- sql thread:sql线程,用于将中继日志的sql语句运行在自己的数据库里
- relay log:中继日志,连接master和slave,是同步的核心
主服务器:
- I/O thread:I/O线程,用于对接从服务器的IO线程
- binlog:二进制日志,记录主服务器上的操作记录
- 远程用户:用于在从服务器上获取主服务器的二进制日志
主从服务自动同步数据(单向)
- 第一次全量同步,主服务器打开日志权限,创建远程用户
- 从服务器start slave主动去主服务器拉取数据(因此主创建的远程用户至少要有拿二进制日志的权限),到中继日志里(IO线程)
- 从服务器把中继日志里的SQL运行在自己库里(sql线程)
- 之后,在主未改动时,两边的线程进入休眠状态
- 当主再次改动数据,存入二进制日志,并推送给从服务
主服务器(77.77)
安装mysql、启动服务
- dnf -y install mariadb mariadb-server
配置主配置文件
vim /etc/my.cnf.d/mariadb-server.cnflog-bin=mysql-binserver-id=1 #所有mysql服务的server-id不能相同
systemctl restart mariadb
创建用于同步的用户、并授权
MariaDB [(none)]> grant all on *.* to 'zhangwei'@'%' identified by '123';
Query OK, 0 rows affected (0.002 sec)
查看服务器日志文件及偏移量
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 503 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.000 sec)
从服务器(77.78)
安装mysql、启动服务
- dnf -y install mariadb mariadb-server
配置主配置文件
vim /etc/my.cnf.d/mariadb-server.cnfserver-id=2systemctl restart mariadb
设置同步
- mysql> change master to master_host='主服务器IP',master_user='同步用户',master_password='同步用户密码',master_log_file='二进制文件',master_log_pos=偏移量;
MariaDB [(none)]> change master to master_host='192.168.77.77',master_user='zhangwei',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=503;
Query OK, 0 rows affected (0.010 sec)
开启同步
- mysql> start slave;
- 或:
- mysql> start replica;
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.002 sec)
查看同步状态
注:若两个线程都是yes,证明主从同步配置成功
- mysql> show slave status\G;
- 或:
- mysql> show replica status\G;
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.77.77Master_User: zhangweiMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 503Relay_Log_File: mariadb-relay-bin.000002Relay_Log_Pos: 555Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes1 row in set (0.000 sec)
测试同步状态
原理
- 在主服务器内创建数据库、插入数据,在从服务器上可以查询到;
- 主从库间数据同步是单向的,即从上可以写入但不会同步到主;
(1)在主服务器(77.77)创建库、表,插入数据
MariaDB [(none)]> create database test_one;
Query OK, 1 row affected (0.001 sec)MariaDB [(none)]> use test_one
Database changed
MariaDB [test_one]> create table xinxi(-> id int,-> name varchar(20));
Query OK, 0 rows affected (0.008 sec)MariaDB [test_one]> insert into xinxi values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
Query OK, 3 rows affected (0.003 sec)
Records: 3 Duplicates: 0 Warnings: 0MariaDB [test_one]> select * from xinxi;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.001 sec)
(2)在从服务器(77.78)查看
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test_one |
+--------------------+
4 rows in set (0.001 sec)MariaDB [(none)]> use test_one;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
MariaDB [test_one]> show tables;
+--------------------+
| Tables_in_test_one |
+--------------------+
| xinxi |
+--------------------+
1 row in set (0.000 sec)MariaDB [test_one]> select * from xinxi;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+------+----------+
3 rows in set (0.000 sec)
注:
- mysql集群中,所有mysql服务的server-id不能相同
- 数据同步方向:单向,从上可以写入,但不会同步
- 主服务器重启生成一个二进制日志文件,从上也会同步