1. 从官方网站下载Percona XtraBackup,依赖环境rsync perl-DBD-Mysql libev,使用yum源安装以上依赖,高版本的mysql可能还需要mysql-community-libs-compat适配支持.
2. 从github上下载autoxtrabackup脚本.
利用autoxtrabackup配置一定的参数可以实现定期增量备份.
backupDir=/home/database_bak 备份路径
hoursBeforeFull=240 全量备份间隔时间
mysqlUser=root 本地数据库备份采用用户名
mysqlPwd=root 本地数据库备份采用密码
compression=false 备份是否压缩
compressThreads=8 压缩线程
keepDays=30 备份持有时间
sendEmail=never 备份完成是否发邮件
emailAddress=
配置好参数之后添加到crontab任务调度中(每天晚上23点备份数据库).
00 23 * * * /home/software/autoxtrabackup/autoxtrabackup.sh
备份生成的路径如下:
/home/database_bak/
├── 2018-08-24_11-27-36_full
├── 2018-08-24_13-23-51_incr
├── 2018-08-24_23-40-01_incr
├── 2018-08-25_23-40-01_incr
└── 2018-08-26_23-40-01_incr
注意: 如果要还原数据, 首先要先备份已经备份的数据, 特别是全量数据.
autoxtrabackup的备份原则是一天一个相对于全量的增量的备份, 而不是相对于上一次的增量备份的增量. 所以在看xtrabackup的文档的时候, 需要注意由于采取的备份策略不同, 还原流程也是不一样的,具体对比可以看扩展内容.
根据增量备份数据还原数据库流程, 假设我需要还原2018-08-26的数据库数据
1. 找到最后一次的完整备份
innobackupex –apply-log –redo-only /home/database_bak/2018-08-24_11-27-36_full/
2. 找到2018-08-26的增量备份
innobackupex –apply-log /home/database_bak/2018-08-24_11-27-36_full/ –incremental-dir=/home/database_bak/2018-08-26_23-40-01_incr/
3. 准备数据
innobackupex –apply-log /home/database_bak/2018-08-24_11-27-36_full/
4. 回拷数据
innobackupex –copy-back /home/database_bak/2018-08-24_11-27-36_full/
5. 更改文件权限
chown –R mysql:mysql
6. 启动mysql服务
server mysqld start
对比标准增量备份和autoxtrabackup增量备份
官方推荐的使用办法是创建一个原始的增量备份, 第一次增量备份是针对全量备份, 第二次备份是针对第一次增量备份的增量备份, 同理第三次是针对第二次的增量备份.
而autoxtrabackup采用的是每次都针对原始的全量备份的增量备份.
二者在还原的时候自然也不一样, 标准的备份需要把增量一次一次的还原进去, 这样比较灵活. autoxtrabackup则增加实用, 需要还原的时候只需要找到全量备份,并且拿对应日期的增量备份, 即可还原到全部数据, 当然中间日期的数据就会有冗余.
使用环境就各自根据自己的环境确定吧, 如果每天新增数据比较多, 就采用官方的标准备份, 如果不是很多, 可以接受冗余数据, 并且为了方便的话可以采用autoxtrabackup脚本进行备份.
TypeError: not enough arguments for format string
使用Python连接数据库的时候,采用的非常非常轻量级的torndb,甚至于事务都不支持,所以用”select * from table where condition=’%s'” % (condition,)
因为用的比较原生,所以各种问题接连不断,最最恶心的就是字符串转义造成的一些列原因.
先采用
condition = re.escape(condition)
能对特殊字符进行转义,但是还是有问题,又报错TypeError: not enough arguments for format string 直到认真看输入的condition字符串的时候,才发现问题所在之处: condition中有% 需要替换%为%%才能正常执行,
condition= condition.replace('\%', '%%')
其实标题有问题,不只是操作数据库,只不过在操作数据库时候,忽略的字符串本身的内容,一直在错误的寻找解决方案.
事情的起因是这样的,mysql5.5(包括)以下版本都是不支持设置多个timestamp默认值的,所以当我执行有的表中包含两个timestamp带DEFAULT CURRENT_TIMESTAMP的sql的时候就执行不了了.为了保持代码和数据库的版本一致性,就开始了这次的mysql安装之旅.
第一次安装mysql的时候是大二大三的时候吧,那时候是安装版.我一直以为如果别人的轮子比你造的好,你就不用重复造轮子,所以我以前一直使用的是mysql的集成环境,即使是在linux上面安装mysql也都是按照教程一点一点儿来的,只有当现有的东西不能满足的情况下,才需要自己动手.所以才动手安装mysql5.7的.我按照印象去下载mysql,下载下来结果发现是绿色版,一脸懵逼…接下来就简单记录一下mysql安装中需要解决的几个问题.
1. 解压mysql
解压后注意修改解压文件夹的位置,尽量不要放在中文目录下面,虽然我没有测试是否有问题,但是在这上面遇到的坑又不是一次两次了.
2. 增加配置文件: my.ini
修改默认的my-default.ini文件
[mysqld]
basedir=”D:/MySQL/” # mysql的解压路径
datadir=”D:/MySQL/data/” # mysql的数据表的存储路径
3. 初始化mysql (第一个坑)
网上流传的mysql绿色版的安装方式都是没有这一步的最多指定以下my.ini的位置,但是如果跳过这一步,下面的服务项即使是安装成功了,也会处于”mysql –正在启动中吧 mysql — 启动失败”状态中.所以需要进行mysql的初始化工作.在mysql/bin的目录中执行以下代码:
mysqld –defaults-file=my.ini –initialize-insecure
如果报mysqld命令不存在的话,请核对你自己的mysql安装路径是否正确,具体查看参考链接1
4. 安装mysql到服务项
这一步就是简单的 mysqld –install 同时如果想要卸载服务项的话,就使用mysqld –remove
5. 启动服务项
在cmd命令行中敲入net start mysql ,同样的如果需要停止的话,就敲入 net stop mysql
既然是加入到了服务项中,自然也可以在windows的服务管理中找到这个服务,然后进行操作.
6. 增加一个远程的全局权限的用户
这时候在mysql/bin 目录中敲入 mysql -u root 进入到mysql命令行中,修改密码,不知道mysql是哪个版本开始,密码的字段名不再是password而是authentication_string,蜜汁设定...具体查看参考链接2
update user set authentication_string=password('root') where user='root';
这时候的root用户只能在本地访问的,我强制修改数据表的localhost为%还是不行,没有验证是不是配置文件也需要修改,印象中之前的版本就是控制字段就可以 了.这条路行不通,那么我就需要增加一个远程访问的超级管理员用户了.按照参考链接3就尅完成操作了.
创建一个远程访问的超级管理员chen,密码为chen
grant all privileges on *.* to chen@’%’ identified by ‘chen’;
参考:
解决Windows安装解压版MySQL出现服务正在启动-服务无法启动的问题
mysql-user-db-does-not-have-password-columns-installing-mysql-on-osx
mysql创建超级管理员
thinkphp报错mysql_attr_init_command undefined class