MYSQL开发-数据迁移、备份、恢复及日常维护(含mysqldump、xtrabackup工具的使用)

MYSQL开发-数据迁移、备份、恢复及日常维护(含mysqldump、xtrabackup工具的使用)

1. 字符集介绍

字符集是一套文字符号及其编码、比较规则的集合。第一个字符集是ASCII。字符集(Charset)定义mysql数据字符串的存储方式,校对规则(collation)定义比较字符串的方式。

常用字符集 长度 备注
GBK 2 非国际标准,若只需要支持中文,且数据量巨大,性能要求较高,可以使用GBK(定长,每个汉字和英文都占2个字节。)
UTF-8 3 中英文混合,国际标准,常定义该字符集
latin1 1 MYSQL默认字符集
utf8mb4 4 UTF-8 Unicode,适用于移动互联网业务

查看所有的字符集:

[root@server ~]# mysql -uroot -pAbong123. -e "show character set\G;"

在这里插入图片描述
查看常用的字符集:

[root@server ~]# mysql -uroot -pAbong123. -e "show character set\G;" | egrep "gbk|utf8|latin1"

在这里插入图片描述
查看mysql当前的字符集设置:

[root@server ~]# mysql -uroot -pAbong123. -e "show variables like 'character_set%';"

在这里插入图片描述
修改mysql的字符集设置:

[root@server ~]# vim /etc/my.cnf
[mysqld]
character_set_server=utf8

在这里插入图片描述

2. 数据库迁移解决原数据乱码问题

创建测试数据:

-- 创建book数据库,并导入字符集是latin1的sql文件。
[root@server ~]# mysql -uroot -pAbong123.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.07 sec)

mysql> create database book;
Query OK, 1 row affected (0.02 sec)

mysql> use book;
Database changed

-- 加载sql数据文件
mysql> source /root/book_latin1.sql

mysql> show tables;
+----------------+
| Tables_in_book |
+----------------+
| books          |
| category       |
+----------------+
2 rows in set (0.00 sec)

-- 查看数据表books的数据,可以看到有两列是乱码的。
mysql> select * from books\G;

在这里插入图片描述
使用mysqldump命令导出latin1字符集的数据库,并手动修改字符集为utf8:

-- 备份表结构,不含实际数据。
[root@server ~]# mysqldump -uroot -pAbong123. --default-character-set=latin1 -d book > /root/bookdata.sql

-- 备份表数据,即实际数据。
-- 源数据是以latin1字符集写入的,故导出的时候也以latin1字符集导出,故显示是正常的。
[root@server ~]# mysqldump -uroot -pAbong123. --quick --no-create-info --extended-insert --default-character-set=latin1 book > book_tabledata.sql
========================================
--quick    用于转储大的表,强制mysqldump从服务器一次一行的取数据,并输出当前cache到内存中。
--no-create-info     不写入表结构信息
--extended-insert    一个表使用一个insert多个values值,这样文件更小,I/O也更小,导入较快。
--default-character-set    指定字符集
========================================

-- 修改sql文件的字符集为utf8,这里表结构有两个数据表,故要修改两个地方。
[root@server ~]# vim bookdata.sql 
CHARSET=utf8;
-- 修改表数据的字符集为utf8
[root@server ~]# vim book_tabledata.sql 

-- 可以使用以下命令批量修改为utf8
:%s/latin1/utf8/g

-- 这样就会有两个需要导入的文件:
①表结构文件,字符集为utf8
②表数据文件,数据正常,字符集也为utf8

重新创建数据库,并导入表结构和表数据:

-- 在创建数据库的时候指定字符集为utf8
[root@server ~]# mysql -uroot -pAbong123.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| book               |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.01 sec)

mysql> drop database book;
Query OK, 2 rows affected (0.06 sec)

mysql> create database book default charset utf8;
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye
-- 先导入表结构,再导入表数据
[root@server ~]# mysql -uroot -pAbong123. book < bookdata.sql
[root@server ~]# mysql -uroot -pAbong123. book < book_tabledata.sql

可以看到,数据已经恢复正常了。
在这里插入图片描述
字符集为latin1的数据,长度为1,故可以修改字符集为utf8,长度为3。反之可能会丢失部分不支持的数据。

3. mysqlcheck客户端维护工具

mysqlcheck客户端工具集成了mysql工具中checkrepairanalyzetmpimize等功能。仅对存储引擎为myisam有效。
mysql5.7默认存储引擎是InnoDB

