请参考官方文档如何从Unix / Linux平台上的压缩tar文件二进制发行版中安装MySQL
请参考官方文档MySQL 5.7安全部署指南
1.下载解压版mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
官网解压版下载地址:https://downloads.mysql.com/archives/community/
2.安装先决条件
(1)安装必须以操作系统root用户身份执行 ,因为安装过程涉及创建用户,组,目录以及分配所有权和权限。已安装的MySQL二进制文件归操作系统 root用户所有。
(2)MySQL依赖libaio库。如果未在本地安装此库,则数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用适当的软件包管理器进行安装。例如,在基于Yum的系统上:
# search for info
yum search libaio
# install library
yum install libaio
(3)对于MySQL 5.7.19和更高版本:通用Linux版本中增加了对非统一内存访问(NUMA)的支持,该版本现在对libnuma库具有依赖性 。如果您的系统上尚未安装该库,请使用系统的程序包管理器搜索并安装它(有关某些示例命令,请参见前面的项目)。
(4)创建mysql用户和组。mysql用户拥有mysql数据目录。它还用于运行mysqld服务器进程,如systemd mysqld.service文件中所定义的(请参阅使用systemd启动服务器)。mysql用户对mysql数据目录中的任何内容都有读写权限。它不能登录MySQL。它只存在于所有权目的。该mysql组是数据库管理员组。该组中的用户具有对MySQL数据目录中任何内容的读写访问权限,并且可以对任何打包的MySQL二进制文件执行访问权限。
groupadd mysql
#/bin/false 无登录权限服务器主机选项创建一个用户。mysql仅出于所有权目的而不是登录目的才需要该用户。
useradd -r -g mysql -s /bin/false mysql
3.注意
(1)如果您以前使用操作系统本机软件包管理系统(例如Yum或APT)安装了MySQL,则在使用本机二进制文件安装时可能会遇到问题。确保以前的MySQL安装已完全删除(使用程序包管理系统),并且所有其他文件(例如数据文件的旧版本)也已删除。您还应该检查配置文件(例如/etc/my.cnf 或/etc/mysql目录)并删除它们。
(2)SLES 11:从MySQL 5.7.19开始,Linux Generic tarball软件包格式为EL6而不是EL5。副作用是,MySQL客户端 bin / mysql需要 libtinfo.so.5。一种解决方法是创建一个符号链接,例如在64位系统上创建ln -s libncurses.so.5.6 /lib64/libtinfo.so.5或在32位系统上创建ln -s libncurses.so.5.6 /lib/libtinfo.so.5位系统。
4.选择您想要解压发行版的目录,并将位置更改到其中。这里我们将发行版解压到/usr/local下。接下来,创建一个符号链接到由tar创建的安装目录。该ln命令建立到安装目录的符号链接。这使您可以更轻松地将其称为/usr/local/mysql。
cd /usr/local
tar -zvxf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
ln -s mysql-5.7.30-linux-glibc2.12-x86_64 mysql
5.配置服务器启动选项
(1)通过将选项放置在MySQL配置文件中,指定MySQL服务器在启动时应使用的选项。如果不这样做,服务器将使用其默认设置启动。
(2)创建MySQL配置文件,请以root身份发出以下命令:
cd /etc
touch my.cnf
chown root:root my.cnf
chmod 644 my.cnf
(3)在[mysqld]组条目下,为实例设置datadir、socket、port、log-error选项。如果主机上有其他MySQL安装,请确保这些选项的值对此实例是唯一的。此部署使用默认值。设置user选项以确保以非特权mysql用户帐户启动服务器 。出于安全原因,重要的是避免以操作系统root用户身份运行服务器。
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/usr/local/mysql/data/mysqld.log
6.初始化数据目录
安装MySQL之后,必须初始化数据目录,该目录包括mysql系统数据库及其表,包括授权表,服务器端帮助表和时区表。初始化还会创建 root@localhost超级用户帐户, InnoDB系统表空间以及管理InnoDB表所需的相关数据结构。
(1)将位置更改为MySQL安装的顶级目录,创建数据目录,并将所有权授予mysql用户。
cd /usr/local/mysql
mkdir data
chmod 750 data
chown mysql:mysql data
(2)注意
数据目录所有权已分配给mysql用户,但大多数mysql安装仍然由root用户拥有。其他例外是错误日志文件、mysql文件目录、pid文件和socket文件,mysql用户必须对这些文件具有写访问(write access)权限。mysql用户需要读取访问(read access)的文件和资源,包括配置文件(例如,/etc/my.cnf)和MySQL二进制文件(/usr/local/mysql/bin)。
(3)初始化数据目录。初始化输出将打印到错误日志(/usr/local/mysql/data/mysqld.log)上,并显示如下所示的输出。输出包括该root@localhost帐户的随机初始密码 。稍后在重置root@localhost密码时需要初始密码。
cd /usr/local/mysql
bin/mysqld --defaults-file=/etc/my.cnf --initialize
7.服务器和服务器启动程序
(1)mysqld_safe是在Unix上启动mysqld服务器的推荐方法。mysqld_safe添加了一些安全特性,例如在发生错误时重新启动服务器,并将运行时信息记录到错误日志中。若没有安装mysqld_safe,请参阅第2.5.10节"使用systemd管理MySQL服务器",这里省略。mysqld_safe读取选项文件中[mysqld]、[server]和[mysqld_safe]部分的所有选项。
(2)Unix和类Unix的系统上的MySQL发行版包含一个名为mysql.server的脚本,该脚本使用mysqld_safe启动MySQL服务器。它可以在使用System V风格运行目录来启动和停止系统服务的系统(例如Linux和Solaris)上使用。
(3)修改mysqld.server文件:
vim /xinfang/mysql/support-files/mysql.server
mysqld_pid_file_path=/usr/local/mysql/data/mysql.pid
8.要在服务器上自动启动和停止MySQL,必须在/etc/rc*文件的适当位置添加启动和停止命令:
#如果从源代码发行版安装MySQL或使用不会自动安装mysql.server的二进制发行版格式安装 ,则可以手动安装脚本。可以 support-files在MySQL安装目录下的目录中或MySQL源代码树中找到它。将脚本复制到/etc/init.d名称为mysql的目录并使其可执行:
cd /usr/local/mysql/support-files
cp mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
#安装脚本后,激活脚本以在系统启动时运行所需的命令取决于您的操作系统。在Linux上,您可以使用chkconfig:
chkconfig --add mysql
#在某些Linux系统上,似乎也需要以下命令才能完全启用mysql 脚本:
chkconfig --level 345 mysql on
#启动
service mysql start
#停止
service mysql stop
#重启
service mysql restart
#重载配置
service mysql reload
#查看状态
service mysql status
查看MySQL服务器进程、运行用户:ps -ef|grep mysql
9.重置MySQL root帐户密码,允许root账号远程访问
cd /usr/local/mysql
bin/mysql -u root -p
...
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
FLUSH PRIVILEGES;
10.关闭防火墙
(1)检查防火墙状态: systemctl status firewalld
(2)关闭防火墙:systemctl stop firewalld
设置开机禁用防火墙:systemctl disable firewalld.service
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysqldump /usr/bin
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
Expression #1 of ORDER BY clause is not in SELECT list, references column ‘zhxf_db_0524.org.create_time’ which is not in SELECT list
ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,也就是说查出来的列必须在group by后面出现否则就会报错,或者这个字段出现在聚合函数里面。
去掉ONLY_FULL_GROUP_BY,修改mysql配置文件my.cnf,添加下面内容
#设置模式
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
默认在lower_case_table_names=0的情况下,表名是严格区分大小写的,若查询时大小写弄混淆就会直接报错表不存在
修改mysql配置文件my.cnf,添加下面内容
lower_case_table_names = 1
(1)--single-transaction
通过在单个事务中转储(dump)所有表来创建一致的快照。仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB支持);
对于其他存储引擎,转储不能保证一致。在处理--single transaction dump时,为确保转储文件有效(表内容和二进制日志位置正确),
其他连接不应使用以下语句:ALTER table、DROP table、RENAME table、TRUNCATE table,因为一致快照不会与它们隔离。
选项自动关闭 --lock-table。
对于InnoDB表,可以使用mysqldump的--single transaction选项对表执行不带锁的在线备份。
(2)--opt
等同于与--add drop table、--add locks、--create options、--quick、--extended insert、--lock tables、
--set charset和--disable key。(默认情况下启用,使用--skip opt禁用。)
(3)--add-drop-table
在每次创建之前添加一个DROP表。(默认为开;使用--skip-add-drop-table来禁用。)
(4)-add-locks
在INSERT语句周围添加锁。(默认为开;使用--skip-add-locks来禁用。)
(5)--lock-all-tables
锁定所有数据库中的所有表。这是通过在整个转储期间获取全局读取锁来实现的。自动关闭--single-transaction和--lock-tables表。
(6)--lock-tables
锁定所有表以供读取。(默认为开;使用--skip-lock-tables来禁用。)
(7)--quick, -q
不缓冲查询,直接转储到标准输出。(默认为开;使用--skip quick禁用。)
(8)--extended-insert, -e
使用包含多个值列表的多行插入语法。(默认为开;使用--skip-extended-insert可禁用。)
(9)--skip-opt
禁用 --opt。禁用 --add-drop-table, --add-locks, --create-options,
--quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys.
(10)--port, -P
用于连接的端口号。
(11)--routines, -R
转储存储例程(函数和过程functions and procedures)。
(12)--host, -h
连接到主机。
(13)-p, --password[=name]
连接到服务器时使用的密码。
(14)--events, -E
导出事件
(15)--triggers
Dump triggers for each dumped table.(默认为开;使用--skip-triggers禁用。)
(16)--delete-master-logs
备份后删除master上的日志。这将自动启用--master-data。
(17)--master-data[=#]
这将导致二进制日志位置和文件名附加到输出中。如果等于1,则将其作为更改主控命令打印;如果等于2,则该命令将以注释符号作为前缀。
此选项将启用--lock all tables,除非也指定了--single transaction(在这种情况下,全局读锁只在转储开始时占用很短的时间)。
在所有情况下,对日志的任何操作都将在转储的确切时刻发生。选项自动关闭--lock tables
(18)-F, --flush-logs
在开始转储之前刷新服务器中的日志文件。请注意,如果一次转储多个数据库(使用选项--databases=或--all databases),
则将刷新转储的每个数据库的日志。例外情况是使用--lock all tables或--master data时:在这种情况下,日志只刷新一次,
对应于所有表被锁定的时刻。
因此,如果希望转储和日志刷新同时发生,应该使用--lock all tables或--master data with--flush logs
mysqldump -h10.210.36.25 -uroot -p --single-transaction -q -e -R --events zhxf_db > zhxf_db_0524.sql
如果有如下报错,应该是mysqldump版本问题,请自行百度
3.还原正式数据库至准生产数据库
登陆准生产数据库:
mysql -h10.210.36.223 -uroot -p
创建数据库:
CREATE DATABASE IF NOT EXISTS zhxf_db_0524 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
选择数据库:
use zhxf_db_0524;
执行还原:
source /usr/local/zhxf_db_0524.sql;
1.首先编写sh文件:比如/usr/local/mysql/data/backup/数据库名_backup.sh
#完成数据库备份的脚本
#备份路径
BACKUP=/usr/local/mysql/data/backup
#当前时间作为备份文件名
DATETIME=$(date +%Y%m%d)
#测试下时间是否正确
echo $DATETIME
echo "============开始备份数据库文件============="
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=密码xxx
#需要被备份的数据库名称
DATEBASE=zhxf_db
#如果备份文件夹不存在则创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行数据库备份语句
mysqldump -h$HOST -u$DB_USER -p$DB_PWD --single-transaction -q -e -R --events $DATEBASE | gzip > $BACKUP/$DATETIME/$DATEBASE_$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除备份目录下所有7天前带".tar.gz"的文件
find $BACKUP -mtime +7 -name "*.tar.gz" -exec rm -rf {} \;
echo "============备份数据库文件成功============="
2.为sh脚本文件添加执行权限,手动执行一次,会发现如下图报warning,但是不影响备份
chmod u+x zhxfdb_backup.sh
./zhxfdb_backup.sh
3.添加计划任务,执行命令crontab -e,添加以下内容
#每天晚上1点执行zhxf_db数据库全量备份
0 1 * * * /usr/local/mysql/data/backup/zhxfdb_backup.sh
1.完全恢复与时间点(增量)恢复
完全恢复从完全备份中恢复所有数据。这会将服务器实例恢复到进行备份时的状态。如果该状态不够最新,则可以在完全恢复之后恢复自完全备份以来所做的增量备份,以使服务器处于更最新的状态。
增量恢复是对给定时间范围内所做更改的恢复。这也称为时间点恢复,因为它使服务器的状态在给定的时间内处于当前状态。时间点恢复基于二进制日志,通常从备份文件进行完全恢复,将服务器恢复到备份时的状态。然后,将写入二进制日志文件的数据更改作为增量恢复应用,以重做数据修改,并将服务器带到所需的时间点。
2.使用二进制日志进行时间点恢复
(1)时间点恢复的信息源是在完全备份操作之后生成的二进制日志文件集。因此,要使服务器恢复到某个时间点,必须在其上启用二进制日志记录
#是否启用二进制日志记录
mysql > show variables like '%log_bin%';
修改mysql配置文件my.cnf,添加以下配置启用二进制日志记录。重启mysql报错,查看mysqld.log日志文件报错信息如下图:
[mysqld]
#启用二进制日志记录
log-bin = /usr/local/mysql/logs/mysql_bin
#服务器ID
server_id = 116
#如果写入二进制日志导致当前日志文件大小超过此变量的值,则服务器将旋转二进制日志(关闭当前文件并打开下一个日志文件)
max_binlog_size = 100M
cd /usr/local/mysql
mkdir logs
chmod 750 logs
chown mysql:mysql logs
启动mysql成功!
(2)要从二进制日志还原数据,必须知道当前二进制日志文件的名称和位置。默认情况下,服务器在数据目录中创建二进制日志文件,但是可以使用–log-bin选项将路径名指定 为将文件放置在其他位置。要查看所有二进制日志文件的列表,请使用以下语句:
mysql> SHOW BINARY LOGS;
要确定当前二进制日志文件的名称,请发出以下语句:
mysql> SHOW MASTER STATUS;
3.mysqld在二进制日志的基本名称后附加数字扩展名,以生成二进制日志文件的名称 。每次服务器创建新的日志文件时,该数目都会增加,从而创建了有序的文件系列。每次发生以下任何事件,服务器都会在系列中创建一个新文件:
4.二进制日志包含描述数据库更改(例如表创建操作或表数据更改)的"事件"。它还包含针对可能进行了更改的语句的事件(例如, DELETE不匹配任何行的a),除非使用基于行的日志记录。二进制日志还包含有关每个语句花费该更新数据多长时间的信息。二进制日志不用于诸如SELECT或 SHOW不修改数据的语句 。
5.mysqlbinlog-处理二进制日志文件的实用程序
服务器的二进制日志由包含"事件"的文件组成,这些事件描述了对数据库内容的修改。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 mysqlbinlog实用程序。
要显示名为的二进制日志文件的内容binlog.000003,请使用以下命令:
mysqlbinlog binlog.0000003
1.假设我们InnoDB在负载低时在周日下午1点使用以下命令对所有数据库中的所有表进行完整备份 :
shell> mysqldump --all-databases --master-data --single-transaction > xxxx.sql
mysqldump生成的.sql文件包含一组sql INSERT语句,可用于稍后重新加载转储的表。
此备份操作在转储开始时获取所有表的全局读锁(使用带读锁的刷新表using FLUSH TABLES WITH READ LOCK)。一旦获得了这个锁,就会读取二进制日志坐标并释放锁。如果在发出FLUSH语句时长更新语句正在运行,则备份操作可能会暂停,直到这些语句完成。之后,转储将成为无锁的,并且不会干扰表上的读写操作。
2.完整备份是必要的,但创建它们并不总是很方便。它们生成大量备份文件,并且需要时间来生成。它们不是最佳的,因为每个连续的完全备份都包括所有数据,即使是自上一次完全备份以来没有更改的部分。进行初始完全备份,然后进行增量备份,效率更高。增量备份更小,生成所需时间更少。折衷的办法是,在恢复时,不能仅通过重新加载完整备份来恢复数据。您还必须处理增量备份以恢复增量更改。
3.要进行增量备份,我们需要保存增量更改。在MySQL中,这些更改在二进制日志中表示,因此,应始终使用–log-bin启用该日志的选项启动MySQL服务器 。启用二进制日志记录后,服务器在更新数据时将每个数据更改写入文件。
4.每次重新启动时,MySQL服务器都会使用序列中的下一个数字创建一个新的二进制日志文件。在服务器运行时,您还可以通过发出FLUSH LOGSSQL 语句或使用mysqladmin flush-logs命令告诉它关闭当前的二进制日志文件并手动开始一个新的二进制日志文件 。 mysqldump也有一个刷新日志的选项。该.index数据目录文件中包含该目录下所有MySQL二进制日志的清单。
5.MySQL 二进制日志对于恢复很重要,因为它们构成了一组增量备份。如果您确保在进行完整备份时刷新日志,则随后创建的二进制日志文件将包含自备份以来所做的所有数据更改。让我们 稍微修改一下之前的mysqldump命令,使其在完全备份时刷新 MySQL 二进制日志,并且转储文件包含新的当前二进制日志的名称:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > xxx.sql
执行此命令后,数据目录包含一个新的二进制日志文件,mysql_bin.000009,因为该–flush-logs 选项会导致服务器刷新其日志。该 --master-data选项会导致 mysqldump将二进制日志信息写入其输出,因此生成的.sql转储文件包括以下几行:
cat xxx.sql | grep MASTER_LOG_FILE
因为mysqldump命令进行了完整备份,所以这些行意味着两件事:
6.在星期一的下午1点,我们可以通过刷新日志以创建新的二进制日志文件来创建增量备份。例如,执行mysqladmin -uroot -p flush-logs命令会创建mysql_bin.000010. 周日下午 1 点完整备份和周一下午 1 点之间的所有更改都在mysql_bin.000009文件中。此增量备份很重要,因此最好将其复制到安全位置。(例如,将其复制到另一台机器上。)在星期二下午1点,执行另一个mysqladmin -uroot -p flush-logs命令。星期一下午 1 点和星期二下午 1 点之间的所有更改都在 mysql_bin.000010文件中(也应该复制到安全的地方)。
7.MySQL 二进制日志占用磁盘空间。要释放空间,请不时清除它们。一种方法是删除不再需要的二进制日志,例如当我们进行完整备份时:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > xxx.sql
注意如果您的服务器是复制源服务器,那么使用mysqldump删除MySQL二进制日志——删除主日志可能是危险的,因为复制服务器可能尚未完全处理二进制日志的内容。
1.全量备份完整脚本如下
#!/bin/bash
#完成数据库备份的脚本
#备份路径
BACKUP=/usr/local/mysql/data/backup
#当前时间作为备份文件名
DATETIME=$(date +%Y%m%d)
#测试下时间是否正确
echo $DATETIME
echo "============开始备份数据库文件============="
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=123456
#需要被备份的数据库名称
DATEBASE=zhxf_db_0524
#如果备份文件夹不存在则创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行数据库备份语句
mysqldump -h$HOST -u$DB_USER -p$DB_PWD --single-transaction -q -e -R --events --flush-logs --master-data=2 $DATEBASE | gzip > $BACKUP/$DATETIME/$DATEBASE_$DATETIME.sql.gz
#mysqldump -h$HOST -u$DB_USER -p$DB_PWD --single-transaction -q -e -R --events --flush-logs --master-data=2 --delete-master-logs $DATEBASE | gzip > $BACKUP/$DATETIME/$DATEBASE_$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除备份目录下所有7天前带".tar.gz"的文件
find $BACKUP -mtime +7 -name "*.tar.gz" -exec rm -rf {} \;
echo "============备份数据库文件成功============="