chmod -R /xxx/xxx 。
通过上面的介绍可以看出Outfile这个命令只能用于日常开发的场景下需要测试数据临时导出,不能作为热备的主要工具,但是这个命令对于Mysqldump来说是启发性的。如何使用? 前提条件:在具体的导出之前我们需要了解Mysql导出的具体路径,使用下面的语句检查一下当前的安全文件导出前缀,注意结果如果为NULL在Mysql5.6版本没有影响但是Mysql5.7版本是存在影响的。 另外个人使用的Mac系统的文件系统管理虽然和Linux大体一致,但是其实有很多权限等等细节问题也是踩了一波小坑。
show variables like '%secure%'
-- secure_file_priv NULL
为什么说使用secure_file_priv为NULL是存在影响的?
解答:
Mysql5.7的版本中,在Mysql启动的时候,如果使用了这个参数的配置则会 限制你可以使用LOAD DATA INFILE加载文件的范围,意味着如果想要导出必须是在这个配置指定的目录下面才能成功,下面是此配置对应的变化:
1. secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
2. secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
3. secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
完成上面这些准备工作之后,我们需要搭建基本的操作环境,比如新建数据库或者表,这里依然使用了sakila数据库,我们可以使用下面的命令进行尝试导出,比如下面的语句中我们将payment表的所有数据导出。
select * from payment into Outfile '/Users/xxx/xxx/a.csv'
注:Sakila数据库在Mysql官方的example中可以直接下载。但是实际执行过程中会出现如下的报错,从报错信息可以看到这里是因为
secure_file_priv为NULL的问题:
1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, Time: 0.004000s
再次强调个人学习的时候使用的是macos系统,设置起来比较麻烦这里也不啰嗦具体细节了,主要讲一下处理思路:
my.ini文件并且放到/etc 的目录下面(Mysql读取配置文件规则最高优先级),在文件结尾设置此参数:secure_file_priv=/Users/xxxx/xxx/然后:x保存(注意用sudo vim my.ini),导出路径建议选的当前/User/xxx家目录,方便导出之后立马打开。(根路径路径不太安全,macos系统也不允许你这么弄)
PermissionError: [Errno 13] Permission denied,明显是macOs的权限问题,通过命令chmod 777 导出文件夹/*可以给整个文件夹开放权限(根目录不要这样做)。
Macos使用brew安装Mysql会发现没有my.ini文件,个人从网上翻了份能用的直接在下面链接提供的文件尾部添加secure_file_priv=/Users/xxxx/xxx/即可 ,省去大伙的时间,当然是针对我这种蛋疼的MacOs系统来说的,其他操作系统应该可以直接找到相关配置文件。 链接: https://pan.baidu.com/s/1bM3cQtaXMl3ZGNgQRzhEMA 提取码: phkg
插曲:Maxos使用homebrew安装版本的启动和关闭: 关闭:上面啰嗦一大堆之后,下面是最终导出的结果,可以看到默认只使用了空格分隔,并且格式比较乱:sudo pkill -9 mysql启动:cd /usr/local/mysql/support-file/mysql.server start(stop关闭)
Outfile使用也是比较好记的,同时下面是Outfile的一些使用参数,通过这些参数可以自由配置:
SELECT ... INTO Outfile 'file_name'
[CHARACTER SET charset_name]
[export_options]
export_options:
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
我们发现上面的格式比较混乱,我们 希望按照规范表格的形式导出,于是我们可以在每一行的数据之间添加都好,让导出之后的数据保持规范。
select * from payment into Outfile '/Users/xxx/xxx/a.csv' FIELDS terminated by ','
从结果可以看出Outfile只能用作一些简单的场景的导出操作:
到此为止我们只需要简单了解这个命令即可,为下面了解Mysqldump打下原理基础。
Mysqldump的命令可以看作是Outfile命令的扩展,作为十分重要的备份工具经常用于开发和测试的场景,当然线上不推荐使用这种命令操作,一般需要由运维人员操作来导出需要的数据,如果直接对着整个库热备份很容易出问题。
「知识点」
任何工具类的东西适合使用的时候查阅,死记硬背是没有意义的,最后会发现只需要记住常用的方式即可。 https://dev.mysql.com/doc/refman/8.0/en/Mysqldump.html
SELECT权限。
SHOW VIEW权限。
TRIGGER权限。
--no-tablespaces选项则需要PROCESS权限。
CREATE、ALTER、DELETE权限
-- 第一种备份方法
./Mysqldump -uroot -pxxxxxx sakila > /Users/xxx/xxx/xxx/xxxx/backup-file.sql
-- Mysqldump: [Warning] Using a password on the command line interface can be insecure.
备份多个数据库到一个sql文件
./Mysqldump --databases sakila sakila-db -uroot -xxx > /Users/xxx/xx/xxxx/xxx/backup-file_bk2.sql
将数据从一个服务器备份到另一个服务器
-- 个人是本地单机没有进行虚拟机模拟,实验结果未知
Mysqldump --opt db_name | mysql --host=remote_host -C db_name
如果使用InnoDB 的存储引擎Mysql有一种在线备份的方法:
-- 参数解释
-- --all-databases 所有数据库
-- --single-transaction RR级别的备份,也就是确保一致性的视图(Innodb存储引擎)
-- --master-data 将二进制日志文件的名称和位置写到输出端(留意一下,为下文的增量备份铺垫)
-- 如果不是InnoDB,需要使用下面的参数:
-- 1. --lock-all-tables 使用FTWRL锁锁住所有表(MyISAM)
-- 2. --lock-tables 使用READ LOCAL锁住当前库的表(MyISAM)
Mysqldump -uroot -pxx --all-databases --master-data --single-transaction > /Users/xxx/xxx/all_databases.sql
还原数据库
--
./Mysqldump -uroot -pxxxxxx sakila < /Users/xxx/xxx/xxx/xxxx/backup-file.sql
-- 第二种还原备份方法
-- 1. 使用具备相关权限的用户名和密码登陆连接到mysql服务器 mysql -uroot -proot
-- 2. source /xxx路径/xx.sql文件 source xxx.sql
-- 第三种方式
mysql -e "source /path-to-backup/backup-file.sql" db_name
关于其他的命令这里就不再扩展了,这里介绍一些常用的基本够日常开发使用了,如果需要更多的写法可以参考上面的官方文档。
为什么不能同时增量和全量备份: 我们可以把 Mysql记录日志的过程看作是在纸上写字,此时Mysql在最新的Binlog日志中记录内容,如果我们把正在写的内容和之前的日志内容一并备份,就很可能导致备份出写了一半的数据,就好像我们写字的时候突然被抽中本子一样,这样就很有可能导致数据损坏。 Binlog 忠实记录mysql变化,全量增量备份和还原过程。 实现增量备份的关键点在于如何给Binlog日志做切入点,做Mysqldump增量备份存在的最大问题是我们无法知道当前的全量备份和增量数据的分界点。Binlog日志记录的是Mysql的变化内容比如CRUD的数据记录变动记录以及数据的结构的调整等等,并且和InnoDB的存储引擎的
redo log双写保持事务一致性。
根据上面的内容介绍我们知道了Mysqldump只能全量备份,需要借助Binlog日志完成增量备份。
增量备份实现思路是在备份的时候将当前正在读写的Binlog日志停掉,并且将此文件进行拷贝,但是需要注意的是此时拷贝的是Binlog文件,和日常编写的逻辑SQL是不一样的,切记。
关键点:Mysqldump备份,Mysql服务器停止当前Binlog写入并且切换新的Binlog文件
Mysqldump提供了类似上面提到的操作,下面是Mysqldump全量备份+增量备份的操作流程:
-- --all-databases 所有数据库
-- --single-transaction RR级别的备份,也就是确保一致性的视图(Innodb存储引擎)
-- --master-data=[=Value](8.0.26改为--source-data命令) 将二进制日志文件的名称和位置写到输出端(留意一下,为下文的增量备份铺垫)
-- --flush-logs 在备份之前刷新服务器的日志
Mysqldump -uroot -pxx --all-databases --master-data=2 --flush-logs --single-transaction > /Users/xxx/xxx/all_databases.sql
通过执行上面的命令之后首先会进行全量备份同时会把Binlog切换到下一份日志文件重新开始进行读写,此时就可以把这一份停止写入对binlog日志文件备份出来进行后续的增量备份还原,简而言之:Mysql备份的同时切换Binlog,并且把当前写了一部分的Binlog日志进行拷贝。
Mysql其实还有一种备份方式那就是Binlog手动增量备份,实现方式是直接使用命令把缓存的日志刷到磁盘中并且切换到下一个Binlog,它的命令格式如下:
mysqladmin -uroot -p123456 flush-logs
需要注意的是这里使用的是mysqladmin工具,在执行命令之后我们可以手动将所有的Binlog进行备份。
还原方式:全量还原 + Binlog还原,还原操作和增量全量备份方式对应,因为是Mysqldump全量+Binlog增量备份,所以同样需要先进行全量还原再增量还原。
恢复全量备份:还原的操作最简单的方式是连接服务器之后执行source xxx.sql ,而Binlog增量还原操作案例如下:
mysqlBinlog Mysql-bin.00002 ... | mysql -uroot -p123456
小结
Mysqldump + Binlog 可以有效进行全量 + 增量备份。redo log文件变化的同时,备份Idb文件和备份过程中进行了改动的redo log文件。
FTWRL锁是啥?注意在第四步给整个库加全局锁会有一段时间数据库是处于温备的情况的(不能进行读写)。 这里还存在一个问题,如何知道哪些数据是增量数据?Xtrabackup的思路是在Mysql中每一个数据页存在一个LSN号码,在备份的时候可以通过这个LSN号确定哪个页存在变化,当进行过一次全量备份之后记录变化过数据的LSN号,在下一次备份可以直接找比上一次LSN号更大的值进行备份。FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与Binlog位点匹配)。需要注意的是这个锁的粒度非常大,基本是锁住整个库的等级,如果是备份主库会导致整个主库“卡”住,从库则会导致线程等待。 所需权限:FLUSH_TABLES和RELOAD权限。 由于这里讲的主要是备份的内容,想进一步了解FTWRL锁实现细节和使用教程可以参考下面的博客:
LSN(log sequence number):日志序列号,是一个一直递增的整形数字,在MySQL5.6.3版本后占8个字节。它表示事务写入到日志的字节总量。LSN主要用于发生crash时对数据进行recovery!每个数据页、重做日志、checkpoint都有LSN。
ibbackup,它是由Innodb官方开发,后续被改名为Mysql Enterprise Backup,由于这个软件为收费软件用户并不多,所以后续出现了完全替代品Xtrabackup并且被广泛使用。
Xtrabackup是由percona开源的免费数据库备份软件,不同于Mysqldump这是一个第三方公司开发的软件,在前面提到的Mysqldump命令是逻辑备份,逻辑备份最大的问题是在数据量特大的情况下导出会十分缓慢并且十分影响数据库的读写性能,并且导出的时候需要对于数据库进行“RR级别”的锁定或者使用表锁(MyISAM),所以对于大数据量还是建议使用物理备份的方式备份。
Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup。下面是xtrabackup其他工具的大致介绍:
1)xtrabackup 是专门用来备份InnoDB表的,和mysql server没有交互;
2)innobackupex 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
3)xbcrypt 加密解密备份工具
4)xbstream 流传打包传输工具,类似tar
注意里面包含很多软件,这里找到如上截图所示的界面,根据自己的Mysql 版本下载:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
[root@centos ~]# ll
total 703528
-rw-r--r-- 1 root root 654007697 Sep 27 09:18 mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
-rw-r--r-- 1 root root 65689600 Nov 30 00:11 Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
[root@centos ~]# tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
[root@centos ~]# yum install percona-xtrabackup-24-2.4.9-1.el6.x86\_64.rpm -y
[root@centos ~]# which xtrabackup
/usr/bin/xtrabackup
[root@centos ~]# innobackupex -v
innobackupex version 2.4.9 Linux (x86\_64) (revision id: a467167cdd4)
#已经安装完成
[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password="123456" --backup /root
执行完成之后,会在对应的目录里面新增一个日期文件目录,接着我们需要同步log日志:
#使用此参数使用相关数据性文件保持一致性状态
[root@centos ~]#innobackupex --apply-log /root/(日期)/
最后我们通过下面的命令对于备份文件进行恢复:
[root@centos ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/
[root@Vcentos ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /backup/ --incremental-basedir=/root/(日期)
#--incremental /backup/ 指定增量备份文件备份的目录
#--incremental-basedir 指定上一次全备或增量备份的目录
增量备份的恢复命令:
[root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/
[root@centos ~]# innobackupex --apply-log --redo-only /root/(日期)/ --incremental-dir=/backup/(日期)/
如果需要恢复全部的数据,可以使用下面的命令处理:
[root@centos ~]#innobackupex --defaults-file=/etc/my.cnf --copy-back /root/(日期)/
增量备份合并至全量备份,可以使用下面的命令:
innobackupex --apply-log bakdir/xxx-xx-xx/ --incremental-dir=basedir/YYYY-YY-YY/
小结
_bak进行标记。文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。
目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.
我是Ruby的新手。我安装了DataMapper并且正在尝试安装dm-mysql-adapter-1.0.2gem。但是当我尝试安装时,出现以下错误。我正在使用ubuntu操作系统。vinoth@vinoth-laptop:~/Downloads$geminstalldm-mysql-adapter-1.0.2----with-mysql-lib=/usr/lib/mysql----with-mysql-conf=/usr/bin/mysqlWARNING:Installingto~/.gemsince/home/vinoth/gemsand/home/vinoth/gems/bina
我目前正在构建一个需要mysql2gem的RoR项目。我成功安装了gem。因为它出现在我的gem列表中。[root@vc2cmmka035538nsimple_cms]#gemlist***LOCALGEMS***actionmailer(3.2.3)actionpack(3.2.3)activemodel(3.2.3)activerecord(3.2.3)activeresource(3.2.3)activesupport(3.2.14,3.2.3)arel(3.0.2)bigdecimal(1.1.0)builder(3.2.2,3.0.0)bundler(1.1.5)c2c_li
我想使用托管在我自己服务器上的mysql数据库。我已经更改了DATABASE_URL和SHARED_DATABASE_URL配置变量以指向我的服务器,但它仍在尝试连接到heroku的amazonaws服务器。我该如何解决? 最佳答案 根据Herokudocumentation,更改DATABASE_URL是正确的方法。Ifyouwouldliketohaveyourrailsapplicationconnecttoanon-Herokuprovideddatabase,youcantakeadvantageofthissamemec
使用mysql2做查询总是得到警告/usr/local/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6/lib/active_record/connection_adapters/mysql2_adapter.rb:463:warning::database_timezoneoptionmustbe:utcor:local-defaultingto:local我确实看到了时区选项Mysql2现在支持两个时区选项::database_timezone-thisisthetimezoneMysql2willassumefieldsarealreadystored
每次我跑:gitpushherokumaster我收到以下错误:Running:rakeassets:precompilerakeaborted!Can'tconnecttoMySQLserveron'127.0.0.1'我在运行rails-vRails3.2.11和ruby-vruby1.9.3p194(2012-04-20revision35410)[x86_64-darwin12.2.0]我已经通过HerokuCLI安装了ClearDB,它似乎工作正常,但我无法找出这个错误。这是我用于生产的yml:production:adapter:mysql2encoding:utf8hos