MySQL数据库基础(2)
八、mysql用户权限管理
MySQL数据库权限分类
Privilege | Context | Comment |
---|---|---|
Alter | Tables | To alter the table |
Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
Create | Databases,Tables,Indexes | To create new databases and tables |
Create routine | Databases | To use CREATE FUNCTION/PROCEDURE |
Create temporary tables | Databases | To use CREATE TEMPORARY TABLE |
Create view | Tables | To create new views |
Create user | Server Admin | To create new users |
Delete | Tables | To delete existing rows |
Drop | Databases,Tables | To drop databases, tables, and views |
Event | Server Admin | To create, alter, drop and execute events |
Execute | Functions,Procedures | To execute stored routines |
File | File access on server | To read and write files on the server |
Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
Index | Tables | To create or drop indexes |
Insert | Tables | To insert data into tables |
Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) |
Process | Server Admin | To view the plain text of currently executing queries |
Proxy | Server Admin | To make proxy user possible |
References | Databases,Tables | To have references on tables |
Reload | Server Admin | To reload or refresh tables, logs and privileges |
Replication client | Server Admin | To ask where the slave or master servers are |
Replication slave | Server Admin | To read binary log events from the master |
Select | Tables | To retrieve rows from table |
Show databases | Server Admin | To see all databases with SHOW DATABASES |
Show view | Tables | To see views with SHOW CREATE VIEW |
Shutdown | Server Admin | To shut down the server |
Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. |
Trigger | Tables | To use triggers |
Create tablespace | Server Admin | To create/alter/drop tablespaces |
Update | Tables | To update existing rows |
Usage | Server Admin | No privileges - allow connect only |
中文释义
在MySQL中,权限控制是通过Grant和Revoke命令来管理用户和角色的权限的。 - Alter:修改。允许用户修改数据库中的表结构。 - Alter routine:修改存储过程或函数。允许用户修改已创建的存储过程或函数。 - Create:创建。允许用户创建新的数据库对象,如表、视图、存储过程等。 - Create routine:创建存储过程或函数。允许用户创建新的存储过程或函数。 - Create temporary tables:创建临时表。允许用户创建临时表,这些表在会话结束时会自动删除。 - Create view:创建视图。允许用户创建新的视图。 - Create user:创建用户。允许用户创建新的数据库用户账户。 - Delete:删除。允许用户删除表中的数据。 - Drop:删除。允许用户删除数据库中的对象,如表、视图等。 - Event:事件。允许用户管理和修改事件调度器中的事件。 - Execute:执行。允许用户执行存储过程或函数。 - File:文件。允许用户访问数据库服务器的文件系统。 - Grant option:授予选项。允许用户将权限授予其他用户。 - Index:索引。允许用户在表上创建、修改或删除索引。 - Insert:插入。允许用户向表中插入数据。 - Lock tables:锁定表。允许用户锁定数据库中的表,以防止其他用户同时访问这些表。 - Process:进程。允许查看或杀死数据库服务器上的进程。 - Proxy:代理。允许用户作为代理登录,代表其他用户执行操作。 - References:引用。允许用户创建外键约束。 - Reload:重新加载。允许用户重新加载配置文件或刷新权限表。 - Replication client:复制客户端。允许用户从主服务器接收数据以进行复制。 - Replication slave:复制从机。允许用户作为数据复制的从服务器。 - Select:选择。允许用户查询表中的数据。 - Show databases:显示数据库。允许用户查看用的数据库列表。 - Show view:显示视图。允许用户查看数据库中的视图定义。 - Shutdown:关闭。允许用户关闭数据库服务器。 - Super:超级。允许用户所有的权限,并且可以不受限制地执行许多系统命令。 - Trigger:触发器。允许用户创建触发器,以在特定事件发生时自动执行代码。 - Create tablespace:创建表空间。允许用户创建新的表空间,用于存储数据库对象。 - Update:更新。允许用户更新表中的数据。 - Usage:使用。这个权限通常用于限制用户只能查看自己的权限,不能进行任何实际的数据库操作。
user_name | host_name | 说明 |
---|---|---|
zhx | 198.51.100.166 | zhx,只能从此ip连接 |
zhx | 198.51.100.% | zhx,从192.168.115子网中的任何主机 |
zhx | % | zhx,任何主机可连 |
创建远程管理用户
create user webuser@'192.168.115.%' identified by '123.com'; -- 只创建的用户默认具有USAGE权限! -- 更改密码 alter user jx@192.168.166.9 identified by '123'; -- 在mysql8之前的数据库,grant命令运行的时候,发现用户不存在,则隐式创建! grant all on *.* to 'root'@'192.168.115.130'; flush privileges;
创建远程web服务数据库的操作用户
grant all on jx.* to 'webuser'@'192.168.115.%' identified by '123.com'; flush privileges;
查看用户权限
show grants for 'testuser'@'192.168.115.%'; mysqld [mysql]> show grants for webuser@'192.168.115.%'; +--------------------------------------------------------------------------------------------------------------------+ | Grants for webuser@192.168.115.% | +--------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webuser'@'192.168.115.%' IDENTIFIED BY PASSWORD '*AC241830FFDDC8943AB31CBD47D758E79F7953EA' | +--------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)
删除用户权限
revoke all on 库.表 from 'username'@'ipaddress'; flush privileges;
案例
-- 删除用户的连接权限 revoke usage on *.* from 'username'@'ipaddress'; -- 无法直接删除,只能删除账户 drop user sluser@localhost;
九、mysql数据库备份
9.1 数据备份的重要性
备份的主要目的是灾难恢复。
在生产环境中,数据的安全性至关重要。
任何数据的丢失都可能产生严重的后果。
9.2 造成数据丢失的原因
程序错误
人为操作错误
运算错误
磁盘故障
灾难(如火灾、地震)和盗窃
9.2 备份需要考虑的问题
可以容忍丢失多长时间的数据;
恢复数据要在多长时间内完成;
恢复的时候是否需要持续提供服务;
恢复的对象,是整个库,多个表,还是单个库,单个表。
9.4 备份类型
1、根据是否需要数据库离线
冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
温备(warm backup):服务在线,但仅支持读请求,不允许写请求;
热备(hot backup):备份的同时,业务不受影响。
注意:
这种类型的备份,取决于业务的需求,而不是备份工具
MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
1.1、常用备份工具
商业工具
Navicat for MySQL
功能特点:它提供了直观的图形化界面,方便用户轻松地创建备份任务、设置备份计划以及恢复数据。支持多种备份类型,如完整备份、增量备份等,还能对备份文件进行加密和压缩,以确保数据的安全性和减小备份文件的大小。
适用场景:适用于各种规模的企业和开发团队,尤其是那些需要频繁进行数据库备份和恢复操作,且对操作的便捷性和可视化有较高要求的用户。
SQLyog Ultimate
功能特点:具有强大的备份和恢复功能,支持定时备份,可以按照设定的时间周期自动执行备份任务。同时,它还提供了数据同步功能,能够在不同的 MySQL 数据库之间进行数据同步,方便数据迁移和数据一致性维护。
适用场景:受 MySQL 开发者和数据库管理员的欢迎,常用于开发环境和生产环境中的数据库管理与备份工作,对于需要进行数据库版本控制和数据迁移的场景也非常实用。
开源工具
Percona XtraBackup
功能特点:它是一款开源的热备份工具,能够在不停止 MySQL 服务的情况下进行备份,支持对 InnoDB 和 XtraDB 存储引擎的备份和恢复,备份过程中不会阻塞数据库的正常读写操作,从而保证了业务的连续性。此外,它还提供了增量备份和部分备份功能,可有效减少备份时间和备份文件的大小。
适用场景:因其高效、灵活的特点,广泛应用于各种对业务连续性要求较高的生产环境,特别适合大型数据库和高并发应用场景下的备份需求 。
MyDumper
功能特点:是一款多线程的备份和恢复工具,能够充分利用系统资源,大大提高备份和恢复的速度。它支持将数据库备份为多个文件,便于在恢复时进行灵活的选择和操作,同时还可以对备份文件进行压缩,节省存储空间。
适用场景:适用于需要快速备份和恢复大型 MySQL 数据库的场景,如互联网公司的大规模数据存储和处理环境,以及对备份效率有较高要求的企业级应用。
2、根据要备份的数据集合的范围
完全备份:full backup,备份全部字符集(全部数据库),每次备份都会进行完全备份,会导致备份文件占用大量的磁盘空间,并且有大量的重复数据,只适合第一次备份,不常用。
差异备份: incremental backup,要先进行一次完全备份,每次差异备份都会备份上一次完全备份后的数据,可能会出现备份的重复数据,导致占用大量的磁盘空间;
增量备份:differential backup,要先执行一次完全备份,每一次增量备份的数据都是备份在上一次完全备份或者上一次增量备份后的数据,不会出现重复数据,也不会占用额外的磁盘空间
建议的恢复策略
完全+增量+二进制日志
完全+差异+二进制日志
3、根据备份数据或文件
物理备份:直接备份数据文件
优点:备份和恢复操作都比较简单,能够支持兼容的mysql版本;恢复速度快,属于文件系统级别的。
建议:不要假设备份一定可用,要测试 mysql>check tables;检测表是否可用。
逻辑备份: 备份表中的数据和代码
优点:恢复简单;备份的结果为ASCII文件,可以编辑;与存储引擎无关;可以通过网络备份和恢复;
缺点:备份或恢复都需要mysql服务器进程参与;备份结果占据更多的空间;浮点数可能会丢失精度;还原之后,缩影需要重建
9.5 常见的备份方法
1、物理冷备(完全备份)
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
2、专用备份工具mysqldump或mysqlhotcopy (完全备份,逻辑备份)
mysqldump常用的逻辑备份工具 (导出为sql脚本)
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份 (增量备份)
进行增量备份,需要刷新二进制日志
3、第三方工具备份
免费的MySQL热备份软件Percona XtraBackup(阿里云的工具:dts,支持热迁移)
9.6 备份案例
mysqldump工具
1、完整备份
所有数据库的备份
备份
mysqldump --all-databases -uroot > all.sql
恢复
mysql -uroot < all.sql
指定数据库的备份
备份
mysqldump --databases jx -uroot > jx.sql
恢复
mysql -uroot < jx.sql
指定数据表的备份
备份
mysqldump jx stu > jx.stu.sql
恢复
mysql -uroot jx< jx.sql
2、增量备份
二进制备份
配置过程
vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format="statement" systemctl restart mysqld
查看日志文件内容
##在数据库中查看日志文件及书写位置 show master status; ###### mysqlbinlog mysql-bin.000001 |less
二进制备份的恢复
模拟数据丢失流程
flush logs; ###刷新日志文件,产生新的日志文件 -- 创建数据表及插入数据 flush logs; -- 执行删除操作
数据恢复
基于位置
#基于开始位置 mysqlbinlog --start-position="245" mysql-bin.000003 | mysql -uroot #基于结束位置 mysqlbinlog --stop-position="632" mysql-bin.000003 | mysql -uroot #基于中间位置 mysqlbinlog --start-position="245" --stop-position="632" mysql-bin.000003 | mysql -uroot
基于时间
#基于开始时间 mysqlbinlog --start-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot #基于结束时间 mysqlbinlog --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot #基于中间时间 mysqlbinlog --start-datetime="2022-12-23 16:17:59" --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
XtraBackup 8.0.35-33 使用指南
简介
XtraBackup 8.0.35-33 是 Percona 提供的一个开源热备份工具,用于 MySQL 8.0 数据库的物理备份和恢复。它是 MySQL 企业级备份解决方案的重要组成部分。
安装
在基于 RPM 的系统上安装
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm sudo percona-release enable-only tools release sudo yum install percona-xtrabackup-80
在基于 Debian 的系统上安装
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb sudo percona-release enable-only tools release sudo apt-get update sudo apt-get install percona-xtrabackup-80
基本使用
1. 完整备份
xtrabackup --backup --target-dir=/path/to/backup --user=username --password=password
2. 准备备份(应用日志)
xtrabackup --prepare --target-dir=/path/to/backup
3. 恢复备份
xtrabackup --copy-back --target-dir=/path/to/backup
高级使用案例
案例1:增量备份
首先进行完整备份:
xtrabackup --backup --target-dir=/backups/full --user=root --password=yourpassword
进行第一次增量备份:
xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/full --user=root --password=yourpassword
进行第二次增量备份:
xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1 --user=root --password=yourpassword
准备完整备份:
xtrabackup --prepare --apply-log-only --target-dir=/backups/full
应用第一个增量备份:
xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1
应用第二个增量备份:
xtrabackup --prepare --target-dir=/backups/full --incremental-dir=/backups/inc2
案例2:压缩备份
xtrabackup --backup --compress --target-dir=/backups/compressed --user=root --password=yourpassword
解压并准备备份:
xtrabackup --decompress --target-dir=/backups/compressed xtrabackup --prepare --target-dir=/backups/compressed
案例3:并行备份和恢复
xtrabackup --backup --parallel=4 --target-dir=/backups/parallel --user=root --password=yourpassword
并行压缩:
xtrabackup --backup --compress --compress-threads=4 --parallel=4 --target-dir=/backups/parallel_compressed --user=root --password=yourpassword
案例4:加密备份
生成加密密钥:
openssl rand -base64 24 > /backups/encryption_key
创建加密备份:
xtrabackup --backup --target-dir=/backups/encrypted --encrypt=AES256 --encrypt-key-file=/backups/encryption_key --user=root --password=yourpassword
解密备份:
xtrabackup --decrypt=AES256 --encrypt-key-file=/backups/encryption_key --target-dir=/backups/encrypted
案例5:流式备份
备份到单个压缩文件:
xtrabackup --backup --stream=xbstream --user=root --password=yourpassword | gzip > /backups/backup.xbstream.gz
从流式备份恢复:
gunzip -c /backups/backup.xbstream.gz | xbstream -x -C /var/lib/mysql xtrabackup --prepare --target-dir=/var/lib/mysql
常用选项说明
选项 | 描述 |
---|---|
--backup | 执行备份操作 |
--prepare | 准备备份以进行恢复 |
--copy-back | 将备份复制回原始位置 |
--target-dir | 指定备份目标目录 |
--user | MySQL 用户名 |
--password | MySQL 密码 |
--host | MySQL 主机地址 |
--port | MySQL 端口 |
--parallel | 并行线程数 |
--compress | 启用压缩 |
--compress-threads | 压缩线程数 |
--encrypt | 加密算法 |
--encrypt-key-file | 加密密钥文件 |
--incremental-basedir | 增量备份的基础目录 |
--incremental-dir | 增量备份目录 |
--stream | 流式备份格式 (xbstream) |
注意事项
确保有足够的磁盘空间存放备份文件
备份期间数据库负载可能会增加
恢复前确保 MySQL 服务已停止
恢复后可能需要调整文件权限
定期测试备份的可用性
最佳实践
定期进行完整备份和增量备份
备份文件存储在不同于数据库服务器的位置
实施备份验证流程
记录备份和恢复过程
监控备份作业的状态和持续时间
通过以上指南,您可以充分利用 XtraBackup 8.0.35-33 的强大功能来保护您的 MySQL 数据。
MyDumper 详细使用指南
MyDumper 是一个高性能的 MySQL 逻辑备份工具,相比传统的 mysqldump 具有并行备份、快照一致性等优势。以下是 MyDumper 的详细使用方式和案例。
安装 MyDumper
Ubuntu/Debian 系统
sudo apt-get install mydumper
CentOS/RHEL 系统
sudo yum install mydumper
从源码编译
git clone https://github.com/mydumper/mydumper.git cd mydumper mkdir build cd build cmake .. make make install
基本使用
1. 完整备份数据库
mydumper -u [username] -p [password] -h [host] -P [port] -o /backup/directory
2. 恢复数据库
myloader -u [username] -p [password] -h [host] -P [port] -d /backup/directory
常用参数说明
参数 | 描述 | 示例 |
---|---|---|
-u | 用户名 | -u root |
-p | 密码 | -p secret |
-h | 主机地址 | -h 127.0.0.1 |
-P | 端口号 | -P 3306 |
-o | 输出目录 | -o /backups |
-d | 恢复时指定备份目录 | -d /backups |
-B | 指定备份的数据库 | -B db1,db2 |
-T | 指定备份的表 | -T db1.table1 |
-t | 线程数 | -t 8 |
-c | 压缩输出 | -c |
-v | 详细输出 | -v 3 |
-C | 压缩备份文件 | -C |
-e | 备份表结构 | -e |
-r | 分割表的行数 | -r 100000 |
-F | 按大小分割备份文件(MB) | -F 256 |
-s | 一致性快照 | -s |
使用案例
案例1:备份单个数据库
mydumper -u root -p password -h localhost -B mydatabase -o /backups/mydatabase
案例2:备份多个特定表
mydumper -u root -p password -h localhost -T db1.table1,db1.table2 -o /backups/tables
案例3:多线程备份(8个线程)
mydumper -u root -p password -h localhost -t 8 -o /backups/full
案例4:压缩备份
mydumper -u root -p password -h localhost -c -o /backups/compressed
案例5:按100万行分割表数据
mydumper -u root -p password -h localhost -r 1000000 -o /backups/split
案例6:备份数据库结构(不备份数据)
mydumper -u root -p password -h localhost -e -o /backups/schema
案例7:恢复数据库到不同名称
myloader -u root -p password -h localhost -d /backups/full -B new_db_name
案例8:只恢复特定表
myloader -u root -p password -h localhost -d /backups/full -T db1.table1
高级功能
1. 一致性快照备份
mydumper -u root -p password -h localhost -s -o /backups/snapshot
2. 正则表达式过滤表
mydumper -u root -p password -h localhost -x '^sakila\.(actor|film)' -o /backups/regex
3. 备份时排除某些表
mydumper -u root -p password -h localhost -B sakila -X '^sakila\.film_text' -o /backups/exclude
4. 长查询超时设置
mydumper -u root -p password -h localhost --long-query-retries=10 --long-query-retry-interval=30 -o /backups/timeout
5. 只备份数据不备份结构
mydumper -u root -p password -h localhost --no-schemas -o /backups/data_only
实际应用场景
场景1:生产环境每日备份
# 备份脚本 #!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backups/mysql/$DATE" LOG_FILE="/var/log/mydumper_${DATE}.log" mydumper -u backup_user -p backup_pass -h 10.0.0.1 -P 3306 -t 4 -c -v 3 -o $BACKUP_DIR > $LOG_FILE 2>&1 # 保留7天备份 find /backups/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:大数据表部分恢复
# 只恢复用户表的前100万条数据 myloader -u root -p password -h localhost -d /backups/full -T db.users --rows=1000000
场景3:跨服务器迁移数据库
# 源服务器 mydumper -u root -p password -h source_host -B db_to_migrate -c -o /tmp/db_backup # 目标服务器 myloader -u root -p password -h target_host -d /tmp/db_backup
注意事项
确保备份用户有足够的权限(至少需要 SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT 权限)
大数据库备份时考虑磁盘空间
备份期间可能会对生产数据库性能产生影响
恢复前最好在测试环境验证备份文件
考虑使用--no-locks选项减少锁表时间(但可能影响一致性)
性能优化建议
根据服务器CPU核心数设置适当的线程数(-t)
对大表使用-r参数分割备份文件
使用-c或-C参数压缩备份减少存储空间
考虑使用--no-locks选项减少锁表时间(如果允许不一致)
对于InnoDB表,使用-s参数获取一致性快照
通过合理配置MyDumper,您可以高效地完成MySQL数据库的备份和恢复工作,满足各种业务场景的需求。
mysqlhotcopy 使用指南
mysqlhotcopy 是 MySQL 提供的一个 Perl 脚本工具,用于快速备份 MyISAM 和 ARCHIVE 表。它通过直接复制数据库文件来实现快速备份,比逻辑备份工具如 mysqldump 更快,但只适用于特定存储引擎。
安装与准备
mysqlhotcopy 通常随 MySQL 客户端一起安装,位于 MySQL 的 bin 目录下。
检查是否安装
which mysqlhotcopy
确保依赖安装(Perl 模块)
sudo apt-get install perl-dbi perl-dbd-mysql # Debian/Ubuntu sudo yum install perl-DBI perl-DBD-Mysql # CentOS/RHEL
基本语法
mysqlhotcopy [options] db_name [/path/to/backup/directory]
常用选项
选项 | 描述 |
---|---|
--user= | MySQL 用户名 |
--password= | MySQL 密码 |
--host= | MySQL 主机 |
--port= | MySQL 端口 |
--socket= | MySQL socket 文件 |
--regexp= | 使用正则表达式匹配数据库 |
--allowold | 不覆盖现有备份,添加 _old 后缀 |
--keepold | 不删除被覆盖的备份 |
--noindices | 不备份索引文件 |
--method= | 复制方法 (cp 或 scp) |
--flushlog | 备份后刷新日志 |
--resetmaster | 备份后重置二进制日志 |
--resetslave | 备份后重置从库信息 |
--addtodest | 添加而不是替换目标目录 |
--dryrun | 模拟执行,不实际复制 |
使用案例
案例1:备份单个数据库
mysqlhotcopy --user=root --password=yourpassword mydatabase /backup/mysql
案例2:备份多个数据库
mysqlhotcopy --user=root --password=yourpassword db1 db2 db3 /backup/mysql
案例3:使用正则表达式备份匹配的数据库
mysqlhotcopy --user=root --password=yourpassword --regexp='^test_' /backup/mysql
案例4:保留旧备份
mysqlhotcopy --user=root --password=yourpassword --allowold --keepold mydatabase /backup/mysql
案例5:远程备份到其他服务器
mysqlhotcopy --user=root --password=yourpassword --method=scp mydatabase user@remotehost:/remote/backup/dir
案例6:不备份索引文件
mysqlhotcopy --user=root --password=yourpassword --noindices mydatabase /backup/mysql
案例7:备份后刷新日志
mysqlhotcopy --user=root --password=yourpassword --flushlog mydatabase /backup/mysql
案例8:模拟运行(不实际备份)
mysqlhotcopy --user=root --password=yourpassword --dryrun mydatabase /backup/mysql
实际应用场景
场景1:生产环境每日备份脚本
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/mysql/$DATE" LOG_FILE="/var/log/mysqlhotcopy_${DATE}.log" # 确保备份目录存在 mkdir -p $BACKUP_DIR # 备份所有数据库 mysqlhotcopy --user=backup_user --password=backup_pass \--allowold --keepold \--flushlog \--regexp='.*' \$BACKUP_DIR > $LOG_FILE 2>&1 # 删除7天前的备份 find /backup/mysql/ -type d -mtime +7 -exec rm -rf {} \;
场景2:备份特定表
# 备份 mydatabase 中的 table1 和 table2 mysqlhotcopy --user=root --password=yourpassword \mydatabase.table1 mydatabase.table2 \/backup/mysql
场景3:增量备份策略
#!/bin/bash DATE=$(date +%Y%m%d) FULL_BACKUP_DIR="/backup/mysql/full" INC_BACKUP_DIR="/backup/mysql/inc_$DATE" # 每周日做完整备份 if [ $(date +%u) -eq 7 ]; thenmysqlhotcopy --user=backup_user --password=backup_pass \--allowold --keepold \--flushlog \--regexp='.*' \$FULL_BACKUP_DIR else# 其他日子做增量备份mysqlhotcopy --user=backup_user --password=backup_pass \--addtodest \--regexp='.*' \$INC_BACKUP_DIR fi
恢复数据库
mysqlhotcopy 的恢复是通过直接复制文件回原始位置实现的:
停止 MySQL 服务
systemctl stop mysql
复制备份文件到 MySQL 数据目录
cp -R /backup/mysql/mydatabase /var/lib/mysql/
确保文件权限正确
chown -R mysql:mysql /var/lib/mysql/mydatabase
启动 MySQL 服务
systemctl start mysql
注意事项
存储引擎限制:mysqlhotcopy 只适用于 MyISAM 和 ARCHIVE 表,不适用于 InnoDB
锁表:mysqlhotcopy 在备份期间会锁定表,可能导致应用程序短暂阻塞
备份一致性:对于正在写入的表,备份可能不一致
权限要求:
执行用户需要有读取数据库文件的权限
MySQL 用户需要 SELECT、RELOAD、LOCK TABLES 权限
备份完整性:备份后建议验证备份文件的完整性
版本兼容性:确保备份和恢复使用相同版本的 MySQL
性能优化建议
在低峰期执行备份操作
对于大型数据库,考虑分批备份
使用
--noindices
选项可以加快备份速度(但恢复时需要重建索引)考虑使用
--method=scp
直接备份到远程服务器,减少本地磁盘IO对于频繁更新的表,考虑结合 FLUSH TABLES 命令确保数据一致性
替代方案
由于 mysqlhotcopy 的局限性,现代 MySQL 环境通常使用以下替代方案:
对于 InnoDB 表:使用 Percona XtraBackup
逻辑备份:使用 mysqldump 或 mydumper
文件系统快照:LVM 快照或存储设备快照功能
mysqlhotcopy 最适合用于 MyISAM 表的快速备份场景,特别是当数据库大小适中且可以接受短暂锁表的情况下。
附录 A mysqld配置文件
# mysqld配置文件 # ----------------- 客户端配置 ----------------- [client] port = 3306 # 客户端连接数据库的端口,默认为3306 socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock # ----------------- MySQL客户端工具配置 ----------------- [mysql] default-character-set=utf8mb4 # 客户端连接数据库时的默认字符集,这里使用utf8mb4 # ----------------- 服务器配置 ----------------- [mysqld] user = mysql # 运行数据库服务器的系统用户,默认为mysql port = 3306 # 服务器监听的端口,默认为3306 socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock pid-file = /var/lib/mysql/mysql.pid # 服务器进程ID保存的文件路径,默认为/var/lib/mysql/mysql.pid bind-address = 127.0.0.1 # 服务器绑定的IP地址,默认为本地回环地址 # ----------------- 日志配置 ----------------- log-error = /var/log/mysql/error.log # 错误日志文件路径,默认为/var/log/mysql/error.log slow-query-log = 1 # 是否启用慢查询日志,1表示启用,0表示禁用,默认为禁用 slow-query-log-file = /var/log/mysql/slow.log # 慢查询日志文件路径,默认为/var/log/mysql/slow.log # ----------------- 缓存配置 ----------------- query_cache_type = 1 # 查询缓存类型,1表示启用,0表示禁用,默认为禁用 query_cache_size = 32M # 查询缓存大小,默认为32M query_cache_limit = 2M # 查询缓存单个查询的最大缓存大小,默认为2M # ----------------- 字符集配置 ----------------- character-set-server = utf8mb4 # 服务器使用的字符集,默认为utf8mb4 collation-server = utf8mb4_unicode_ci # 服务器使用的字符集排序规则,默认为utf8mb4_unicode_ci # ----------------- 默认存储引擎 ----------------- default-storage-engine = InnoDB # 默认使用的存储引擎,默认为InnoDB # ----------------- InnoDB配置 ----------------- innodb_buffer_pool_size = 256M # InnoDB缓冲池大小,默认为256M innodb_flush_log_at_trx_commit = 2 # 日志刷新策略,2表示每秒刷新,默认为每次事务提交刷新 innodb_log_buffer_size = 8M # InnoDB日志缓冲区大小,默认为8M innodb_file_per_table = 1 # 是否为每个InnoDB表使用单独的表空间,1表示启用,0表示禁用,默认为启用 innodb_open_files = 400 # InnoDB打开的文件数量,默认为400 # ----------------- 网络和连接配置 ----------------- max_connections = 1000 # 最大并发连接数,默认为1000 max_allowed_packet = 16M # 允许的最大数据包大小,默认为16M skip_external_locking = 1 # 是否禁用外部锁定,默认为是 # ----------------- 安全性配置 ----------------- secure-file-priv = /var/lib/mysql-files # 加载数据文件的安全目录,默认为/var/lib/mysql-files sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 服务器的SQL模式,默认为NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
附录 B mysql常见内置函数
一、字符串函数
-- ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL SELECT ASCII("dd");-- 100 SELECT ASCII("dc");-- 100-- CONCAT(str1,str2,...):返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式 select CONCAT('My', 'S', 'QL'); -- MySQL select CONCAT('My', NULL, 'QL'); -- NULL select CONCAT(14.3); -- 14.3-- LENGTH(str):返回字符串str的字节长度 select LENGTH('text'); -- 4 select LENGTH('字符串');-- 9-- CHAR_LENGTH(str):用于获取字符串长度 select CHAR_LENGTH('text'); -- 4 select CHAR_LENGTH('字符串');-- 3-- LOCATE(substr,str):返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0 select LOCATE('bar', 'foobarbar'); -- 4 select LOCATE('xbar', 'foobar'); -- 0-- INSTR(str,substr):返回子串substr在字符串str中的第一个出现的位置 select INSTR('foobarbar', 'bar'); -- 4 select INSTR('xbar', 'foobar'); -- 0-- LEFT(str,len)/RIGHT(str,len):返回字符串str的最左/右面len个字符 select LEFT('foobarbar', 5); -- fooba select RIGHT('foobarbar', 4); -- rbar-- SUBSTRING(str,pos):从字符串str的起始位置pos返回一个子串 select SUBSTRING('foobarbar',5);-- arbar-- TRIM(str):返回字符串str,所有前缀或后缀被删除了 select TRIM(' xbar ');-- xbar-- LTRIM(str)/RTRIM(str):返回删除了其前/后置空格字符的字符串str。 select LTRIM(' xbar');-- xbar select RTRIM('xbar ');--xbar-- REPLACE(str,from_str,to_str):返回字符串str,其字符串from_str的所有出现由字符串to_str代替 select REPLACE('xbar', 'x', 'bar');-- barbar-- REPEAT(str,count):返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL select REPEAT('bar', 3);-- barbarbar-- REVERSE(str):返回颠倒字符顺序的字符串str。 select REVERSE('bar');-- rab-- INSERT(str,pos,len,newstr):返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr代替。 select INSERT(whatareyou', 5, 3, is');-- whatisyou-- strcmp(str1,str2):用于比较两个字符串的大小。左大于右时返回1,左等于右时返回0,,左小于于右时返回-1 SELECT strcmp('ab','ac');-- -1-- 大写:upper(x),ucase(x);小写lower(x),lcase(x):字母大小写转换函数; SELECT UPPER("abc");-- ABC SELECT UCASE("abc");-- ABC SELECT LOWER("ABC");-- abc SELECT LCASE("ABC");-- abc-- find_in_set(str1,str2):返回字符串str1在str2中的位置,str2包含若干个以逗号分隔的字符串(可以把str2看出一个列表,元素是多个字符串,查找结果是str1在str2这个列表中的索引位置,从1开始) SELECT FIND_IN_SET('abc','123,456,abc');-- 3-- field(str,str1,str2,str3…):与find_in_set类似,但str2由一个类似列表的字符串变成了多个字符串,返回str在str1,str2,str3…中的位置。 SELECT FIELD('abc','123','456','abc');-- 3-- elt(index,str1,str2,str3…):获取指定位置的字符串 SELECT elt(3,'123','456','abc');-- abc
二、日期时间函数
-- curdate()/current_date():获取当前日期 SELECT curdate();-- 2018-08-09 SELECT current_date();-- 2018-08-09-- curtime()/current_time():获取当前时间 SELECT curtime();-- 15:38:54 SELECT current_time();-- 15:38:54-- now():获取当前日期时间 select now();-- 2018-08-09 15:40:09-- month(date),monthname(date):获取日期月份 SELECT MONTH (now());-- 8 SELECT monthname(now());-- August-- week(date):获取日期周数 select week(now());-- 31-- year(date):获取日期年数 select year(now());-- 2018-- hour(time):获取时间时刻 select hour(now());-- 15-- minute(time):获取时间分钟数 select minute(now());-- 47-- DAYOFWEEK(date)/DAYNAME(date)/WEEKDAY(date):获取时间星期数 select DAYOFWEEK(NOW());-- 5 select DAYNAME(now());-- Thursday select WEEKDAY(now());-- 3-- DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type):进行日期增加/减少的操作,可以精确到秒 SELECT '2018-08-09'+INTERVAL 1 DAY;-- 2018-08-10 SELECT '2018-08-09'-INTERVAL 1 SECOND;-- 2018-08-08 23:59:59 SELECT DATE_ADD('2018-08-08 23:59:59',INTERVAL 1 SECOND);-- 2018-08-09 00:00:00 SELECT DATE_SUB('2018-08-09 00:01:01',INTERVAL '1:1' MINUTE_SECOND);-- 2018-08-09 00:00:00-- date_format('time','format')/time_format(time,format):日期时间转换为字符串 select date_format(now(), '%Y%m%d%H%i%s');-- 20180809160315 select time_format(now(),'%H:%i:%s');--16:03:15-- str_to_date(str, format):字符串转换为日期 select str_to_date('08.09.2018 16:06:30', '%m.%d.%Y %H:%i:%s');-- 2018-08-09 16:06:30-- makdedate(year,dayofyear)/maketime(hour,minute,second):拼凑日期、时间函数 select makedate(2001,31); -- '2001-01-31' select makedate(2001,32); -- '2001-02-01' select maketime(12,15,30); -- '12:15:30'-- unix_timestamp()/unix_timestamp(date)/from_unixtime(unix_timestamp)/from_unixtime(unix_timestamp,format):Unix 时间戳、日期转换函数 select unix_timestamp(); -- 1533802315 select unix_timestamp(now());-- 1533802315 select from_unixtime(1533802315); -- 2018-08-09 16:11:55 select from_unixtime(1533802315, '%Y%m%d%H%i%s'); -- 20180809161155
三、数学函数
-- ABS(X):返回X的绝对值 select ABS(-32);-- 32-- MOD(N,M)或%:返回N被M除的余数 select MOD(15,7);-- 1 select 15 % 7; -- 1-- FLOOR(X):返回不大于X的最大整数值 select FLOOR(1.23); -- 2 select FLOOR(-1.23); -- -2-- CEILING(X)/ceil(x):返回不小于X的最小整数值 select CEILING(1.23);-- 2 select CEILING(-1.23); -- -1-- ROUND(X) :返回参数X的四舍五入的一个整数。 select ROUND(1.58); -- 2 select ROUND(-1.58); -- -2-- round(x,y):返回数值x带有y为小数结果的数值(四舍五入) SELECT round(3.1415926,2);-- 3.14-- rand():返回随机数 select rand();-- 0.5911854436538978-- truncate(x,y):返回数值x截取y位小数的结果(不四舍五入) select truncate(3.1415926,4);-- 3.1415
四、逻辑函数
-- CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END:在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。 SELECTCASE 1 WHEN 1 THEN2 ELSE3 END;-- 2-- IF(expr1,expr2,expr3):如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定 SELECT IF(1>2,2,3);-- 3-- STRCMP(expr1,expr2):如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1 select STRCMP('text', 'text2');-- -1-- SELECT IFNULL(expr1,expr2):如果expr1为空则返回expr2否则返回expr1 SELECT IFNULL(1,2);-- 2
五、加密函数
-- MD5(str):函数可以对字符串str进行加密。MD5(str)函数主要对普通的数据进行加密。下面使用MD5(str)函数为字符串“abcd”加密 SELECT MD5('abcd');-- e2fc714c4727ee9395f324cd2e7f331f-- ENCODE(str,pswd_str):函数可以使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。 SELECT ENCODE("abcd","evan");-- DECODE(crypt_str,pswd_str)函数可以使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密时的字符串pswd_str是相同的。下面使用DECODE(crypt_str,pswd_str)为ENCODE(str,pswd_str)加密的数据解密。 SELECT DECODE(ENCODE("abcd","evan"),"evan");