-- 查看有哪些存储引擎
mysql> show engines\G;

-- 查看当前默认存储引擎
mysql> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.07 sec)

-- 查看某个表的存储引擎
mysql> show create table dept\G;
*************************** 1. row ***************************
       Table: dept
Create Table: CREATE TABLE `dept` (
  `id` int(11) NOT NULL,
  `dname` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

==或者==

mysql> show table status like 'dept'\G;
*************************** 1. row ***************************
           Name: dept
         Engine: InnoDB
         
-- 修改某个表的存储引擎,这种方法不适用存在外键关系的表。
-- 第二种方法:导出sql文件,然后手动更改存储引擎,再导入进去。直接覆盖。
-- 第三种方法:创建一个指定存储引擎的新表,然后把数据导进去。
mysql> alter table student engine=myisam;

-- 修改当前默认存储引擎,不影响已经创建的数据库表。
修改my.cnf文件
[root@server ~]# vim /etc/my.cnf
[mysqld]
default-storage-engine=MyISAM
[root@server ~]# systemctl restart mysqld

在这里插入图片描述
在这里插入图片描述

-- 客户端自带工具
[root@server ~]# which mysqlcheck
/usr/bin/mysqlcheck
[root@server ~]# rpm -qf `which mysqlcheck`
mysql-community-client-5.7.31-1.el7.x86_64
参数 作用
-c 检查表,check
-r 修复表,repair
-a 分析表,analyze
-o 优化表,tmpimize
-u 指定操作的mysql用户
-p mysql用户的密码
- -database 指定数据库

以下语句所涉及的数据库或表的存储引擎都是MyISAM

-- 检查某个数据库的某个表
[root@server ~]# mysqlcheck -uroot -pAbong123. -c haha dept

-- 修复某个数据库的某个表
[root@server ~]# mysqlcheck -uroot -pAbong123. -r haha dept
-- 检查某个数据库
[root@server ~]# mysqlcheck -uroot -pAbong123. -c haha

-- 修复某个数据库
[root@server ~]# mysqlcheck -uroot -pAbong123. -r haha

-- 优化某个数据库
[root@server ~]# mysqlcheck -uroot -pAbong123. -o haha

[root@server ~]# mysqlcheck -uroot -pAbong123. -r --databases haha

-- 修复所有的数据库
[root@server ~]# mysqlcheck -uroot -pAbong123. -A -r

-- 优化所有的数据库
[root@server ~]# mysqlcheck -uroot -pAbong123. -A -o

设置定时任务,每天凌晨2点修复和优化haha数据库。

[root@server ~]# crontab -e
0 2 * * * mysql -uroot -pAbong123. -r -o haha > /dev/null 2>&1 

4. mysql备份和恢复

4.1 mysql备份

按备份时对数据库的影响范围分类:
热备:对运行的数据库直接备份,对运行的数据库无影响。也称为在线备份。
冷备:在数据库停止后进行备份,也称为离线备份。
温备:对运行的数据库直接备份,但会对当前数据库的操作造成影响。【备份的时候,会对表数据加全局读锁以保证备份的一致性。】

按备份后的文件分类:
逻辑备份:备份后的文件内容是可读的,一般是说sql文本文件,内容是sql语句。如mysqldumpselect * into outfile,一般适用于数据库升级和迁移,恢复时间较长。
裸文件备份:拷贝数据库的物理文件,数据库可以处于运行状态(mysqlhotcopyibbackupxtrabackup工具),也可以处于停止状态,恢复时间较短。

按备份数据库的内容分类:
完全备份:对数据库完整的备份。
增量备份:在上一次完全备份的基础上,对更新的数据进行备份。
日志备份:二进制日志备份,主从复制。

4.2 mysqldump逻辑备份

mysqldump工具不适合数据量大的数据库。可支持MyISAMInnoDB存储引擎。可以在远程客户端上使用。

# 导出所有数据库
[root@server ~]# mysqldump -uroot -pAbong123. -A > all_database1.sql;
[root@server ~]# mysqldump -uroot -pAbong123. --all-databases > all_database2.sql;

# 导出某个数据库(表结构和表数据)
[root@server ~]# mysqldump -uroot -pAbong123. test > test.sql;

# 导出某张表(表结构+表数据)
[root@server ~]# mysqldump -uroot -pAbong123. test dept > dept.sql;

# 导出库的表结构
[root@server ~]# mysqldump -uroot -pAbong123. -d test > test_struct.sql; 

# 导出库的表数据
[root@server ~]# mysqldump -uroot -pAbong123. -t test > test_data.sql; 

# 导出数据库,并自动生成库的创建语句。
[root@server ~]# mysqldump -uroot -pAbong123. -B test > global_test.sql; 
# 导入所有数据库
[root@server ~]# mysql -uroot -pAbong123. < all_database1.sql;

# 导入某个数据库,需先创建test数据库
[root@server ~]# mysql -uroot -pAbong123. test < test.sql;

# ============================================================
# source导入
mysql> drop database test;
Query OK, 6 rows affected (0.09 sec)

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> source /opt/test.sql;
===========================================================

# 导入表
[root@server ~]# mysql -uroot -pAbong123. test dept < dept.sql

# 导入表结构,需先创建数据库
[root@server ~]# mysql -uroot -pAbong123. test < test_struct.sql; 

# 导入表数据,需先创建数据库
[root@server ~]# mysql -uroot -pAbong123. test < test_data.sql; 

在这里插入图片描述

数据库自动备份脚本:

[root@server ~]# vim auto_backup_mysql.sh
#!/bin/bash
export LANG=en_US.UTF-8
savedir=/database_backup/
cd "$savedir"
time=`date +%Y%m%d`
mysqldump -uroot -pAbong123. test > test-"$time".sql
[root@server ~]# chmod +x auto_backup_mysql.sh
[root@server ~]# mkdir /database_backup/
[root@server ~]# crontab -e
10 21 * * * bash /root/auto_backup_mysql.sh 2&>1 /dev/null
[root@server ~]# ls /database_backup/
test-20200916.sql

4.3. xtrabackup热备工具

xtrabackup热备工具主要由两部分组成:
xtrabackup:只能对InnoDB和XtraDB引擎表进行备份,不能备份MyISAM数据表。
innobackupex:封装了xtrabackup,并且可以备份MyISAM数据表。xtrabackup做备份时不能备份表结构、触发器等。结合xtrabackup可以实现全量备份。

# 下载依赖包
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
# 下载软件包xtrabackup,我这里用2.4.9版本。
wget https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.14/binary/redhat/7/x86_64/Percona-XtraBackup-8.0.14-r113f3d7-el7-x86_64-bundle.tar

[root@server ~]# ll libev-4.04-2.el6.x86_64.rpm
-rw-r--r--. 1 root root 38140 9月  17 10:13 libev-4.04-2.el6.x86_64.rpm
[root@server ~]# ll Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar 
-rw-r--r--. 1 root root 58941440 6月  19 14:17 Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar

# 安装依赖包
[root@server ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm

# 使用yum在线安装,要能联网,否则要下载所有的依赖包。
[root@server ~]# tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar
[root@server ~]# yum install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm -y

# 修改/etc/my.cnf文件
# xtrabackup是通过此文件中的数据目录进行备份的。
[root@server ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
[root@server ~]# systemctl restart mysqld

做备份的用户应该具有的权限:
对系统用户而言:
①在datadir数据目录上有读写执行的权限。
对数据库用户而言:
reloadlock tables 权限为了执行flush tables with read lock
replication client 为了获取binary log的位置
create tablespace 权限为了导入表,用于用户表级别的修复
super 权限在slave环境下,用来备份启动和关闭slave的线程

全量备份:

# xtrabackup工具的使用:
# innobackupex [--user|--password|-port|-socket|-host]

# 全量备份,拷贝datadir目录下的数据库目录,并生成一些记录备份信息的文件。
# 默认创建一个以当前时间戳命名的文件夹,用来存放备份。
[root@server ~]# innobackupex --user=root --password=Abong123. /tmp/mysql_backup

# 不以时间戳创建文件夹,而是自行创建指定目录用于存放备份。
[root@server ~]# innobackupex --user=root --password=Abong123. --no-timestamp /tmp/mysql_backup/backup1

# 全量备份,并记录全量备份日志
[root@server ~]# innobackupex --user=root --password=Abong123. /tmp/mysql_backup 2>> /tmp/mysql_backup/mysql_backup.log

# 还原备份
[root@server ~]# systemctl stop mysqld       # 还原备份前,必须停掉mysql服务
[root@server ~]# rm -rf /var/lib/mysql/*
[root@server ~]# innobackupex --copy-back /tmp/mysql_backup/2020-09-17_14-35-01    # 使用某一次全量备份进行恢复
[root@server ~]# ll /var/lib/mysql
总用量 77868
drwxr-x---. 2 root root     4096 9月  17 14:36 haha
-rw-r-----. 1 root root      551 9月  17 14:36 ib_buffer_pool
-rw-r-----. 1 root root 79691776 9月  17 14:36 ibdata1
drwxr-x---. 2 root root     4096 9月  17 14:36 mysql
drwxr-x---. 2 root root     8192 9月  17 14:36 performance_schema
drwxr-x---. 2 root root     8192 9月  17 14:36 sys
drwxr-x---. 2 root root     4096 9月  17 14:36 test
-rw-r-----. 1 root root      426 9月  17 14:36 xtrabackup_info
[root@server ~]# chown -R mysql:mysql /var/lib/mysql/     # 恢复后,所有者和所属组要修改为mysql
[root@server ~]# systemctl restart mysqld     # 最后重启服务,即完成了一次全量恢复。

增量备份:

# 增量备份可以减少备份数据的重复,通过innodb页上的LSN(log sequence number)实现。
# 只复制指定的LSN之后的数据。
# 首先全量备份
[root@server ~]# innobackupex --user=root --password=Abong123. /tmp/mysql_backup
[root@server ~]# ll /tmp/mysql_backup/
总用量 0
drwxr-x---. 6 root root 205 9月  19 09:06 2020-09-19_09-06-44
# =========对数据库操作,如在某个表插入数据========

# 然后增量备份【在哪个备份的基础上进行增量备份】
# /tmp/mysql_backup/ 指增量备份保存目录
# --incremental-basedir   全量备份
# --incremental-lsn       备份编号
[root@server ~]# innobackupex --user=root --password=Abong123. --incremental /tmp/mysql_backup/ --incremental-basedir=/tmp/mysql_backup/2020-09-19_09-06-44/

查看全量备份和第一次增量备份的LSN,可以看到是从0-2727496-2727672

[root@server ~]# cd /tmp/mysql_backup/
[root@server mysql_backup]# ll
总用量 0
drwxr-x---. 6 root root 205 9月  19 09:06 2020-09-19_09-06-44
drwxr-x---. 6 root root 231 9月  19 09:09 2020-09-19_09-09-18
[root@server mysql_backup]# cat ./2020-09-19_09-06-44/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2727496
last_lsn = 2727505
compact = 0
recover_binlog_info = 0
[root@server mysql_backup]# cat ./2020-09-19_09-09-18/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2727496
to_lsn = 2727672
last_lsn = 2727681
compact = 0
recover_binlog_info = 0

再对数据库进行操作,插入一些数据,然后再进行一次增量备份。查看下第二次增量备份的LSN,可以看到是从0-2727496-2727672-2727848。也就是可以根据各个备份的LSN号来追踪备份的先后顺序

[root@server ~]# innobackupex --user=root --password=Abong123. --incremental /tmp/mysql_backup/ --incremental-basedir=/tmp/mysql_backup/2020-09-19_09-09-18/
[root@server mysql_backup]# cat ./2020-09-19_09-13-05/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2727672
to_lsn = 2727848
last_lsn = 2727857
compact = 0
recover_binlog_info = 0

以下是进行增量备份后的还原操作:

# 删除mysql数据库的数据,勿在生产环境作此操作。
[root@server ~]# rm -rf /var/lib/mysql/*

# 还原备份
①停止mysql服务
[root@server ~]# systemctl stop mysqld
[root@server mysql_backup]# ll
总用量 0
drwxr-x---. 6 root root 205 9月  19 09:06 2020-09-19_09-06-44
drwxr-x---. 6 root root 231 9月  19 09:09 2020-09-19_09-09-18
drwxr-x---. 6 root root 231 9月  19 09:13 2020-09-19_09-13-05

②在所有备份(全量备份和增量备份)下重做已提交过的日志,可以看作是把增加的内容全部都整合到全量备份。
[root@server ~]# innobackupex --apply-log --redo-only /tmp/mysql_backup/2020-09-19_09-06-44    # 整合完全备份
[root@server ~]# innobackupex --apply-log --redo-only /tmp/mysql_backup/2020-09-19_09-06-44/ --incremental-dir=/tmp/mysql_backup/2020-09-19_09-09-18/    # 整合第一次增量备份到完全备份
[root@server ~]# innobackupex --apply-log /tmp/mysql_backup/2020-09-19_09-06-44/ --incremental-dir=/tmp/mysql_backup/2020-09-19_09-13-05/      # 整合第二次增量备份到完全备份,整合最后一次增量备份不用参数 --redo-only

③回滚未完成的日志,相当于舍弃这部分内容。
[root@server ~]# innobackupex --apply-log /tmp/mysql_backup/2020-09-19_09-06-44/
 
④到目前为止,增量的内容已经合并到全量,重做已提交的,回滚未提交的。也就是说目前的全量备份是最完整的。
# 要保证mysql数据目录/var/lib/mysql下是完全空的才可以恢复。
[root@server ~]# innobackupex --copy-back /tmp/mysql_backup/2020-09-19_09-06-44/   -- 使用全量备份进行还原
# 可以看到,数据目录已经恢复回来了。
[root@server ~]# cd /var/lib/mysql
[root@server mysql]# ll
总用量 122916
-rw-r-----. 1 root root      350 9月  19 09:53 ib_buffer_pool
-rw-r-----. 1 root root 12582912 9月  19 09:53 ibdata1
-rw-r-----. 1 root root 50331648 9月  19 09:53 ib_logfile0
-rw-r-----. 1 root root 50331648 9月  19 09:53 ib_logfile1
-rw-r-----. 1 root root 12582912 9月  19 09:53 ibtmp1
drwxr-x---. 2 root root     4096 9月  19 09:53 mysql
drwxr-x---. 2 root root     8192 9月  19 09:53 performance_schema
drwxr-x---. 2 root root     8192 9月  19 09:53 sys
drwxr-x---. 2 root root       58 9月  19 09:53 test
-rw-r-----. 1 root root      508 9月  19 09:53 xtrabackup_info

⑤修改datadir目录的所有者和所属组为mysql
[root@server ~]# chown -R mysql:mysql /var/lib/mysql

⑥重启mysql服务,可以看到mysql服务也可以正常启动。检查数据库表也是正常的。
[root@server ~]# systemctl restart mysqld
[root@server ~]# netstat -antup | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      22239/mysqld     

5. mysql体系结构介绍

mysql体系结构:包含连接池组件、管理服务和工具组件、sql接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件等。

插件式存储引擎:
①innodb存储引擎:支持事务,mysql5.5之后的默认存储引擎。应用于对事务的完整性有较高要求,在并发条件下要求数据的一致性,数据操作中包含增删改查等。相对于myisam存储引擎,写的效率略低一点,并且会占用更多的磁盘空间来存储数据和索引。【支持自动增长auto_increment、支持外键约束、支持两种存储方式(共享表空间存储、独占表空间存储)】

②myisam存储引擎:不支持事务和外键,是mysql5.5之前的默认存储引擎。每个myisam存储引擎的表都会生成3个文件(.frm存储表结构、.MYD存储数据、.MYI存储索引)。存储格式:静态表、动态表、压缩表。

6. mysql用户管理

-- 创建用户
-- 创建本地用户
create user 'test'@'localhost' identified by '123456';

-- 创建完要刷新系统权限表
flush privileges;
-- 创建远程用户,localhost不属于远程用户。
-- %可以换成具体IP地址或者网段
create user 'test'@'%' identified by '123456';

-- 创建完要刷新系统权限表
flush privileges;
-- 删除用户,即从mysql.user表中删除相关记录。
delete from mysql.user where user='root' and hostname='localhost';

-- 删除用户后要刷新系统权限表
flush privileges;
-- 用户授权
grant 权限 on 数据库.* to 用户名@登录主机 identified by '密码';

grant all privileges on test.* to 'root'@'localhost' identified by '123456';

-- 可通过user表查询可以授予什么权限
select host,user,password,priv_grant from mysql.user\G;

--授权后要刷新系统权限表
flush privileges;
-- 在/etc/my.cnf文件中[mysqld]下加入该语句,跳过密码验证
skip-grant-tables
具体使用可参考:[跳过密码验证](https://blog.csdn.net/weixin_36522099/article/details/108087938)

-- 重置mysql用户密码
-- authentication_string
-- password('654321') 
update user set authentication_string=password('654321') where user='root';

-- 重置密码后要刷新系统权限表
flush privileges;

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/108566232
今日推荐