linux导出mysql数据库,linux系统下的mysql导入导出
各位老铁们,大家好,今天由我来为大家分享linux导出mysql数据库,以及linux系统下的mysql导入导出的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
linux系统下的mysql导入导出
1不停数据库写的情况下,也可以使用 mysqldump导出,但因为 mysqldump导出时会加表锁(lock tables table_name read;),导出过程中会阻塞写(应用程序的写数据库或其他情况的写),不会影响读。
2导入一个备份后,还要继续同步备份的操作,那必须结合同步来进行,先导出导入数据(导出时注意加上--master-data选项,或导出前 show master status记下日志名称和位置),再配置同步,并启动同步;
3日志记录的编号,也就是 position,可以在导出前查询,也可以在导出时加--master-data选项一并进行;
--几个注意事项:
1导出会加表锁(这是服务器级的读锁),如果数据库较大,可能会影响业务;较小的话,可以在数据库本机进行导出,时间很快;
2大数据库一定要做个备份机(即replication的slave),同步会涉及到数据的一致性(备份、启用同步)问题,可以深入理解下;
Linux系统下怎么把MySQL的数据库拷贝出来
每当我们讨论一项(新的)领域技术的时候,最好的方式通常是首先抛出一些问题,这些问题大致分为三类:
诶?这项技术又是什么玩意(What)?
这项技术为什么会存在?我们已经有那么多解决方案(Method)了,我们为什么要用它(Why)?
如果这项技术那么好且我们正好有场景可以用到这项技术,且能使我们的系统得到很乐观的优化,那么我们怎么用呢(How)?
大概已经有同学觉得这些问题很熟悉了,是的,这就是黄金全法则提出的三个问题,对于每种新鲜事物我们首先基于这三个问题去了解,更有利于弄清楚事情的本质,端正态度去了解,而不是因为新,因为大家都说好,才要去了解……。说了那么多前奏,我们可以开始了,今天我们就带着黄金圈法则提出的三个问题去看看MySQL数据库复制这项领域技术,然后再结合实际应用扩展一些问题,本文也仅仅是结合自己了解的皮毛以抛砖引玉的态度和大家一起分享。
WHAT?
MySQL复制使得一台MySQL数据库服务器的数据被拷贝到其他一台或者多台数据库服务器,前者通常被叫做Master,后者通常被叫做Slave。
MySQL复制示意图
复制的结果是集群(Cluster)中的所有数据库服务器得到的数据理论上都是一样的,都是同一份数据,只是有多个copy。MySQL默认内建的复制策略是异步的,基于不同的配置,Slave不一定要一直和Master保持连接不断的复制或等待复制,我们指定复制所有的数据库,一部分数据库,甚至是某个数据库的某部分的表。
MySQL复制支持多种不同的复制策略,包括同步、半同步、异步和延迟策略等。
同步策略:Master要等待所有Slave应答之后才会提交(MySql对DB操作的提交通常是先对操作事件进行二进制日志文件写入然后再进行提交)。
半同步策略:Master等待至少一个Slave应答就可以提交。
异步策略:Master不需要等待Slave应答就可以提交。
延迟策略:Slave要至少落后Master指定的时间。
MySQL复制同时支持多种不同的复制模式:
基于语句的复制,Statement Based Replication(SBR)。
基于行的复制Row Based Replication(RBR)。
混合复制(Mixed)。
WHY?
这个问题其实也就是MySQL复制有什么好处,我们可以将复制的好处归结于下面几类:
性能方面:MySQL复制是一种Scale-out方案,也即“水平扩展”,将原来的单点负载扩散到多台Slave机器中去,从而提高总体的服务性能。在这种方式下,所有的写操作,当然包括UPDATE操作,都要发生在Master服务器上。读操作发生在一台或者多台Slave机器上。这种模型可以在一定程度上提高总体的服务性能,Master服务器专注于写和更新操作,Slave服务器专注于读操作,我们同时可以通过增加Slave服务器的数量来提高读服务的性能。
防腐化:由于数据被复制到了Slave,Slave可以暂停复制进程,进行数据备份,因此可以防止数据腐化。
故障恢复:同时多台Slave如果有一台Slave挂掉之后我们还可以从其他Slave读取,如果配置了主从切换的话,当Master挂掉之后我们还可以选择一台Slave作为Master继续提供写服务,这大大增加了应用的可靠性。
数据分析:实时数据可以存储在Master,而数据分析可以从Slave读取,这样不会影响Master的性能。
HOW?
这里我们只介绍一下MySQL的复制是如何工作的,至于配置,网上也有很多相关的介绍,读者具体应用的时候可以再去查阅。我们拿最常用的基于二进制文件的复制来看看。
MySQL复制工作示意图
请点击输入图片描述
请点击输入图片描述
MySQL的复制过程大概如下:
首先,主库在每次准备提交事务完成数据更新操作之前都会将数据更改操作记录到二进制日志中,这些日志是以二进制的方式记录数据更改的事件。值得一提的是二进制日志中记录的顺序实际上是事务的提交顺序,而非SQL执行语句的顺序。在记录二进制日志之后,主库会告诉存储引擎事务可以提交了。
然后,备库会启动一个IO线程,之所以叫做IO线程是因为这个线程专门做IO相关的工作,包括和主库建立连接,然后在主库上启动一个特殊的二进制转储线程,这个转储线程会不断的读取二进制日志中的事件,发送给备库的IO线程,备库的IO线程会将事件记录到中继日志中。
备库会有一个叫做SQL的线程被开启,这个线程做的事情是读取中继日志中的DB操作事件在备库执行,从而实现数据更新。
总的来说,在发生复制的主库服务器和备库服务器中,一共有三个线程在工作。
上面我们已经大概了解的什么是复制?为什么要复制?如何复制?这三个问题了,接下来我们基于上面的介绍,提出一些实际应用可能会发生的问题来思考如何解决。博主自问自答的方式-。-
问答环节
问题一:通过复制模型虽然读能力可以通过扩展slave机器来达到提高,而写能力却不能,如果写达到瓶颈我们应该怎么做呢?
答:我们首先会得出结论,这种复制模型对于写少读多型应用是非常有优势的,其次,当遇到这种问题的时候我们可以对数据库进行分库操作,所谓分库,就是将业务相关性比较大的表放在同一个数据库中,例如之前数据库有A,B,C,D四张表,A表和B表关系比较大,而C表和D表关系比较大,这样我们把C表和D表分离出去成为一个单独的数据库,通过这种方式,我们可以将原有的单点写变成双点写或多点些,从而降低原有主库的写负载。
问题二:因为复制是有延迟的,肯定会发生主库写了,但是从库还没有读到的情况,遇到这种问题怎么办?
答:MySQL支持不同的复制策略,基于不同的复制策略达到的效果也是不一样的,如果是异步复制,MySQL不能保证从库立马能够读到主库实时写入的数据,这个时候我们要权衡选择不同复制策略的利弊来进行取舍。所谓利弊,就是我们是否对从库的读有那么高的实时性要求,如果真的有,我们可以考虑使用同步复制策略,但是这种策略相比于异步复制策略会大大降低主库的响应时间和性能。我们是否可以在应用的设计层面去避开这个问题?
问题三:复制的不同模式有什么优缺点?我们如何选择?
答:基于语句的复制实际上是把主库上执行的SQL在从库上重新执行一遍,这么做的好处是实现起来简单,当前也有缺点,比如我们SQL里面使用了NOW(),当同一条SQL在从库中执行的时候显然和在主库中执行的结果是不一样的,注入此类问题可以类推。其次问题就是这种复制必须是串行的,为了保证串行执行,就需要更多的锁。
基于行的复制的时候二进制日志中记录的实际上是数据本身,这样从库可以得到正确的数据,这种方式缺点很明显,数据必须要存储在二进制日志文件中,这无疑增加的二进制日志文件的大小,同时增加的IO线程的负载和网络带宽消耗。而相比于基于语句的复制还有一个优点就是基于行的复制无需重放查询,省去了很多性能消耗。
无论哪种复制模式都不是完美的,日志如何选择,这个问题可以在理解他们的优缺点之后进行权衡。
问题四:复制的工作过程只有三个线程来完成,对于Master来说,写是并发的,也就出现了一个IO线程要把所有并发的数据变更事件记录,这个IO线程会不会累死?当一个Master对应多个Slave的时候,其实在Master中会唤起多个IO线程,这无疑会增加Master的资源开销,如果出现事件堆积,也就是事件太多,来不及及时发送出去怎么办?另外就是Slave那边的IO线程和SQL线程也会有对应主库并发数据变更事件,而Slave方单个线程处理的问题,这个时候Slave线程会不会累死?
答:上面的问题确实会发生,上面第一个问题和第二个问题其实是写负载的问题,当事件堆积太多,从库时延就会变大,Slave单SQL线程问题据说有参数可以开启并行操作,这个大家可以确认一下。
问题五:针对复制工作过程可能会出现的问题,主库写完二进制日志文件同时都会保存二进制日志的偏移量,但是当断电的时候,二进制日志文件没有刷新到磁盘,主库重新启动之后,从库尝试读该偏移量的二进制日志,会出现读不到的情况,这个问题应该怎么解决?
答:首先如果开启了sync_binlog选项,对于innodb同时设置innodb_flush_log_at_trx_commot=1,则可以保证二进制日志文件会被写入磁盘,但MyISAM引擎可能会导致数据损坏。如果没有开启这个选项,则可以通过制定从库的二进制偏移量为下一个二进制日志文件的开头,但是不能解决事件丢失问题。
问题六:从库在非计划的关闭或重启时,回去读master.info文件去找上次停止复制的位置,这同样会有一个问题,如果master.info不正确,就会导致复制数据不一致的情况,遇到这个问题怎么办?
答:这个问题可以通过两种方式解决,一是控制master.info在从库非计划关闭或重启的时候让master.info能够同步到磁盘,这样下次启动的时候就不会读取错误的信息,这有助于减少错误的发生概率。另外想要找到正确的复制位置是困难的,我们也可以选择忽略错误。
请点击输入图片描述
请点击输入图片描述
linux mysql 导出数据
一、导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):
1、导出数据和表结构:
mysqldump-u用户名-p密码数据库名>数据库名.sql
#/usr/local/mysql/bin/ mysqldump-uroot-p abc> abc.sql
敲回车后会提示输入密码
2、只导出表结构
mysqldump-u用户名-p密码-d数据库名>数据库名.sql
#/usr/local/mysql/bin/ mysqldump-uroot-p-d abc> abc.sql
注:/usr/local/mysql/bin/---> mysql的data目录
二、导入数据库
1、首先建空数据库
mysql>create database abc;
2、导入数据库
方法一:
(1)选择数据库
mysql>use abc;
(2)设置数据库编码
mysql>set names utf8;
(3)导入数据(注意sql文件的路径)
mysql>source/home/abc/abc.sql;
方法二:
mysql-u用户名-p密码数据库名<数据库名.sql
#mysql-uabc_f-p abc< abc.sql
建议使用第二种方法导入。
注意:有命令行模式,有sql命令
linux 进入mysql 命令行模式怎么导出
1、在终端中输入mysql-u用户名-p密码命令可以进行mysql命令行
2、如果密码有特殊字符就先mysql-u用户名-p回车,然后提示输入密码后,再输入密码回车即可
3、mysql其它参数说明:
mysql命令行参数
Usage: mysql [OPTIONS] [database]//命令方式
-?,--help//显示帮助信息并退出
-I,--help//显示帮助信息并退出
--auto-rehash//自动补全功能,就像linux里面,按Tab键出提示差不多,下面有例子
-A,--no-auto-rehash//默认状态是没有自动补全功能的。-A就是不要自动补全功能
-B,--batch//ysql不使用历史文件,禁用交互
(Enables--silent)
--character-sets-dir=name//字体集的安装目录
--default-character-set=name//设置数据库的默认字符集
-C,--compress//在客户端和服务器端传递信息时使用压缩
-#,--debug[=#]//bug调用功能
-D,--database=name//使用哪个数据库
--delimiter=name//mysql默认命令结束符是分号,下面有例子
-e,--execute=name//执行mysql的sql语句
-E,--vertical//垂直打印查询输出
-f,--force//如果有错误跳过去,继续执行下面的
-G,--named-commands
/*Enable named commands. Named commands mean this program's
internal commands; see mysql> help. When enabled, the
named commands can be used from any line of the query,
otherwise only from the first line, before an enter.
Disable with--disable-named-commands. This option is
disabled by default.*/
-g,--no-named-commands
/*Named commands are disabled. Use\* form only, or use
named commands only in the beginning of a line ending
with a semicolon(;) Since version 10.9 the client now
starts with this option ENABLED by default! Disable with
'-G'. Long format commands still work from the first
line. WARNING: option deprecated; use
--disable-named-commands instead.*/
-i,--ignore-spaces//忽视函数名后面的空格.
--local-infile//启动/禁用 LOAD DATA LOCAL INFILE.
-b,--no-beep//sql错误时,禁止嘟的一声
-h,--host=name//设置连接的服务器名或者Ip
-H,--html//以html的方式输出
-X,--xml//以xml的方式输出
--line-numbers//显示错误的行号
-L,--skip-line-numbers//忽略错误的行号
-n,--unbuffered//每执行一次sql后,刷新缓存
--column-names//查寻时显示列信息,默认是加上的
-N,--skip-column-names//不显示列信息
-O,--set-variable=name//设置变量用法是--set-variable=var_name=var_value
--sigint-ignore//忽视SIGINT符号(登录退出时Control-C的结果)
-o,--one-database//忽视除了为命令行中命名的默认数据库的语句。可以帮跳过日志中的其它数据库的更新。
--pager[=name]//使用分页器来显示查询输出,这个要在linux可以用more,less等。
--no-pager//不使用分页器来显示查询输出。
-p,--password[=name]//输入密码
-P,--port=#//设置端口
--prompt=name//设置mysql提示符
--protocol=name//使用什么协议
-q,--quick//不缓存查询的结果,顺序打印每一行。如果输出被挂起,服务器会慢下来,mysql不使用历史文件。
-r,--raw//写列的值而不转义转换。通常结合--batch选项使用。
--reconnect//如果与服务器之间的连接断开,自动尝试重新连接。禁止重新连接,使用--disable-reconnect。
-s,--silent//一行一行输出,中间有tab分隔
-S,--socket=name//连接服务器的sockey文件
--ssl//激活ssl连接,不激活--skip-ssl
--ssl-ca=name//CA证书
--ssl-capath=name//CA路径
--ssl-cert=name//X509证书
--ssl-cipher=name//SSL cipher to use(implies--ssl).
--ssl-key=name//X509密钥名
--ssl-verify-server-cert//连接时审核服务器的证书
-t,--table//以表格的形势输出
--tee=name//将输出拷贝添加到给定的文件中,禁时用--disable-tee
--no-tee//根--disable-tee功能一样
-u,--user=name//用户名
-U,--safe-updates//Only allow UPDATE and DELETE that uses keys.
-U,--i-am-a-dummy//Synonym for option--safe-updates,-U.
-v,--verbose//输出mysql执行的语句
-V,--version//版本信息
-w,--wait//服务器down后,等待到重起的时间
--connect_timeout=#//连接前要等待的时间
--max_allowed_packet=#//服务器接收/发送包的最大长度
--net_buffer_length=#//TCP/ IP和套接字通信缓冲区大小。
--select_limit=#//使用--safe-updates时SELECT语句的自动限制
--max_join_size=#//使用--safe-updates时联接中的行的自动限制
--secure-auth//拒绝用(pre-4.1.1)的方式连接到数据库
--server-arg=name//Send embedded server this as a parameter.
--show-warnings//显示警告
好了,文章到此结束,希望可以帮助到大家。