mysql数据库简单补充
1、只有拥有特定权限的用户才能执行特定的操作。就好像我们在现实生活中,一般没有权利进入军事禁区,除非我们被某个很有权利并且可以指定其他人进入军事基地的人赋予了进入军事禁区的权利。
命令:
GRANT privileges ON dbname.tableanme TO \’username\’@\’host\’ identified by ‘密码’;
赋权的同时并创建用户,并设置用户密码
2、ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 5的解决方案。
错误是由于你曾经升级过数据库,升级完后没有使用
mysql_upgrade升级数据结构造成的。
解决办法:
使用mysql_upgrade命令
root@localhost ~]# mysql_upgrade -u root -p 13456
3、创建用户:
CREATE USER \’username\’@\’host\’ [IDENTIFIED BY \’password\’];
username表示要创建的用户名;
host表示被指定登录的主机名,可为指定主机的IP地址,本地用户用localhost表示;若要允许外网IP地址访问,可用通配符%表示任意IP地址。
例子:CREATE USER \’john\’@\’localhost\’ IDENTIFIED BY \’123\’;
3.2修改用户密码
alter user \’username\’@\’hostname\’ identified by \’password\’; 首次安装完msyql数据库,修改账号密码
3.3删除mysql表中的所有数据,清空表数据
delete from database.table;
4、创建数据库并指定字符集
create database dbname default charset utf8;
5、在shell环境执行MySQL命令
mysql -uroot -p -e “show character set\G;” 查看所有的字符集
6、只查看某个表内容的前10行limit 10
select uid,uname,realname,tel,email from uPwd_12306 limit 10;
7、备份原有数据库数据内容
mysqldump -uroot -p –no-create-info(不要创建create table语句) –extended-insert (使用包含几个values列表的多行insert语句,导入数据速度快) –default-character-set=latin1(按照原有字符集导出数据,这样就不会保存为乱码) dbname > 自定义.sql
8、查看字符集的变量设置
show variables like \’character_set%\’;
9、删除用户:
drop user \’用户名\’@\’ip地址\’;
drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表的相应记录都消失了。
10、在shell命令行执行mysql语句
mysql -uroot -psecure(密码) MF(数据库) -e \’select * from uPwd_12306(表)\’
11、断开mysql的从数据库同步方法,先进入主数据库关闭二进制日志
mysql> set sql_log_bin=off;
mysql> alter table t1 engine=blackhole; 将t1表存储引擎改为黑洞,不存储数据内容
mysql>set sql_log_bin=on; 改完之后,再将bin_log日志功能开启即可
mysql乱码恢复完整过程
1):导出表结构
mysqldump –uroot –default-character-set=latin1 -d apple> appletable.sql
2):编辑appletable.sql 将latin1修改成utf8
vim appletable.sql 修改所有latin1为utf8
3):确保数据库不再更新,导出所有数据
mysqldump -uroot –p123456 –quick –no-create-info –extended-insert –default-character-set=latin1 apple>appledata.sql
参数说明:
–quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,并输出当前cache到内存中
–no-create-info:不要创建create table语句
–extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快
–default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码
4):打开appledata.sql 将SET NAME latin1 修改成SET NAME utf8
vim appledata.sql
/*!40101 SET NAMES utf8 */;
5):重新建库
mysql> create database apple default charset utf8;
6):建立表,导入我们之前导出的表的数据库
mysql –uroot –p123456 apple <appletable.sql
7):导入数据
mysql -uroot -p123456 apple <appledata.sql
编辑my.cnf文件,跳过密码登陆,关闭密码审计策略
xtrabackup工具备份mysql数据库
1、下载安装包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el7-x86_64-bundle.tar
2、解压并安装
yum -y install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
—> Package percona-xtrabackup-24.x86_64 0:2.4.9-1.el7 will be installed
–> Processing Dependency: perl(DBD::mysql) for package: percona-xtrabackup-24-2.4.9-1.el7.x86_64
报错,需要安装perl-DBD-MySQL。而perl-DBD-MySQL.x86_64 0:4.023-6.el7 安装包依赖这三个包mysql-community-common.x86_64 0:5.7.28-1.el7 mysql-community-libs.x86_64 0:5.7.28-1.el7 mysql-community-libs-compat.x86_64 0:5.7.28-1.el7。更新本机的Centos的yum源及epel源为阿里最新的yum源,备份原有的yum源。再次使用yum install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 进行安装即可解决依赖关系。
3、修改my.cnf文件
比如在/etc/my.cnf的[mysqld] 下添加datadir=/usr/local/mysql/data,然后重启mysql
4、全量备份
innobackupex –defaults-file=/etc/my.cnf –user=root –password=密码 –use-memory=4G /tmp/backup数据备份存放路径 &>>/tmp/db_backup.log数据备份日志输出文件
例如:innobackupex –user=root –password=P@zzw0rd /root/linshi &>>/root/linshi/db_backup.log
innobackupex –user=root –password=P@zzw0rd –no-timestamp /root/linshi/full &>>/root/linshi/db_backup.log 自定义全备文件存放目录名称为full
5、备份还原
停止mysql,删除数据:rm -rf /var/lib/mysql/*
innobackupex –copy-back /root/linshi/full
chown +R mysql.mysql /var/lib/mysql
systemctl start msyqld
mysql -uroot -p回车输入密码进行登陆即可。
6、创建增量备份和还原
使用—incremental创建增量备份
innobackupex –user=root –password=密码 –incremental /增量1路径 –incremental-basedir=全备路径 后面指定在哪个全备上进行增量备份
例如:innobackupex –user=root –password=P@zzw0rd –incremental /root/linshi/db_backup –incremental-basedir=/root/linshi/full &>>/root/linshi/db_backup.log
测试:
停止mysql,删除数据rm –rf /var/lib/mysql/*
还原增量备份
增量备份的恢复比全备要复杂一点,第一步是在所有备份目录下重做已提交的日志,如:
innobackupex –apply-log –redo-only BASE-DIR
innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-1
innobackupex –apply-log BASE-DIR –incremental-dir=INCREMENTAL-DIR-2
注意:如果仅有一份增量备份,第2条语句忽然
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
这里要注意的是:最后一步的增量备份并没有–redo-only选项!
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。
第一步完成之后,我们开始第二步:回滚未完成的日志:
innobackupex –apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:
innobackupex –copy-back BASE-DIR
恢复mysql权限 chown –R mysql.mysql /var/lib/mysql/
最后启动systemctl start mysqld
检验数据是否恢复正常
MySQL增/全量备份-percona
percona-xtrabackup 只能对本地mysql数据库进行备份,故需与被备份数据mysql安装在同一台主机上。
由于该软件只会备份数据,不会备份log_bin日志,但会显示当前备份的位置,故如用备份恢复,将需重新配置数据库 主从/主主同步。
安装包
percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz:
官网下载地址:
https://www.percona.com/downloads/XtraBackup/LATEST/
软件安装
# 解压即安装
cd /data/
tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
全量备份
# 创建全量备份存储文件夹
mkdir -p /data/mysql_backup/full/
# 开始备份,生成全量备份文件夹在/data/backup/2018-10-19_03-40-04/
/data/percona-xtrabackup-2.4.9-Linux-x86_64/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=***** /data/mysql_backup/full/
# 从以上命令的日志中获取同步位置,例如如下显示为 bin_log.000002\' \'428234578\'
MySQL binlog position: filename \'bin_log.000002\', position \'428234578\'
180918 14:55:51 [00] Writing backup-my.cnf
180918 14:55:51 [00] ...done
180918 14:55:51 [00] Writing xtrabackup_info
180918 14:55:51 [00] ...done
xtrabackup: Transaction log of lsn (1068407093) to (1068407102) was copied.
180918 14:55:51 completed OK!
增量备份
# 创建增量备份文件夹
mkdir -p /data/mysql_backup/increment/
# --incremental表示增量备份,--incremental-basedir配置为以哪个备份为基础,可以全量为基础,也可以增量为基础。本次生成增量备份文件在:/data/mysql_backup/increment/2018-10-19_06-02-42/
innobackupex --user=root --password=***** --incremental --incremental-basedir=/data/mysql_backup/full/2018-10-19_03-40-04/ /data/mysql_backup/increment/
恢复
# 恢复前,需先停止数据库
service mysql stop
# 恢复全量备份
# 将原mysql数据文件夹改名,该路径在/etc/my.cnf datadir中有定义,以下假设原数据目录为/data/mysql/data/
mv /data/mysql/data/ /data/mysql/data_20181019
mkdir -p /data/mysql/data/
# 让备份文件夹准备恢复(同步已经提交的事务及回滚未提交的事务至数据文件)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=***** --apply-log --use-memory=4G /data/mysql_backup/full/2018-10-19_03-40-04/
# 开始恢复
innobackupex --defaults-file=/etc/my.cnf --user=root --password=***** --copy-back /data/mysql_backup/full/2018-10-19_03-40-04/
# 修改权限
chown -R mysql:mysql /data/mysql/data/
# 全量+增量恢复。需执行以下命令,将增备数据全部恢复到全备文件夹中,以下假设有两次增备
# 1.让全备文件夹同步已经提交的事务至数据文件
innobackupex --apply-log --redo-only /data/mysql_backup/full/2018-10-19_03-40-04/
# 2.让增备1同步已经提交的事务至全备数据文件(--redo-only:合并已提交事务,不合并回滚事务,避免增备之间数据无法衔接)
innobackupex --apply-log --redo-only /data/mysql_backup/full/2018-10-19_03-40-04/ --incremental-dir=/data/mysql_backup/increment/2018-10-19_06-02-42/
# 3.让增备2同步已经提交的事务及回滚未提交的事务至全备数据文件,注意最后次增量不需加 --redo-only 参数
innobackupex --apply-log /data/mysql_backup/full/2018-10-19_03-40-04/ --incremental-dir=/data/mysql_backup/increment/2018-10-20_08-00-00/
# 此时该全备文件夹已包含所有增量备份数据,依次按以上全备恢复命令,可恢复数据。
启动数据库,检查数据是否OK
service mysql start
附备份脚本
#!/bin/sh
##### ###### ###### ###### ###### ###### ###### #
# 1、每7天一次全备,每天一次增量
# 2、备份保留60天
##### ###### ###### ###### ###### ###### ###### #
export PATH=$PATH:/percona/bin
INNOBACKUPEX_CMD=/percona/bin/innobackupex
MYSQL_CMD="--host=127.0.0.1 --user=root --password=\'********\' --port=3306"
MYSQL_UP="--user=root --password=\'********\' --port=3306 --host=127.0.0.1"
TMPLOG="/mysql_bak/backup/innobackupex.$$.log"
MY_CNF=/etc/my.cnf
BACKUP_DIR=/mysql_bak/backup
FULLBACKUP_DIR=$BACKUP_DIR/full
INCRBACKUP_DIR=$BACKUP_DIR/incre
FULLBACKUP_INTERVAL=604800
KEEP_FULLBACKUP=4
logfile=/mysql_bak/backup/logs/backup.`date +%Y%m%d%H%M`.log
STARTED_TIME=`date +%s`
echo "----------------------------"
echo "开始备份于: `date +%F\' \'%T\' \'%w`"
mkdir -p $FULLBACKUP_DIR
mkdir -p $INCRBACKUP_DIR
mkdir -p /mysql_bak/backup/logs
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`
if [ "$LATEST_FULL_BACKUP" -a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份目录命名"
echo " "
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
mkdir -p $NEW_INCRDIR
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d | sort -nr | head -1`
if [ ! $LATEST_INCR_BACKUP ] ; then
INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
echo -e "增量备份将以$INCRBASEDIR作为备份基础"
echo " "
else
INCRBASEDIR=$LATEST_INCR_BACKUP
echo -e "增量备份将以$INCRBASEDIR作为备份基础"
echo " "
fi
echo "使用$INCRBASEDIR作为基础做新的增量备份."
$INNOBACKUPEX_CMD --defaults-file=$MY_CNF --use-memory=8G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1
else
echo "*********************************"
echo -e "正在执行全新的完全备份...请稍等..."
echo "*********************************"
$INNOBACKUPEX_CMD --defaults-file=$MY_CNF --use-memory=8G $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1
fi
cat $TMPLOG > $logfile
if [ -z "`tail -1 $TMPLOG | grep \'innobackupex: completed OK!\'`" ] ; then
echo "$INNOBACKUPEX命令执行失败:"; echo
echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
cat $TMPLOG
rm -f $TMPLOG
exit 1
fi
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"\'\" ) ; print p[2] }" $TMPLOG`
rm -f $TMPLOG
echo -n "数据库成功备份到:$THISBACKUP