MySQL
Posted kakajiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。
一、mysql概述
1、MySQL介绍
MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样的设计增加了MySQL的读取速度,而且灵活性和可管理性也得到了很大提高。访问及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。
Mysql端口3306 netatat -antup | grep 3306
1、MySQL介绍
MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样的设计增加了MySQL的读取速度,而且灵活性和可管理性也得到了很大提高。访问及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。
Mysql端口3306 netatat -antup | grep 3306
2、数据库简单分为两种(第三种不确定)
关系型数据库-------->MySQL和Orache和postgrepsql
非关系型数据库------->Memcached和Redis
搜索引擎数据库------->elasticsearch
时间序列数据库-------> influxDB
列数据库 hbase
图形数据库 mongodb
消息队列中间件
c、什么叫关系型数据库
数据和数据之前是有关系的,通过关系能够将一系列数据都提取出来。
关系型数据库-------->MySQL和Orache和postgrepsql
非关系型数据库------->Memcached和Redis
搜索引擎数据库------->elasticsearch
时间序列数据库-------> influxDB
列数据库 hbase
图形数据库 mongodb
消息队列中间件
c、什么叫关系型数据库
数据和数据之前是有关系的,通过关系能够将一系列数据都提取出来。
d、什么是非关系型数据库?
NoSQL数据库--->Not only SQL
NoSQL数据库--->Not only SQL
3、MySQL和Orache的区别
其实这两类数据库在使用方法上,大体是没有太多区别的,都是基于SQL查询方式的数据库。
a、Oracle
Oracle是闭源的,收费的,收了钱自然好办事,出了问题有人管;因此,我们运维并不需要花太多的精力在Oracle上,要学取企业学。原因是Oracle为了不让企业因为一点小事就去找他,通常,专业的Oracle公司会给客户的运维人员进行培训。
b、MySQL
MySQL是开源的,免费使用,需要我们运维来维护;但是通常来说,真正的数据库维护人员叫做DBA---->database administrator,它并不是广泛意义上的运维,只是数据库专业运维,对于广泛意义上的运维人员来说,我们在两万薪资以下,只需要简单了解MySQL。
两万以上---->运维总监,需要具备两个能力,初级DBA和开发。
c、MariaDB
市面上的另一种数据库,MariaDB;MySQL数据库最早是开源的,现在也是开源的。但是,MySQL已经被Orache的SUN公司收购了。因此MySQL运维社区的人,为了防止SUN公司对MySQL进行闭源操作,他们自主在MySQL最后一个开源版本的基础上开发出一个分支数据库MariaDB。它和MYSQL几乎是一样的,因此,以后如果听到这个数据库,不要紧张。
其实这两类数据库在使用方法上,大体是没有太多区别的,都是基于SQL查询方式的数据库。
a、Oracle
Oracle是闭源的,收费的,收了钱自然好办事,出了问题有人管;因此,我们运维并不需要花太多的精力在Oracle上,要学取企业学。原因是Oracle为了不让企业因为一点小事就去找他,通常,专业的Oracle公司会给客户的运维人员进行培训。
b、MySQL
MySQL是开源的,免费使用,需要我们运维来维护;但是通常来说,真正的数据库维护人员叫做DBA---->database administrator,它并不是广泛意义上的运维,只是数据库专业运维,对于广泛意义上的运维人员来说,我们在两万薪资以下,只需要简单了解MySQL。
两万以上---->运维总监,需要具备两个能力,初级DBA和开发。
c、MariaDB
市面上的另一种数据库,MariaDB;MySQL数据库最早是开源的,现在也是开源的。但是,MySQL已经被Orache的SUN公司收购了。因此MySQL运维社区的人,为了防止SUN公司对MySQL进行闭源操作,他们自主在MySQL最后一个开源版本的基础上开发出一个分支数据库MariaDB。它和MYSQL几乎是一样的,因此,以后如果听到这个数据库,不要紧张。
4、B/S架构和C/S架构模式的区别
B/S====>Web/Server
C/S====>Client/Server
B/S:用户通过Web浏览器打开输入域名就能访问服务器Server的方式叫做B/S;用户不需要安装任何东西;主要是基于浏览器缓存,性能低
C/S:在用户电脑里需要下载并安装客户端Client,可直接调用CPU、内存,性能高。
B/S====>Web/Server
C/S====>Client/Server
B/S:用户通过Web浏览器打开输入域名就能访问服务器Server的方式叫做B/S;用户不需要安装任何东西;主要是基于浏览器缓存,性能低
C/S:在用户电脑里需要下载并安装客户端Client,可直接调用CPU、内存,性能高。
二、编译安装MYSQL
1、准备工作
卸载rpm方式安装的mysql-server、mysql
rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
若存在server mysql
用rpm -e mysql-server mysql --nodeps命令卸载
yum也能安装,不过yum安装的是5.1版本,我们要用5.5版本
1、准备工作
卸载rpm方式安装的mysql-server、mysql
rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
若存在server mysql
用rpm -e mysql-server mysql --nodeps命令卸载
yum也能安装,不过yum安装的是5.1版本,我们要用5.5版本
安装ncurses-devel与cmake包
yum -y install ncurses-devel
tar xf cmake-2.8.6.tar.gz -C /usr/src
cd /usr/src/cmake-2.8.6
./configure && gmake && gmake install
yum -y install ncurses-devel
tar xf cmake-2.8.6.tar.gz -C /usr/src
cd /usr/src/cmake-2.8.6
./configure && gmake && gmake install
2、源码编译及安装
增加程序用户mysql
useradd -M -s /sbin/nologin mysql
解压mysql-5.5.22.tar.gz
tar xf mysql-5.5.22.tar.gz -C /usr/src
cmake配置,编译及安装
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make && make install
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql //主程序安装目录
-DDEFAULT_CHARSET=utf8 //默认字符集为utf8
-DDERAULT_COLLATION=utf8_general_ci //默认的字符集校对规则
DWITH_EXTRA_CHARSETS=all //安装所有字符集
-DSYSCONFDIR=/etc //配置文件存放目录
增加程序用户mysql
useradd -M -s /sbin/nologin mysql
解压mysql-5.5.22.tar.gz
tar xf mysql-5.5.22.tar.gz -C /usr/src
cmake配置,编译及安装
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make && make install
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql //主程序安装目录
-DDEFAULT_CHARSET=utf8 //默认字符集为utf8
-DDERAULT_COLLATION=utf8_general_ci //默认的字符集校对规则
DWITH_EXTRA_CHARSETS=all //安装所有字符集
-DSYSCONFDIR=/etc //配置文件存放目录
3、安装后的优化操作
修改Mysql安装目录的属主和属组
chown -R mysql:root /usr/local/mysql/
创建修改my.cnf配置文件
/bin/cp /usr/local/mysql/support-files/my-medium.conf /etc/my.cnf
/bin/cp /usr/local/mysql/support-files/my-medium.conf /etc/my.cnf
my.cnf 配置文件相关介绍,在mysql解压路径support-files/下提供的模板:
my-huge.cnf 巨大数据量
my-innodb-heavy-4G.cnf innodb引擎
my-large.cnf 大数据量
my-medium.cnf 测试使用
my-small.cnf 小数据量
my-huge.cnf 巨大数据量
my-innodb-heavy-4G.cnf innodb引擎
my-large.cnf 大数据量
my-medium.cnf 测试使用
my-small.cnf 小数据量
添加系统服务
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
加x权限
chmod +x /etc/init.d/mysqld
chkconfig mysqld --add
chkconfig mysqld --list
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
添加Mysql命令执行的路径到PATH环境变量
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/progile
In -s /usr/local/mysql/bin/* /usr/local/bin
两种方法选一,为的是让环境变量能找到这个命令
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
加x权限
chmod +x /etc/init.d/mysqld
chkconfig mysqld --add
chkconfig mysqld --list
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
添加Mysql命令执行的路径到PATH环境变量
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/progile
In -s /usr/local/mysql/bin/* /usr/local/bin
两种方法选一,为的是让环境变量能找到这个命令
date目录就是Mysql的数据目录,数据目录下是可以有很多的小库的;date目录下面的子目录就是一个一个的小库,每个小库的库名,就是子目录的名字。而子目录里面装的,就是对应的数据文件
执行mysql_install_db脚本初始化数据库
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
--basedir=/usr/local/mysql/ //指定安装路径
--datadir=/usr/local/mysql/data //指定数据目录,
我们也可以告诉它其他目录,那么它就可以把数据写在其他目录下
--user=mysql //指定用户的身份
--datadir=/usr/local/mysql/data //指定数据目录,
我们也可以告诉它其他目录,那么它就可以把数据写在其他目录下
--user=mysql //指定用户的身份
启动mysql服务,并查看运行状态
/etc/init.d/mysqld start
netstat -anput | grep 3306
/etc/init.d/mysqld start
netstat -anput | grep 3306
连接并登陆到mysql操作环境
Mysql -u 指定用户名 (-uroot)默认的
-p 指定密码 ()默认空密码登陆
-h 指定主机 (127.0.0.1)默认的
-P 指定端口
[[email protected]]# mysql
或[[email protected]]# mysql -uroot -p
后面没加参数,有默认参数
Mysql -u 指定用户名 (-uroot)默认的
-p 指定密码 ()默认空密码登陆
-h 指定主机 (127.0.0.1)默认的
-P 指定端口
[[email protected]]# mysql
或[[email protected]]# mysql -uroot -p
后面没加参数,有默认参数
退出登陆
quit、exit或ctrl+D
quit、exit或ctrl+D
设置数据库的用户名密码
mysqladmin -uroot password ‘123123‘
mysql -uroot -p123123
mysqladmin -uroot password ‘123123‘
mysql -uroot -p123123
三、mysql数据库操作
1、SQL语句概述
SQL语言是(Structured Query Language的缩写,即结构化查询语言),是关系型数据库的标准语言,用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能。
SQL分类:
1、SQL语句概述
SQL语言是(Structured Query Language的缩写,即结构化查询语言),是关系型数据库的标准语言,用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能。
SQL分类:
2、数据库表的管理操作
注:大部分命令不区分大小写
a、查看数据库结构
查看数据库列表信息
格式:show databases;
查看数据库中的数据表信息
格式:use 数据库名 show tables;
显示数据表的结构(字段)
格式:describe【数据库.】表名
eg: desc uses;
describe uses;
describe mysql.user;
use mysql; describe user;
creat创建新库创建新表
格式:create database 数据库名;
create table 表名;
示例:
create database auth; //新建一个名为auth的数据库
use auth; //使用auth这个数据库
create table users (user_name char(20) not null, user_passwd char(30) default ‘‘, primary key (user_name));
//在auth库中创建名为user的表,表内两个字段为(user_name 最多20字节,不能为空, user_passwd最多30字节默认为空,索引关键字user_name )
drop删除库、删除表
格式:drop table [数据库名]表名;
drop database 数据库名;
格式:describe【数据库.】表名
eg: desc uses;
describe uses;
describe mysql.user;
use mysql; describe user;
creat创建新库创建新表
格式:create database 数据库名;
create table 表名;
示例:
create database auth; //新建一个名为auth的数据库
use auth; //使用auth这个数据库
create table users (user_name char(20) not null, user_passwd char(30) default ‘‘, primary key (user_name));
//在auth库中创建名为user的表,表内两个字段为(user_name 最多20字节,不能为空, user_passwd最多30字节默认为空,索引关键字user_name )
drop删除库、删除表
格式:drop table [数据库名]表名;
drop database 数据库名;
3、对表里的数据进行操作的SQL语句
a、select查询语句
use yunjisuan
select * from uses; 如果不写加个*,默认看所有
select 字段,字段 from 空间.表名;
eg: select user,host,password from mysql.user;
看系统库mysql里的user表里的user、host、password字段
select * from mysql.userG 把横着的数据自动换行(变竖着显示)
desribe yunjisuan.users; 查看表头(看表结构)
use mysql; describe user; (简单记法desc 空间名.表明;)
b、insert插入新数据
insert into uses values (‘插入的内容‘,‘插入的内容‘)
insert into 空间名.表名 (字段名1,字段名2) values (值1,值2)
把值查到前面的字段
###这条命令没有指定插入哪个字段,默认是插所有的,按顺序放,有几个字段,就要插入几个,不然报错
use yunjisuan
select * from uses; 如果不写加个*,默认看所有
select 字段,字段 from 空间.表名;
eg: select user,host,password from mysql.user;
看系统库mysql里的user表里的user、host、password字段
select * from mysql.userG 把横着的数据自动换行(变竖着显示)
desribe yunjisuan.users; 查看表头(看表结构)
use mysql; describe user; (简单记法desc 空间名.表明;)
b、insert插入新数据
insert into uses values (‘插入的内容‘,‘插入的内容‘)
insert into 空间名.表名 (字段名1,字段名2) values (值1,值2)
把值查到前面的字段
###这条命令没有指定插入哪个字段,默认是插所有的,按顺序放,有几个字段,就要插入几个,不然报错
指定插入哪个字段
insert into 空间名.表明 (字段) values (‘值‘)
###在表中的user_name字段中添加baibai,没插入的,默认是空
c、update更改原有数据
update 空间名.表名 set 字段=’值’ where 字段=’原值’;
update uses set user_passwd=‘888888‘;
###没有写更改哪个字段的数据,默认把那一栏的所有的改成888888
update 空间名.表名 set 字段=’值’ where 字段=’原值’;
update uses set user_passwd=‘888888‘;
###没有写更改哪个字段的数据,默认把那一栏的所有的改成888888
update uses set user_passwd=‘999999‘ where user_name=‘baibai‘;
###给设定条件,更改user_passwd的那一栏后面加条件baibai那一栏就行修改,这样满足这一行的条件,只能是那一行的数据了
d、delete删除
delete from 空间名.表名 where 字段=’原值’;
delete from uses where user_name=‘baibai‘;
清空user_name下baibai那一栏数据;如果后面不加条件,就直接把整个表清空了;!!!很危险!!
e、刷新flush privileges;
使输入的内存中的数据,立刻写入硬盘中保存,立即生效。
4、直接看数据库硬盘中得数据
在命令界面,直接输入命令,看数据库中的数据
mysql -uroot -p123123 -e ‘select 字段名 from 空间名.表名’
实体案例:
create table aodi (岗位类别 char(20) not null, 姓名 char(20) not null, 年龄 int, 员工ID int not null, 学历 char(6), 年限 int, 薪资 int not null, primary key (员工ID));
在命令界面,直接输入命令,看数据库中的数据
mysql -uroot -p123123 -e ‘select 字段名 from 空间名.表名’
实体案例:
create table aodi (岗位类别 char(20) not null, 姓名 char(20) not null, 年龄 int, 员工ID int not null, 学历 char(6), 年限 int, 薪资 int not null, primary key (员工ID));
insert into imployee_salary.aodi values (‘网络工程师‘,‘孙空武‘,27,011,‘本科‘,3,4800);
insert into imployee_salary.aodi values (‘WINDOWS工程师‘,‘蓝凌‘,19,012,‘中专‘,2,3500);
insert into imployee_salary.aodi values (‘LINUX工程师‘,‘姜纹‘,32,013,‘本科‘,8,15000);
insert into imployee_salary.aodi values (‘JAVA工程师‘,‘关园‘,38,014,‘大专‘,10,16000);
insert into imployee_salary.aodi values (‘硬件驱动工程师‘,‘罗中坤‘,29,015,‘大专‘,9,16500);
insert into imployee_salary.aodi values (‘WINDOWS工程师‘,‘蓝凌‘,19,012,‘中专‘,2,3500);
insert into imployee_salary.aodi values (‘LINUX工程师‘,‘姜纹‘,32,013,‘本科‘,8,15000);
insert into imployee_salary.aodi values (‘JAVA工程师‘,‘关园‘,38,014,‘大专‘,10,16000);
insert into imployee_salary.aodi values (‘硬件驱动工程师‘,‘罗中坤‘,29,015,‘大专‘,9,16500);
为什么用update修改密码登陆不上去
因为我们在创建用户的时候,密码是加密存到数据库里的,我们在登陆输入密码时候虽然是明文的,但是系统会加密以后跟数据库里的密码进行比对。如果我们用date修改密码文件,里面的内容不是加密的,我们再用新密码登陆,系统还是会给新密码加密与数据库里面的密码进行对比;所以就登陆不上去了
修改密码解决方法
所以我们用update修改密码的时候,要调用一个加密函数进行修改
update mysql.user set password=password(‘123123’) where user=’root’;
密码经过password()的函数进行加密,传到密码文件里,保存进去。
然后需要刷新(修改跟账号有关的必须刷新)flush privileges;
因为我们在创建用户的时候,密码是加密存到数据库里的,我们在登陆输入密码时候虽然是明文的,但是系统会加密以后跟数据库里的密码进行比对。如果我们用date修改密码文件,里面的内容不是加密的,我们再用新密码登陆,系统还是会给新密码加密与数据库里面的密码进行对比;所以就登陆不上去了
修改密码解决方法
所以我们用update修改密码的时候,要调用一个加密函数进行修改
update mysql.user set password=password(‘123123’) where user=’root’;
密码经过password()的函数进行加密,传到密码文件里,保存进去。
然后需要刷新(修改跟账号有关的必须刷新)flush privileges;
四、用户权限设置grand
Mysql账号的组成:用户名@登陆IP
所以Mysql的账号就限制了它登陆的位置
1、设置用户权限(用户不存在,则新建用户)
grant all on *.* to ‘root’@’192.168.1.108’ identified by ‘123456’;
#all 代表 赋予所有权限:增删改查等其他权限 可以把all换成其他的单一权限,比如select
#on后面的 *.* 代表库名.表名 赋予修改所有库加所有表,如果是mysql.*就代表赋予mysql库下的所有表
#[email protected] 代表用户名@登陆IP
#IDENTIFIED BY‘123456’ 代表设置密码
#这种登陆是远程登陆,登陆时候后面一定要加-h和设置的IP,不然默认的是本地登陆-h 127.0.0.1(localhost)
#不写-h默认是localhost 所以要想不加-h登陆,我们要创建一个登陆IP是localhost的账号
2、查看用户权限
查看当前用户权限:show grants;
查看其他用户权限:show grants for ‘用户名’@’IP地址’;
Mysql账号的组成:用户名@登陆IP
所以Mysql的账号就限制了它登陆的位置
1、设置用户权限(用户不存在,则新建用户)
grant all on *.* to ‘root’@’192.168.1.108’ identified by ‘123456’;
#all 代表 赋予所有权限:增删改查等其他权限 可以把all换成其他的单一权限,比如select
#on后面的 *.* 代表库名.表名 赋予修改所有库加所有表,如果是mysql.*就代表赋予mysql库下的所有表
#[email protected] 代表用户名@登陆IP
#IDENTIFIED BY‘123456’ 代表设置密码
#这种登陆是远程登陆,登陆时候后面一定要加-h和设置的IP,不然默认的是本地登陆-h 127.0.0.1(localhost)
#不写-h默认是localhost 所以要想不加-h登陆,我们要创建一个登陆IP是localhost的账号
2、查看用户权限
查看当前用户权限:show grants;
查看其他用户权限:show grants for ‘用户名’@’IP地址’;
3、撤销一个权限
revoke seleck on 库名.表名 from ‘用户名@IP地址’;
flush privileges;
revoke seleck on 库名.表名 from ‘用户名@IP地址’;
flush privileges;
4、Mysql通配符
_ 任意单个字符
% 任意长度的任意字符
eg:’root’@’192.168.154.%’ root账号在192.168.154这个网段都能登陆
eg:’root’@’%’ root账号在任意IP都能登陆
eg:’root’@’192.168.154.1_’ root账号在192.168.154.10~19 都能登陆
flush privileges;
_ 任意单个字符
% 任意长度的任意字符
eg:’root’@’192.168.154.%’ root账号在192.168.154这个网段都能登陆
eg:’root’@’%’ root账号在任意IP都能登陆
eg:’root’@’192.168.154.1_’ root账号在192.168.154.10~19 都能登陆
flush privileges;
5、Mysql其他常用命令
用于显示广泛的服务器状态信息
show status;
用于显示广泛的服务器状态信息
show status;
显示创建特定数据库或表
help create database;
help create tables;
help create database;
help create tables;
显示授权用户的安全权限
show grants;
show grants;
显示当前连接用户
mysql> select user();
mysql> select user();
显示当前时间
mysql> select now();
mysql> select now();
显示当前用户及时间
mysql> select CURRENT_USER(),CURRENT_TIMESTAMP;
mysql> select user(),now();
mysql> select CURRENT_USER(),CURRENT_TIMESTAMP;
mysql> select user(),now();
显示当前数据库
mysql> select database();
mysql> select database();
显示服务器状态
mysql> status;
mysql> status;
数据库的备份和恢复
方法一:可直接备份目录 /var/local/mysql/var
方法二:使用专用备份工具 mysqldump
方法一:可直接备份目录 /var/local/mysql/var
方法二:使用专用备份工具 mysqldump
备份操作
mysqldump -u 用户名-p [密码][选项][数据名][表名]>/备份名路径/备份文件名
常见选项
--all-databases
--opt
mysqldump -u 用户名-p [密码][选项][数据名][表名]>/备份名路径/备份文件名
常见选项
--all-databases
--opt
#mysqldump -u root -p mysql user > mysql-user.sql
Enter password:
#mysqldump -u root -p --database auth > auth.sql
Enter password:
#mysqldump -u root -p --opt --all-databses > all-data.sql
Enter password:
Enter password:
#mysqldump -u root -p --database auth > auth.sql
Enter password:
#mysqldump -u root -p --opt --all-databses > all-data.sql
Enter password:
恢复操作
mysql -u root -p [数据库名] < /备份路径/备份文件名
#mysql -u root -p test < mysql-user.sql
Enter password:
mysql -u root -p [数据库名] < /备份路径/备份文件名
#mysql -u root -p test < mysql-user.sql
Enter password:
五、Mysql完全备份mysqldump
1、mysqldump命令备份
Mysqldump这个命令会阻塞数据库的写入,自动锁表,所以我们用这个命令的时候是在从库上用的;
因为从库一般都是只供读请求。
(1)对单个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项][数据库名] > /备份路径/备份文件名
实例:mkdir /backup
mysqldump -uroot -p123123 --databases yunjiusan > /backup/auth-$(date +%F).sql
echo $?
0
(2)对多个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项] --databases 库名1[库名2]...> /备份路径/备份文件
实例:mysqldump -uroot -p123123 --databases mysql auth > /backup/mysql+auth-$(data +%F).sql
1、mysqldump命令备份
Mysqldump这个命令会阻塞数据库的写入,自动锁表,所以我们用这个命令的时候是在从库上用的;
因为从库一般都是只供读请求。
(1)对单个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项][数据库名] > /备份路径/备份文件名
实例:mkdir /backup
mysqldump -uroot -p123123 --databases yunjiusan > /backup/auth-$(date +%F).sql
echo $?
0
(2)对多个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项] --databases 库名1[库名2]...> /备份路径/备份文件
实例:mysqldump -uroot -p123123 --databases mysql auth > /backup/mysql+auth-$(data +%F).sql
(3)对所有库进行备份
格式:mysqldump -u 用户名 -p [密码][选项] --all-databases > /备份路径/备份文件
实例:mysqldump -uroot -p123123 --opt --all-databases > /backup/mysql_all.$(date +%F).sql
--opt 加快备份速度,当备份数据量大时候使用
mysqldump -uroot -p123123 --opt --all-databases | gzip -9 > /tmp/xxx$(data +F%).sql
备份要进行压缩,不然太大了
格式:mysqldump -u 用户名 -p [密码][选项] --all-databases > /备份路径/备份文件
实例:mysqldump -uroot -p123123 --opt --all-databases > /backup/mysql_all.$(date +%F).sql
--opt 加快备份速度,当备份数据量大时候使用
mysqldump -uroot -p123123 --opt --all-databases | gzip -9 > /tmp/xxx$(data +F%).sql
备份要进行压缩,不然太大了
(4)对表进行备份
格式:mysqldump -u 用户名 -p [密码][选项] 数据库名 表名 > /备份路径/备份文件
实例:mysqldump -uroot -p123123 yunjisuan user > /backup/user-$(data +%F).sql
(5)对表结构进行备份
格式:mysqldump -u 用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名
实例:mysqldump -uroot -p123123 -d mysql user > /backup/desc_mysql_user-$(data +%F).sql
格式:mysqldump -u 用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名
实例:mysqldump -uroot -p123123 -d mysql user > /backup/desc_mysql_user-$(data +%F).sql
2、打包数据库备份
直接打包数据库文件夹,如/usr/local/mysql/data/ 或 /var/lib/mysql/
需要先停库
/etc/init.d/mysqld stop
yum -y install xz
tar jcf mysql_all-$(data+%F).tar.xz /usr/local/mysql/data/
tar:从成员名中删除开头的“/”
tar xf mysql_all-2016-05-05.tar.xz
mkdir bak
模拟数据丢失
mv /usr/local/mysql/data/* bak/
恢复数据:
tar xf mysql_all-2016-05-05.tar.xz
cd usr/local/mysql/data/
mv */usr/local/mysql/data/
直接打包数据库文件夹,如/usr/local/mysql/data/ 或 /var/lib/mysql/
需要先停库
/etc/init.d/mysqld stop
yum -y install xz
tar jcf mysql_all-$(data+%F).tar.xz /usr/local/mysql/data/
tar:从成员名中删除开头的“/”
tar xf mysql_all-2016-05-05.tar.xz
mkdir bak
模拟数据丢失
mv /usr/local/mysql/data/* bak/
恢复数据:
tar xf mysql_all-2016-05-05.tar.xz
cd usr/local/mysql/data/
mv */usr/local/mysql/data/
3、恢复数据库
(1)交互式恢复
进入数据库中恢复
source /backup/mysql_all.20180505.sql
(1)交互式恢复
进入数据库中恢复
source /backup/mysql_all.20180505.sql
(2)非交互式恢复
在命令界面恢复
mysql -u用户名 -p[密码] < 数据库的备份路径
mysql -u用户名 -p[密码] 库名 < 表的备份路径
在命令界面恢复
mysql -u用户名 -p[密码] < 数据库的备份路径
mysql -u用户名 -p[密码] 库名 < 表的备份路径
查看
mysql -uroot -p123123 -e ‘show databases’
(3)定时备份脚本
简单版:
复杂版:
备份过程压缩
mysqldump -uroot -p123123 --databases yunjiusan | gzip -p > /tmp/yunjisuan.gz
六、增量备份
利用二级制日志进行增量备份
二进制日志默认最大是1M (可修改)
vim /etc/my.cnf
52 max_binlog_size = 1024000
如果一个日志到达1M大小,会自动生成一个新的日志
我们也可以强制刷新一个新的日志文件
flush logs
看当前状态 show master status;
1、开启binlog日志
vim /etc/my.cnf
49 log-bin=mysql-bin
112 #log-bin=mysql-bin
重启mysql
/etc/init.d/mysqld restart
查看二进制日志文件的命令 mysqlbinlog
eg: mysqlbinlog mysql bin.000001
eg: mysqlbinlog mysql bin.000001
2、增量恢复
(1)一般恢复:
将备份的二进制日志内容全部恢复
格式:mysqlbinlog 增量备份文件 | mysql -u用户名 -p密码
(1)一般恢复:
将备份的二进制日志内容全部恢复
格式:mysqlbinlog 增量备份文件 | mysql -u用户名 -p密码
(2)基于时间点恢复:
跳到某个发生错误的时间点进行恢复
格式:
从日志开始到截至的某个时间点进行恢复:
mysqlbinlog --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
跳到某个发生错误的时间点进行恢复
格式:
从日志开始到截至的某个时间点进行恢复:
mysqlbinlog --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间开始到日志的末尾进行恢复:
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到某个时间点进行恢复:
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
(3)基于位置恢复
可能在同一时间点既有错误的操作也有正确的操作,基于位置恢复更精准
格式:
mysqlbinlog --stop-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
mysqlbinlog --start-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
可能在同一时间点既有错误的操作也有正确的操作,基于位置恢复更精准
格式:
mysqlbinlog --stop-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
mysqlbinlog --start-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
看自己目前的位置
show master status;
show master status;
3、企业备份策略
a、在中小公司,由于数据量小,数据的完整性不是特别重要,允许小数量的细节数据丢失。因此,只需每天进行一次数据的全量备份即可;===>定时任务+全备脚本
b、中大型公司,由于数据量大,每天全备时间太长,而且比较关注数据的安全和完整,无法承受数据丢失,哪怕只是少量的数据;对于这种类型的公司,我们通常采取全量备份+增量备份的方式来进行。
也就是每周进行一次全量备份====>定时任务+全备脚本
每天进行一次增量备份,binlog二进制日志方式。
a、在中小公司,由于数据量小,数据的完整性不是特别重要,允许小数量的细节数据丢失。因此,只需每天进行一次数据的全量备份即可;===>定时任务+全备脚本
b、中大型公司,由于数据量大,每天全备时间太长,而且比较关注数据的安全和完整,无法承受数据丢失,哪怕只是少量的数据;对于这种类型的公司,我们通常采取全量备份+增量备份的方式来进行。
也就是每周进行一次全量备份====>定时任务+全备脚本
每天进行一次增量备份,binlog二进制日志方式。
4、中小企业数据库全量备份如何实现
第一种:推送
采用rsync备份服务器:
数据库定时任务结束后,自动rsync推送到备份服务器
第二种:raid阵列
在mysl服务器上,额外进行raid磁盘阵列的挂载
可挂载到/data目录或者/baskup目录,也可挂两个raid两个目录,然后全量脚本将备份备在此目录里。
第一种:推送
采用rsync备份服务器:
数据库定时任务结束后,自动rsync推送到备份服务器
第二种:raid阵列
在mysl服务器上,额外进行raid磁盘阵列的挂载
可挂载到/data目录或者/baskup目录,也可挂两个raid两个目录,然后全量脚本将备份备在此目录里。
5、中大型企业mysql备份如何实现
(1)全备+增备
(2)每周一次全备
(3)增备实现的两种方式
(1)全备+增备
(2)每周一次全备
(3)增备实现的两种方式
第一种:
通过定时任务+备份切割脚本(推送);每天0点,flush logs,
详解:执行脚本之前先flush logs一下,比如出现00008脚本,我们把1-7进行打包推送到备份服务器;
备份服务器设置两个模块,一个全备份模块,一个增备份模块;
备份思路:先把日志文件移走,移到一个备份目录里,然后打包推送,验证完整性,如果验证完整性失败就通知运维;推送完成后,第二天删除前一天的;
优点:如果想恢复到某个版本或某个位置,可轻松实现
缺点:硬盘成本非常高,有多余的冗余数据
通过定时任务+备份切割脚本(推送);每天0点,flush logs,
详解:执行脚本之前先flush logs一下,比如出现00008脚本,我们把1-7进行打包推送到备份服务器;
备份服务器设置两个模块,一个全备份模块,一个增备份模块;
备份思路:先把日志文件移走,移到一个备份目录里,然后打包推送,验证完整性,如果验证完整性失败就通知运维;推送完成后,第二天删除前一天的;
优点:如果想恢复到某个版本或某个位置,可轻松实现
缺点:硬盘成本非常高,有多余的冗余数据
第二种,不推送,实时同步rsync+inotify
每周日全量备份结束后,删除所有日志文件,进行一次flush logs
重新开始后,将所有mysql bin.*实时同步到备份服务器上。
优点:成本低,如果某一天数据库出问题,可恢复到出问题之前
缺点:无法恢复到某个位置或某一天
每周日全量备份结束后,删除所有日志文件,进行一次flush logs
重新开始后,将所有mysql bin.*实时同步到备份服务器上。
优点:成本低,如果某一天数据库出问题,可恢复到出问题之前
缺点:无法恢复到某个位置或某一天
数据库常用的架构解析
a、主从同步,主从复制
a、主从同步,主从复制
实时同步
binlog
将“主Mysql数据库”实时同步binlog日志到“从Mysql数据库”上,这样从Mysql读取日志文件,就与主数据库完全一致了;那么我们就可以把读请求转移到“从服务器上(IP2)”,把写请求指向“主服务器上(IP1)”
发展一段时间以后,有三台从服务器,两台供读,一台供备份(全备、增备)或者供开发数据分析和开发软件功能测试。
七、慢查询日志
记录所有执行时间超过long_query_time秒的SQL语句,可用于找到执行时间长的查询,以用于优化。默认未开启。
vim /etc/my.cnf
[mysqld]
long_query_time = 5 //单位秒
log-slow-queries = mysql_slow.log
记录所有执行时间超过long_query_time秒的SQL语句,可用于找到执行时间长的查询,以用于优化。默认未开启。
vim /etc/my.cnf
[mysqld]
long_query_time = 5 //单位秒
log-slow-queries = mysql_slow.log
/etc/init.d/mysqld restart ==>重启慢日志
以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章