MySQL批量更改WordPress文章的发布日期和时间

DATE_ADD(‘2010-1-01’, INTERVAL ROUND(RAND() * 3200 + 1) DAY)

上面的语句是基于2010年产生一个随机日期

concat()可以连接各个字符。

floor(10+rand()*10),’:’,floor(10+rand()*49),’:’,floor(10+rand()*49)这个部分是产生随机时间的

注意日期和时间中间要连接一个空格’ ‘,否则会写入空的内容。

update wp_posts set post_date=concat(DATE_ADD(‘2010-1-01′, INTERVAL ROUND(RAND() * 3200 + 1) DAY),’ ‘, floor(10+rand()*10),’:’,floor(10+rand()*49),’:’,floor(10+rand()*49))  where id > 20016 and post_status = ‘publish’;

update wp_posts set post_date_gmt     = post_date where id > 1 and post_status = ‘publish’;
update wp_posts set post_modified    = post_date where id > 1 and post_status = ‘publish’;
update wp_posts set post_modified_gmt    = post_date where id > 1 and post_status = ‘publish’;

了解 MySQL 双活同步复制四种方案

对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束。

  基于MySQL原生复制主主同步方案  

了解 MySQL 双活同步复制四种方案

这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的。

两个节点可以采用简单的双主模式,并且使用专线连接,在master_A节点发生故障后,应用连接快速切换到master_B节点,反之也亦然。有几个需要注意的地方,脑裂的情况,两个节点写入相同数据而引发冲突,同时把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做,使用更新的数据版本5.7+,可以利用多线程复制的方式可以很大程度降低复制延迟,同时,对复制延迟特别敏感的另一个备选方案,是semi-sync半同步复制,基本上无延迟,不过事务并发性能会有不小程度的损失,特别是在双向写的时候,需要综合评估再决定。

了解 MySQL 双活同步复制四种方案

  基于Galera replication方案  

Galera是Codership提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性,基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)。

了解 MySQL 双活同步复制四种方案
了解 MySQL 双活同步复制四种方案
了解 MySQL 双活同步复制四种方案

目前PXC用的会比较多一些,数据严格一致性,尤其适合电商类应用,不过PXC也是有其局限性的,如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟,因为PXC存在写扩大以及短板效应,并发效率会有较大损失,类似semi-sync半同步复制,Gelera实际只能用三个节点,网络抖动造成的性能和稳定性习惯性问题

  基于Group Replication方案  

了解 MySQL 双活同步复制四种方案

通过Paxos协议提供数据库集群节点数据强一致保证,MGR准确来说是MySQL官方推出的高可用解决方案,基于原生复制技术,并以插件的方式提供,并且集群间所有节点可写入,解决了单个集群的写入性能,所有节点都能读写,解决网络分区导致的脑裂问题,提升复制数据的可靠性,不过现实还是有些残酷,目前尝鲜的并不是很多,同时仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测,必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set

COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景,目前一个MGR集群最多支持9个节点,不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚,二进制日志不支持binlog event checksum

  基于canal方案  

对于数据库的实时同步,阿里巴巴专门有一个开源项目,即otter来实现分布式数据库的同步复制,其核心思想仍然是通过获取数据库的增量数据日志,来进行准实时的同步复制。因此otter本身又依赖于另外一个开源项目即canal,该项目重点则是获取增量数据库同步日志信息。

当前otter的重点是实现mysql间的数据库同步复制,基本即利用的类似技术来实现两个mysql数据库间的双向同步数据库复制。要注意这个双向本身指既可以A->B,也可以从B->A,在某个时间节点本身是单向的。

主从复制分成三步:
了解 MySQL 双活同步复制四种方案

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变反映它自己的数据。

canal原理相对比较简单:
了解 MySQL 双活同步复制四种方案
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)

更多参考 https://github.com/alibaba/canal

MySQL安全策略

 

数据是企业的核心资产,特别是敏感数据,稍有不慎,就会造成数据泄露、非法窃取、恶意破坏等,网络上经常会出现一些社工资源,还有一些敏感数据的交易,大部分的数据都是被非法获取的,我们需要时刻做好安全防护,下面讲针对安全重点谈谈如何从系统层,网络层,应用层,管理层,数据库层来保护数据,当然这里面的部分策略是相互耦合的,不过这个从安全的角度上而言,耦合也是为了更好的保护数据,还有就是,某一策略的缺陷可能会造成木桶效应也需要大家的关注。

系统层

禁用不必要的系统服务,只开必须的进程

禁止使用root账号远程登录

禁止使用root账号启动mysqld等普通业务服务进程

设置GRUB密码

设置专用账号,针对每个用户访问,不使用公用账号

设置系统层的操作审计,记录所有ssh日志

设置操作系统的防火墙,允许部分IP地址的访问

设置操作系统的端口,允许部分端口的访问

设置默认的数据库端口或者SSH端口

设置MySQL及其他数据库服务相关目录权限

设置操作系统历史记录的清除

禁止外网访问,如果实在有需求,可以临时开启,使用完毕需要及时关闭

条件允许可以使用ssh key认证,不允许远程密码登入

条件允许可以使用PAM认证做到账号的统一管理,也更方便、安全

条件允许可以部署堡垒机,所有连接远程服务器都需要先通过堡垒机,堡垒机上就可以实现所有操作记录以及审计功能了。

网络层

设置操作系统的防火墙,允许部分IP地址的访问

设置操作系统的端口,允许部分端口的访问

服务器区域的网络隔绝,限制办公网络连接,需要连接通过跳板机访问,并做好记录

禁止外网访问,如果实在有需求,可以临时开启,使用完毕需要及时关闭

应用层

使用安全模块或者代码,防止注入或者泄漏

使用代码审计工具定期审核和安全扫描等

使用中间件,避免应用直接查库

对于账号信息避免明文存储,使用专用加密算法加密

对敏感数据进行加密或者规则脱敏

不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据!要做到验证

数据库层

参考 MySQL 安全规范

管理层

关于备份

当你有了备份,你不仅仅需要保证备份的多副本,还要保证其安全性,这里面的安全性包括内部安全,外部安全。

很多时候外部反而是安全的,一个有效的备份经历加密、访问控制,别人无论是获取还是解密都需要花费大量的时间的,而内部往往更容易出问题,千里之堤,毁于蚁穴。

关于审计

数据库审计能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。

它通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据安全。

审计对数据库记录和行为进行独立的审查和估计,其主要作用和目的包括以下几个方面:

对可能存在的潜在攻击者起到威慑和警示作用,核心是风险评估。

测试系统的控制情况,及时进行调整,保证与安全策略和操作规程协调一致。

对已出现的破坏事件,做出评估并提供有效的灾难恢复和追究责任的依据。

对系统控制、安全策略与规程中的变更进行评价和反馈,以便修订决策和部署。

协助系统管理员及时发现网络系统入侵或潜在的系统漏洞及隐患。

有个不知道算奇怪还是正常的事情,不知道多少人给生产恢复过数据,这里面不谈因由,只有做过的人才知道这其中的坑有多少,所以也就需要大家对于各种恢复手段都有所了解,乃至于熟练掌握。

虽然防患未然还是比较困难的,毕竟各种情况都会发生,但是,可以未雨绸缪,从安全上讲,有了审计可以大大减少这类事情的发生。

对于数据库而言,无论是硬件设备还是软件审计都会加大数据库的压力,从性能的损耗上讲,事后审计是比较折中的策略,这边先讲下软件部分的,无论是MySQL官方还是MariaDB或者Percona还是其他的都有一套自己的审计产品。

下面列下常用的几种

MariaDB Audit Plugin(https://mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin/),
Percona(https://www.percona.com/doc/percona-server/5.6/management/audit_log_plugin.html),
MySQL(https://dev.mysql.com/doc/refman/5.7/en/audit-log.html),
mcafee(https://github.com/mcafee/mysql-audit)等等功能都差不多

主要用哪个还得看你适合哪个,如果你有足够的资源可以考虑采用硬件的模式,尽量选择专门审计设备的设备,然后根据定期的报表检查你的相关配置。

关于架构

我们一直都在追求或者说改进自己的架构而成为更好的架构,高可用(High Availabiltity)是一个常用的标准,指标的话至少3个9目标4个9或者更多个9,不过随之带来的是成本,毕竟事务的两面性决定了不可能完美,我们始终要明白高可用的核心是什么,业务的连续性7*24? 其实也并不全是,从安全的角度而言,高可用的架构核心是数据冗余,其次才是业务的连续性,目前常用的架构也基本上遵从这个原理
不过有个问题就是大家想过没有,说个偏门的问题,即使你的环境是高可用,如果误删除了你该如何?高可用架构的多份数据也并没有什么用,你需要一个延迟的环境,至于延迟的时间,延迟的策略取决于你,可能说这个冗余环境很久都不会被使用,但是,这个就跟备份的道理是一样的,万一呢?完善的架构才能更好的维护业务的高可用。

关于制度

最后说下制度,这边主要说下安全的相关制度,个人觉得主要作用还是威慑,同时也是一个对自己的保护,在企业中,往往关系错综复杂,你需要更好的保护你所接触到的数据,同时也需要保护自己,而对于数据安全而言,有相应的制度去保证,保护我们不犯错,同时也防止我们犯错。

总之,制度的作用在于使我们知道,应该做什么,不应该做什么。

 

|

社区正在进行技术交流

中小金融机构MySQL数据库安全设计及防范

点击阅读原文,参与交流分享

|

 

 

长按二维码关注公众号

MySQL 安全规范

在生产中,安全是相当重要,毕竟你的核心数据都在里面,MySQL因为其开源的流行性,大量个人,企业,政府单位采用,但是,很多部署的时候采用都是默认的配置,这就导致了安全的相对欠缺,你需要针对你的安全有所加强。

总的来说,数据库一般划分为生产库,压测库,准生产库,测试库,开发库。下面部分主要说的是生产库,但其他库也适用。


1 mysql_secure_installation

这是数据库基础的安全设置脚本

a 设置root密码

b 移除匿名用户

c 禁止远程root登录

d 移除test数据库

以上是5.6版本,5.7有所加强但也仅此而以,看看你的环境是否存在上述问题,这个算是是最基本的安全吧。

2 连接访问安全

常见创建用户的时候你需要指定你的ip访问地址范围或者固定ip,一般化而言,只有特定唯一的几个ip的才会访问,或者说你可以采用代理访问的方式,减少应用直接访问你的数据库,而且现在很多中间件也都有白名单机制,原则上是把非法请求防止在数据库以外的地方。

规范数据库管理软件,实现管理软件的标准、统一化,还有严禁杜绝开启外网访问,如果客户端在远程,就根本不应该直接访问数据库,而应该使用中间件堡垒机或其他替代方案。

为了防止连入数据库的应用程序存在后门,造成数据库安全隐患,检查所有连接数据库程序的安全性。通过使用堡垒机或者其他监控登录数据库,禁止对数据库的直接操作。

对已经连接的IP网段进行规范化、统一化的管理,定期进行权限复核操作,对系统所属IP、用户进行权限梳理工作。

对员工进行安全培训,增强员工的系统安全观念,做到细心操作,安全操作。

确保访问数据库的主机为已知用户或者主机,使用专门主机与数据库进行连接。

对重要业务表的所有行为,全部审计,审计同时所有包括即使是DBA的DDL操作行为
最后是报表系统,利用审计的相关日志,出具系统化的审计报告。

3 权限安全

权限这块无可厚非,在简历之初遵循最小权限原则,坚持最小权限原则,是数据库安全的重要步骤。

很多时候我们不知道具体的最小权限是什么,你说一个账号到底需要什么样权限才合适,才不会影响业务?这个不是很好界定。我们需要知道在设置权限时的信息,要授予的权限级别,库级别,表级别,列级别,或者其他超级权限,要授予的权限类型,增删改查等

从mysql.user表来看
Select_priv/Insert_priv/Update_priv/Delete_priv/Create_priv/Drop_priv
Reload_priv/Shutdown_priv/Process_priv/File_priv/Grant_priv/References_priv
Index_priv/Alter_priv/Show_db_priv/Super_priv/Create_tmp_table_priv/Lock_tables_priv
Execute_priv/Repl_slave_priv/Repl_client_priv/Create_view_priv/Show_view_priv/Create_routine_priv/
Alter_routine_priv/Create_user_priv/Event_priv/Trigger_priv/Create_tablespace_priv

用户名,IP地址,是否需要连接数控制,SSL,过期时间等,不要怕麻烦,可能前期设置的时候比较繁琐,但是,一个好的基础设置,才是安全的保障,做到需要什么给什么,而不是。

4 账户安全

用户账户划分原则
超级管理员账号
系统应用账号(比如备份,监控,审计等)
应用业务账号
业务人员账号
开发人员账号
测试人员账号
其他专用账号

主要是防止泄漏,非必要人员不需要知道账号的名称,同时需要制定相应的命名规则,还有就是合理使用自己的账号密码,保护好你的账号密码,对于绝无必要的用户,先禁用,后期删除,要做到无匿名账户和无废弃账户。

5 目录文件安全

提高本地安全性,主要是防止mysql对本地文件的存取,会对系统构成威胁,还有Load DATA LOCAL INFILE,禁用该功能。

这个主要是防止误删除,非权限用户禁止访问目录,还有就是数据文件禁止访问,或者采用更改常用的目录路径,或者通过chroot,要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。

6 密码安全

密码强度复杂性

尽量并且不要使用固定密码,实行每个用户单独密码,长度在16位以上 0-9a-zA-Z~!@#$%^&

*()-+ 随机组合。

密码过期机制

根据公司的情况设定密码过期时间,定期更改,同时不可使用重复密码。

密码保存机制

为了方便管理,可能会采用一个密码表,要加强对于密码表的维护更新,最重要的是保证不泄漏。

7 漏洞安全

常规的方式是安装补丁,不过这个往往比较麻烦,主要是版本升级,还有就是防护策略。

8 被忽视的SSL

由于性能或者其他方面原因,很多生产环境并没有使用,不过从5.7+开始,已经好很多了,有需要的加强安全防范其实可以尝试下了。

https://dev.mysql.com/doc/refman/5.7/en/mysql-ssl-rsa-setup.html

9 防火墙安全

一般化数据库前面都会有主备的墙,不过从成本上考虑,很多企业都是单个或者裸奔的,有自己的硬件防火墙最好,没有的话也可以使用系统自带的防火墙,然后在加上其他白名单和中间件白名单过滤辅助措施,也能防止一部分问题。

10 端口安全

默认端口是3306,这个最好修改下,为了方便记忆,你可以根据的ip地址来加密动态调整,不过如果生产网络允许,也可以定期修改,最好不要影响研发进度。

11 记录安全

删除操作系统记录的敏感数据,比如.mysql_history、.bash_history 等,及时清理,移除和禁用.mysql_history文件。

人是安全的主导,管理的对象要从两个角度来看,从信息角度来说就是MySQL本身的安全,要防止数据的丢失和免遭破坏;从技术的角度来说就是整个系统的安全,要防止系统的瘫痪和免遭破坏。

最后说句题外话,监控和审计,安全主要是防患于未然,没有谁希望一天到晚接到各种警报,最好根据公司的实际情况订个详细的规章制度,不要觉得这个麻烦,有些你可能并不觉得有用,但是呢?我希望是没有但是。

Oracle / MySQL数据库高可用解决方案:数据一致性问题等探讨

数据库的高可用已成了企业信息化建设的重中之重。如何设计数据库的高可用方案,遇到了数据库高可用方面的问题如何解决显得非常重要。

一、MySQL各种高可用方案分别有什么优点和缺点?

任何一种高可用方案,都存在一些缺点,有些缺点是可以容忍的,有些缺点是不可容忍的,mysql目前来看,各种高可用方案都差不多,都存在一些弊端,但是我们作为技术人员,存在的价值,就是尽可能的想办法解决这些弊端。在选用方案的时候要根据实际的业务环境和公司的能力大小来做决定。在分享的文档中,介绍了五类(每一类方案包括若干种具体实施方案)高可用方案的优点和缺点,仅供大家参考。

文档地址:http://www.talkwithtrend.com/Article/215665

 

二、超大数据库的在线迁移问题和归档问题

随着信息的大爆炸,互联网各种业务的发展,超大、超级大的数据库都已经出现,先说一下迁移问题,oracle的迁移有很多种方案,迁移T级数据目前有XTTS等官方推荐的一些方案,PB级数据那就需要专业团队来根据实际情况来做一个完善的迁移方案。目前我也没接触过这种数据库的迁移,希望能和大家共同学习。在来说一下mysql超大的数据库,T级以上的单数据库在生产环境中不是很多,所以迁移的难点可能就是在于分库分表,数据库一致等问题,在这里分享几个可用方案:

方案1

 

In this case, normally, the best solution is a mysqldump using the –tab option like this:

mysqldump –tab=/path/to/serverlocaldir –single-transaction <database>table_a

tab option produce 2 file, one file -table_a.sql- that contains only the table create statement and the oher file -table_a.txt- contains tab-separated data.

Now you can create your new table

create table table_b like table_a;

Then you simply load data in your new table via LOAD DATA without care for the table’s name.

LOAD DATA INFILE ‘/path/to/serverlocaldir/table_a.txt’

  INTO TABLE table_b FIELDS TERMINATED BY ‘t’ …

LOAD DATA is usually 20 times faster than using INSERT statements.

LOAD DATA速度比INSERT语句要快,这里其实倒入也可以使用mysqlimport命令

方案2

I recently moved a 30GB database with the following stragegy:

Old Server

Stop mysql server

Copy contents of datadir to another location on disk (~/mysqldata/*)

Start mysql server again (downtime was 10-15 minutes)

compress the data (tar -czvf mysqldata.tar.gz ~/mysqldata)

copy the compressed file to new server

New Server

install mysql (don’t start)

unzip compressed file (tar -xzvf mysqldata.tar.gz)

move contents of mysqldata to the datadir

Make sure your innodb_log_file_size is same on new server, or if it’s not, don’t copy the old log files (mysql will generate these)

Start mysql

这种方法就是直接复制数据库的文件结构,要求必须相同的mysql版本,和相同的配置才可以用这种方法

方案3

If you are considering migrating to another DB Server with the exact same version of MySQL, you may want torsync the datadir from the old server to the new server.

This will work regardless of InnoDB file layout or even the presence of MyISAM tables.

install the same version of mysql on ServerB that ServerA has

On ServerA, run RESET MASTER;

to erase all binary logs before the rsycn process. If binary logging is not enabled, you can skip this step.

On ServerA, run SET GLOBAL innodb_max_dirty_pages_pct = 0;

from mysql and about 10 minutes (This purges dirty pages from the InnoDB Buffer Pool. It also helps perform a mysql shutdown faster) If your database is all MyISAM, you can skip this step.

rsync /var/lib/mysql of ServerA to /var/lib/mysql on ServerB

Repeat Step 3 until an rsync takes less than 1 minute

service mysql stop on ServerA

Perform one more rsync

scp ServerA:/etc/my.cnf to ServerB:/etc/.

service mysql start on ServerB

service mysql start on ServerA (optional)

Essentially, here is what such a script would like this

其实这个跟方案2是一样的。只是操作方法不同而已,当然要求也是一样的。

三、oracle和mysql数据库在高可用中数据一致性问题

 

oracle的数据一致性这里就不用说了,已经做的很完善,很少出现问题,出现问题也有完整的方案来解决,主要说一下mysql数据的一致性。就说一下最简单的mysql主从复制方案吧,供大家参考一下。

现在常用的MySQL高可用方案,十有八九是基于MySQL的主从复制(replication)来设计的,包括常规的一主一从、双主模式,或者半同步复制(semi-sync replication)。

我们常常把MySQL replication说成是MySQL同步(sync),但事实上这个过程是异步(async)的。大概过程是这样的:

  • 在master上提交事务后,并且写入binlog,返回事务成功标记;

  • 将binlog发送到slave,转储成relay log;

  • 在slave上再将relay log读取出来应用。

  • 步骤1和步骤3之间是异步进行的,无需等待确认各自的状态,所以说MySQL replication是异步的。

  • MySQL semi-sync replication在之前的基础上做了加强完善,整个流程变成了下面这样:

  • 首先,master和至少一个slave都要启用semi-sync replication模式;

  • 某个slave连接到master时,会主动告知当前自己是否处于semi-sync模式;

  • 在master上提交事务后,写入binlog后,还需要通知至少一个slave收到该事务,等待写入relay log并成功刷新到磁盘后,向master发送“slave节点已完成该事务”确认通知;

  • master收到上述通知后,才可以真正完成该事务提交,返回事务成功标记;

在上述步骤中,当slave向master发送通知时间超过rpl_semi_sync_master_timeout设定值时,主从关系会从semi-sync模式自动调整成为传统的异步复制模式。

半同步复制看起来很美好有木有,但如果网络质量不高,是不是出现抖动,触发上述第5条的情况,会从半同步复制降级为普通复制;此外,采用半同步复制,会导致master上的tps性能下降非常严重,最严重的情况下可能会损失50%以上。

这样来看,除非需要非常严格保证数据一致性等迫不得已的场景,就不太建议使用半同步复制了。当然了,事实上我们也可以通过加强程序端的逻辑控制,来避免主从数据不一致时发生逻辑错误,比如说如果在从上读取到的数据和主不一致的话,那么就触发主从间的一次数据修复工作。或者,我们也可以用 pt-table-checksum &

pt-table-sync 两个工具来校验并修复数据,只要运行频率适当,是可行的。

真想要提高多节点间的数据一致性,可以考虑采用PXC方案。现在已知用PXC规模较大的有qunar、sohu,如果团队里初期没有人能比较专注PXC的话,还是要谨慎些,毕竟和传统的主从复制差异很大,出现问题时需要花费更多精力去排查解决。

如何保证主从复制数据一致性

上面说完了异步复制、半同步复制、PXC,我们回到主题:在常规的主从复制场景里,如何能保证主从数据的一致性,不要出现数据丢失等问题呢?

在MySQL中,一次事务提交后,需要写undo、写redo、写binlog,写数据文件等等。在这个过程中,可能在某个步骤发生crash,就有可能导致主从数据的不一致。为了避免这种情况,我们需要调整主从上面相关选项配置,确保即便发生crash了,也不能发生主从复制的数据丢失。

  1. 在master上修改配置
    innodb_flush_log_at_trx_commit = 1
    sync_binlog = 1
    上述两个选项的作用是:保证每次事务提交后,都能实时刷新到磁盘中,尤其是确保每次事务对应的binlog都能及时刷新到磁盘中,只要有了binlog,InnoDB就有办法做数据恢复,不至于导致主从复制的数据丢失。

  2. 在slave上修改配置
    master_info_repository = “TABLE”
    relay_log_info_repository = “TABLE”
    relay_log_recovery = 1

上述前两个选项的作用是:确保在slave上和复制相关的元数据表也采用InnoDB引擎,受到InnoDB事务安全的保护,而后一个选项的作用是开启relay log自动修复机制,发生crash时,会自动判断哪些relay log需要重新从master上抓取回来再次应用,以此避免部分数据丢失的可能性。

通过上面几个选项的调整,就可以确保主从复制数据不会发生丢失了。但是,这并不能保证主从数据的绝对一致性,因为,有可能设置了ignoredorewrite等replication规则,或者某些SQL本身存在不确定因素,或者人为在slave上修改数据,最终导致主从数据不一致。这种情况下,可以采用pt-table-checksum 和 pt-table-sync 工具来进行数据的校验和修复。

 

四、选用高可用方案的标准

这个问题其实我已经在活动中回答过了,这里借用一下之前的回答来做一个总结。

1、稳定可靠(High-Availability)

数据库保存的是企业最重要的数据,是企业应用的核心,稳定可靠的数据库可以保证企业的应用常年运行,而不会因为数据库的宕机而遭受损失。企业的信息化可以促进生产力,但如果选择了不稳定产品,经常影响业务生产的正常运营,则实际效果很可能是拖了企业的后退。无论是计划中(数据库维护等正常工作)还是意外的宕机都将给企业带来巨大的损失,这意味着企业要减低收入、要降低生产力、要丢失客户、要在激烈的企业竞争中丢失信心。信息系统的稳定可靠是由多方面的因素构成的,包括网络、主机、操作系统、数据库以及应用软件等几方面,这些因素互相之间又有一定的依赖关系,因此,在企业信息化的选型中要通盘考虑这些问题。在数据库方面主要看数据库要具备灾难恢复、系统错误恢复、人为操作错误恢复等功能,同时要尽量降低数据库的计划内维护宕机时间。

2、可扩展(High-Scalability)

企业的应用是不断深入和扩展的,数据量和单位时间的事务处理量都会逐渐增加。如果要求企业购置一套信息系统足以满足未来若干年发展的需要显然是不恰当的,因为这实际意味着企业要多花很多钱而不能发挥信息设备的最大效能,造成资源的浪费。比较好的解决办法就是企业先购置一套配置较低,功能适用的系统,当未来业务有需要时可以方便的对系统进行扩展,使系统的处理能力逐步增加满足业务处理的需求。落实到数据库就是要选择具有良好的伸缩性及灵活的配置功能的产品,无论是主机系统的内存或硬盘方面的扩展还是集群系统的扩展,都能够被数据库利用,从而提高系统的处理能力。

3、安全性(Security)

数据库的安全性是指保护数据库以防止不合法的使用造成的数据泄露、更改或破坏。安全性问题不是数据库系统独有的,所有计算机系统都有这个问题。只是在数据库系统中保存着大量重要的数据,而且为许多最终用户共享使用,从而安全问题更为突出。系统安全保护措施是否有效是数据库系统的重要指标之一。 数据库的安全控制主要通过用户标识与鉴别、存取控制、视图机制、审计、数据加密等机制完成。

4、丰富的开发工具

无论是优秀的硬件平台还是功能强大的数据库管理系统,都不能直接解决最终用户的应用问题,企业信息化的工作也要落实到开发或购买适合企业自身管理的应用软件。目前流行的数据库管理系统大都遵循统一的接口标准,所以大部分的开发工具都可以面向多种数据库的应用开发。当然,数据库厂商通常都有自己的开发工具,例如SYBASE公司的PowerBuilder,Oracle公司的Developer2000,以及Ms的VisualStudio。这些开发工具各有利弊,但无疑选择和数据库同一个厂商的产品会更有利于应用软件的开发以及将来得到统一的技术支持。

5、服务质量

在现今信息高度发达的竞争中,数据库厂商完全靠产品质量打动用户的年代已不复存在,各数据库产品在质量方面的差距逐渐缩小,而用户选择产品的一个重要因素就是定位在厂家的技术服务方面。因为在你购买了数据库系统之后,你面临着复杂的软件开发,数据库的维护,数据库产品的升级等等,你需要得到数据库厂商的培训,各种方式的技术支持(电话、用户现场)和咨询。数据库厂家的服务质量的好坏将直接影响到企业信息化建设的工作。

 

五、超大数据备份

超大数据备份其实和迁移归档都能放在一起说,这里单独拿出来总结一下就是因为备份和迁移毕竟是两个概念,大家关注的也比较多。

数据备份是容灾的基础,有了备份不等于万事大吉。因为备份的数据可以还会有其他因素造成的数据损坏,如地震、火灾等,对于这些企业应该在数据容灾方面提升能力,来进一步应对数据抵抗潜在不安全因素的能力。当然,数据备份还是最基础的形式,没有数据备份,任何容灾都没有现实意义。目前来看,主要的数据备份方式如下:

定期磁带备份:包括远程磁带库、光盘库备份和远程关键数据+磁带备份。

数据库备份:就是在与主数据库所在生产机相分离的备份机上建立主数据库的一个拷贝。

网络数据:这种方式是对生产系统的数据库数据和所需跟踪的重要目标文件的更新进行监控与跟踪,并将更新日志实时通过网络传送到备份系统,备份系统则根据日志对磁盘进行更新。

远程镜像:通过高速光纤通道线路和磁盘控制技术将镜像磁盘延伸到远离生产机的地方,镜像磁盘数据与主磁盘数据完全一致,更新方式为同步或异步。

这些措施能够在系统发生故障后进行系统恢复。但是这些措施一般只能处理计算机单点故障,对区域性、毁灭性灾难则束手无策,也不具备灾难恢复能力。所以我们就需要建立异地容灾中心,做数据的远程备份,在灾难发生之后要确保原有的数据不会丢失或者遭到破坏。建立的异地容灾中心可以简单地把它理解成一个远程的数据备份中心。数据容灾的恢复时间比较长,但是相比其他容灾级别来讲它的费用比较低,而且构建实施也相对简单。主要的实施方法如下:

实时复制:当主中心的数据库内容被修改时,备份中心的数据库内容实时地被修改,此种复制方式对网络可靠性要求高。

定时复制:当主中心的数据库内容被修改时,备份中心的数据库内容会按照时间间隔,周期性地按照主中心的更新情况进行刷新,时间间隔可长(几天或几个月)可短(几分钟或几秒钟)。

存储转发复制:当主中心的数据库内容被修改时,主中心的数据库服务器会先将修改操作Log存储于本地,待时机成熟再转发给备份中心。

一文看懂 MySQL 分区和分表,提高表增删改查效率

MySQL分区和分表总结

 

日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

mysql分表和分区有什么联系呢?

1.都能提高mysql的性高,在高并发状态下都有一个良好的表现。

2.分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

3.分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。

4.表分区相对于分表,操作方便,不需要创建子表。

分区又可以分为两种:

水平分区(Horizontal Partitioning)

这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,

所以表的特性依然得以保持。

举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)

垂直分区(Vertical Partitioning)

这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。

举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

分区表的原理

分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。

在分区表上的操作按照下面的操作逻辑进行:

select查询:

当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据

insert操作:

当写入一条记录时,分区层打开并锁住所有的底层表,然后确定哪个分区接受这条记录,再将记录写入对应的底层表

delete操作:

当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作

update操作:

当更新一条数据时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,然后对底层表进行写入操作,并对原数据所在的底层表进行删除操作

虽然每个操作都会打开并锁住所有的底层表,但这并不是说分区表在处理过程中是锁住全表的,如果存储引擎能够自己实现行级锁,如:innodb,则会在分区层释放对应的表锁,这个加锁和解锁过程与普通Innodb上的查询类似。

在下面的场景中,分区可以起到非常大的作用:

A:表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他都是历史数据

B:分区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作

C:分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备

D:可以使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等

E:如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好

F:优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和count()这类聚合函数的查询时,可以在每个分区上面并行处理,最终只需要汇总所有分区得到的结果。

mysql数据库的分区总是把null当作比任何非null更小的值,这和数据库中处理null值的order by操作是一样的,升序排序时null总是在最前面,因此对于不同的分区类型,mysql数据库对于null的处理也各不相同。对于range分区,如果向分区列插入了null,则mysql数据库会将该值放入最左边的分区,注意,如果删除分区,分区下的所有内容都从磁盘中删掉了,null所在分区被删除,null值也就跟着被删除了。在list分区下要使用null,则必须显式地定义在分区的散列值中,否则插入null时会报错。hash和key分区对于null的处理方式和range,list分区不一样,任何分区函数都会将null返回为0.

分区

分区就是将数据库或其构成元素划分为不同的独立部分

--是一种预先组织表存储的方法

mysql支持水平分区

将特定表行分配为行的子集

分区的分布是跨物理存储进行的

--根据用户在需要时设置的指定规则

--每个分区存储为其自己的单元

数据的划分

--根据分区功能将数据划分为子集

--分区类型和表达式是表定义的一部分

--表达式可以是整数或返回整数值的函数。

--此值根据定义确定将每条记录存储在哪个分区中

1.primary key和unique key必须包含在分区key的一部分,否则在创建primary key和unique index时会报”ERROR 1503 (HY000)“

2.范围分区添加分区只能在最大值后面追加分区

3.所有分区的engine必须一样

4.范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp())

分表的几种方式:

1、mysql集群

它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。

2、自定义规则分表

分区的类型

range 根据属于指定范围的列值将行分配到分区

list 根据与离散值集之一匹配的列将行分配到分区

hash 基于由用户定义的表达式返回的值而选择的分区,对要插入表中的行的列值进行操作

key 与hash类似,不同之处在于仅提供要评估的一个或多个列

Composite(复合模式) –以上模式的组合使用

InnoDB foreign keys and MySQL partitioning are not compatible. Partitioned InnoDB tables cannot have foreign key references, nor can they have columns referenced by foreign keys. InnoDB tables which have or which are referenced by foreign keys cannot be partitioned.

分区的几种方式实践:

Range:
create table range( 
  id int(11), 
  money int(11) unsigned not null, 
  date datetime 
  )partition by range(year(date))( 
  partition p2007 values less than (2008), 
  partition p2008 values less than (2009), 
  partition p2009 values less than (2010) 
  partition p2010 values less than maxvalue 
);
List:

create table list( 
  a int(11), 
  b int(11) 
  )(partition by list (b) 
  partition p0 values in (1,3,5,7,9), 
  partition p1 values in (2,4,6,8,0) 
 );


Hash:

create table hash( 
  a int(11), 
  b datetime 
  )partition by hash (YEAR(b) 
  partitions 4;


Key:

create table t_key( 
  a int(11), 
  b datetime) 
  partition by key (b) 
  partitions 4;

分区管理

新增分区

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

删除分区

–当删除了一个分区,也同时删除了该分区中所有的数据。
ALTER TABLE sale_data DROP PARTITION p201010;

分区的合并

下面的SQL,将p201001 – p201009 合并为3个分区p2010Q1 – p2010Q3

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);

不停机不影响业务,DBA必掌握:MySQL 可以这样优雅地变更表结构

关系型数据库存储的是结构化的数据类型,如果早期的设计不合理,后期进行表结构变更,对于 DBA 来说是家常便饭。

MySQL 数据表记录少到成千上万,多到成千万上亿,变更大数据量数据表的结构,对 DBA 而言是个头疼的事情。互联网业务 7×24 不间断提供服务,如何在不停机不影响业务的情况下优雅地进行表结构变更,这是每个 DBA 必须掌握的技能。

1.MySQL 在线变更表结构方案

典型问题:

目前可选的在线变更表结构方案有哪些?

在线变更表结构方案如下:

  • 直接 ALTER TABLE

  • oak-online-alter-table

    参考:http://shlomi-noach.github.io/openarkkit/oak-online-alter-table.html

  • 5.7 新增 online rename index

    参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-create-index-overview.html

  • pt-online-schema-change

    参考:https://www.percona.com/doc/percona-toolkit/3.0/pt-online-schema-change.html

  • gh-ost

    参考:https://github.com/github/gh-ost

  • OnlineSchemaChange

    参考:https://github.com/facebookincubator/OnlineSchemaChange

  • LHM

    参考:https://github.com/soundcloud/lhm

  • 腾讯 GSC 引擎

  • 自定义脚本

2.MySQL 下如何优雅的对一个大数据量的表进行自动的分库分表存储

典型问题:

当一个表预期数据量足够大的时候,如何进行分库分表存储,读写分离,来实现高效、稳定的数据存储和读。

分库分表分区是解决大数据量时的一个分而治之的思路,建议依次考虑的顺序如下

1.分区:表分区之后只是引擎存储的工作去保证,对用户相对透明,因为对应用侵入度较低;

2.分表:在同一个 schema 中的多个表,应用可能需要根据业务逻辑去判断业务对应的表,这种情况下单库内路由也相对比较好办;

3.分库:这个方法最大的问题就是分布式事务,目前市场有很多开源中间件可以选择,如当当或者 360 的,但未必能够满足需求,需要进行选择。

其实可以考虑为什么会出现大数据量呢?如果从生命周期角度考虑,对于这样大量的数据,是否可以分为热、温和冷三种类型呢?如果存在,那么:

1)冷数据(历史数据):是否就可以从现行数据表中进行定期剥离呢?比如交易记录,后续只是进行查询,完全可以将完全交易的数据进行定期转存到历史库

2)温数据:对于访问频度相对低一点的数据,如果考虑存储成本,是否可以采用分区的形式将这些数据放在相对廉价的存储上面

3)热数据:对于频繁访问的数据,一般是整个系统的性能瓶颈点,是否可以考虑 SSD 的硬盘,这样能保证既有业务的快速响应

对于数据生命周期的管理还是需要考虑业务实际场景:

当数据量比较大时落地实现的所有功能都交给数据库吗?作为架构设计中的业务架构、应用架构、技术架构、数据架构和部署运行架构中的架构之一,应该是与其他架构设计逻辑整合的一起的,因此需要应用人员和业务人员的参与,有部分功能为了保障数据库整体性能需要提升到应用逻辑中去完成,这样可以更好的提升数据库性能,我们在实战中的一些经验,比如不用存储过程、不用外键、不用复杂表操作,尽量单表操作,这些不是不做了,是数据库不做了,约束交给应用去做了,这样应用在从数据库得到快速响应后可以在应用层面进行逻辑处理,而这种处理的服务器一般可以较好的进行扩展,提高响应能力。

3.MySQL 单表量级达到 5 千万以上,如何添加修改字段而不产生锁表?

典型问题:

1、MySQL 如果单实例,没有主从 单库 ,单表量级达到 5 千万以上,该表的插入和查询都很多, 如何添加修改字段而不产生锁表?

2、如果有主从,表的量级达到千万以上,如何修改添加表字段?是先从库添加完再由从库变更为主库去用,让其在同步么?

1、单实例情况,建议使用 pt 或者 gh-ost 工具,二者均不会产生锁表,前者通过触发器实现,或者通过解析 binlog 实现。

2、多实例情况,如果使用 pt 工具,是在主库做变更;如果使用 gh-ost 工具,主从均可操作。

4.生产环境下,变更 Mysql 的表结构步骤是什么?

1.确认表的元数据信息,包括:

  • 字段类型

  • 数据量

  • 存储引擎

2.对需求里的改表语句进行审核,如果存在不规范的地方,联系开发进行修正

3.确认当前节点是什么角色,也就是主节点和从节点

4.确认主从状态是否正常

5.根据数据量、业务场景、业务容忍度,选择变更的方案以及预估需要的时间

6.确定操作时间点,如果数据量大,建议在低峰进行

7.通知研发开始进行变更操作,告知研发观察对应业务

8.变更过程中,留意 MySQL 监控和机器监控,观察主从状态、主从连接数、主从机器负载

9.变更过程出现问题,及时 KILL 相关操作

10.变更顺利完成,进行数据校验

11.告知研发

5.MySQL 建表的最佳实践是什么?

简单列一下:

  • 表名跟业务绑定,表名使用小写字母和下划线命名

  • 除存放日志的表和中间临时表外,其他表原则上必须有主键

  • 创建表必须包含行记录的创建时间字段和修改时间字段

  • 优先选择存储引擎类型为 InnoDB

  • 表和字段必须有 Comment 注释

  • 字符集优先选择 UTF-8

  • 根据数据尺寸决定数据长度,尽量减少冗余

  • 组合索引不能超过5列,最好保持在 3 列以内

  • 组合索引最常使用的字段或区分度高的字段考虑放在索引第一列

  • 索引不宜太多,维护索引也需要成本,单表索引数量建议不超过 5 个

  • 尽量避免使用触发器、存储过程、自定义函数(UDF)、视图

  • 预估容量,是否需要使用分区表,是否需要分表分库

  • 所有字段建议设置默认值,INT 为 0,VARCHAR 为 ”

6.MySQL 的表空间设置个和优化策略主要有哪些?

1.innodb_file_per_table 参数设置为 ON

2.定期执行 OPTIMIZE TABLE tableName;

3.定期执行 ALTER TABLE tableName ENGINE = InnoDB;

注意:第 2、3 条是高危操作,会影响业务,建议在低峰期操作

7.请教 MySQL 调优经验,针对大量的同时读写数据

典型问题:

我们正在使用 zabbix 监控,用的数据库是 MySQL,想问问专家们有没有调优经验,主要是会存在大量的同时读写数据,针对这块希望得到具体的指导。

1.影响 IO 的参数:innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_log_at_trx_commit、sync_binlog、write/read thread、innodb_io_capacity、innodb_max_dirty_pages_pct、innodb_flush_method、innodb_adaptive_flushing、innodb_adaptive_flushing_method、innodb_stats_on_metadata、innodb_change_buffering、innodb_old_blocks_time、binlog_cache_size、innodb_file_per_table

2.这方面比较成熟了,几篇文章参考:

【mysql】关于 IO / 内存方面的一些优化(http://www.cnblogs.com/chenpingzhao/p/5119161.html)

Innodb IO 优化-配置优化(http://wubx.net/innodb-io-optimize-conf/)

如果有条件,可以上 SSD

MySQL 数据库基本命令汇总整理

一、创建数据库:

create database database_name;

php中创建数据库的两种方法:(mysql_create_db(),mysql_query())
$conn = mysql_connect(“localhost”,”username”,”password”) or
die ( “could not connect to localhost”);

1.

mysql_create_db(“database_name”) or
die (“could not create database”);

2.

$string = “create database database_name”;


mysql_query( $string) or
die (mysql_error());

二、选定数据库

在创建表之前,必须要选定要创建的表所在的数据库

选定数据库:

通过命令行客户端:use database_name

通过php: mysql_select_db()
$conn = mysql_connect(“localhost”,”username”,”password”) or
die ( “could not connect to localhost”);


mysql_select_db(“test”,$conn) or
die (“could not select database”);

 

三、创建表

create table table_name

如:

create table table_name
(
column_1 column_type column attributes,
column_2 column_type column attributes,
column_3 column_type column attributes,
primary key (column_name),
index index_name(column_name)
)

在命令行客户端需要键入整个命令

在php中使用,mysql_query()函数

如:

$conn = mysql_connect(“localhost”,”username”,”password”) or
die ( “could not connect to localhost”);


mysql_select_db(“test”,$conn) or
die (“could not select database”);


$query = “create table my_table (col_1
int not null primary key,
col_2 text
)”;


mysql_query($query) or
die (mysql_error());

 

四、创建索引

index index_name(indexed_column)

 

五、表的类型

ISAM MyISAM BDB Heap

声明表类型的语法:

create table table_name type=table_type
(col_name column attribute);

默认使用MyISAM

 

六、修改表

alter table table_name

更改表名

alter table table_name rename new_table_name

或者(高版本中)

rename table_name to new_table_name

添加和删除列

添加列:alter table table_name add column column_name colomn attributes

例如: alter table my_table add column my_column text not null

first 指定插入的列位于表的第一列

after 把新列放在已经存在的列的后面

例如:

alter table my_table add column my_next_col text not null first

alter table my_table add column my_next_col text not null after my_other _column

删除列:alter table table_name drop column column name

添加和删除索引:

alter table table_name add index index_name (column_name1,column_name2,……)

alter table table_name add unique index_name (column_name)

alter table table_name add primary key(my_column)

alter table table_name drop index index_name

如:alter table_name test10 drop primary key

更改列定义:

用change或是modify命令可以更改列的名称或是属性。要更改列的名称,还必须重新定义列的属性。例如:

alter table table_name change original_column_name new_column_name
int not null

注意:必须要重新定义列的属性!!!

alter table table_name modify col_1 clo_1 varchar(200)

 

七、向表中输入信息(insert)

insert into table_name (column_1,column_2,column_3,…..)

values (value1,value2,value3,……)

如果要存入字符串,则需要使用单引号“’”将字符串括起来,但是需要注意字符的转意

如:insert into table_name (text_col,int_col) value (’hello world’,1)

需要转义的字符有:单引号’ 双引号” 反斜杠 百分号% 下划线_

可以连续使用两个单引号转义单引号

 

八、updata语句

updata table_name set col__1=vaule_1,col_1=vaule_1 where col=vaule

where部分可以有任何比较运算符

如:

table folks
id fname iname salary
1 Don Ho 25000
2 Don Corleone 800000
3 Don Juan 32000
4 Don Johnson 44500
updata folks set fname=’Vito’ where id=2
updata folks set fname=’Vito’ where fname=’Don’
updata folks set salary=50000 where salary<50000

 

九、删除表、数据库

drop table table_name

drop database database_name

在php中可以通过mysql_query()函数使用drop table命令

在php中删除数据库需要使用mysql_drop_db()函数

 

十、列出数据库中所有可用表(show tables)

注意:使用该命前必须先选定数据库

在php中,可以使用mysql_list_tables()得到表中的清单

 

十一、查看列的属性和类型

show columns from table_name

show fields from table_name

使用mysql_field_name()、mysql_field_type()、mysql_field_len()可以得到类似信息!

 

十二、基本的select语句

要求指出进行选择的表,以及要求的列名称。若要选定所有的列,可用*****代表所有的字段名

select column_1,column_2,column_3 from table_name

或者

select * from table_name

用mysql_query()可向Mysql发送查询

 

十三、where子句

限制从查询(select)返回的记录行

select *** from table_name where user_id = 2

如果要对存储字符串(char、varchar等类型)的列进行比较,就需要在where子句中用单引号把要比较的字符串括起来

如:select *** from users where city = ‘San Francisco’

通过向where子句添加and或是or,可以一次比较几个运算符

select ***** from users where userid=1 or city=’San Francisco’

select 8 from users where state=’CA’ and city=’San Francisco’

注意:空值不能和表中的任何运算符比较,对于空值,需要使用is null或是is not null谓词

select ***** from users where zip!=’1111′ or zip=’1111′ or zip is null

如果要找到包含任何值(除空值以外)的所有记录,可以*

select** *** from table_name where zip is not null

 

十四、使用distinct

当使用distinct时,Mysql引擎将删除有一样结果的行。

select distinct city,state from users where state=’CA’

 

十五、使用between

使用between可以选择在某个范围内的值,between可用于数字,日期,文本字符串。

如:

select ***** from users where lastchanged between 20000614000000 and 20000614235959

select ***** from users where lname between ‘a’ and ‘m’

 

十六、使用in/not in

若某列可能返回好几个可能的值,就可以使用in谓词

select ***** from users where state=’RI’ or state=’NH’ or state=’VT’ or state=’MA’ or state=’ME’

可改写为:select ***** from users where state in (‘RI’,’NH’,’VY’,’MA’,’ME’)

如果要达到相同的结果,但结果集相反,可使用not in 谓词

select ***** from user where state not in (‘RI’,’NH’,’VT’,’MA’,’ME’)

 

十七、使用like

如果需要使用通配符,则要使用like

select ***** from users where fname like ‘Dan%’ %匹配零个字符

select ***** from users where fname like ‘J___’ 匹配以J开头的任意三字母词

Mysql中like不区分字母大小写

 

十八、order by

order by语句可以指定查询中返回的行的顺序,可对任意列类型排序,通过在末尾放置asc或是desc以设置按升序或是降序排列,如果不设置,默认使用asc

select ***** from users order by lname,fname

可以按照需要根据任意多的列排序,也可以混合使用asc和desc

select ***** from users order by lname asc, fname desc

 

十九、limit

limit限制从查询中返回的行数,可以指定开始的行数和希望返回的行数
得到表中的前5行:

select ***** from users limit 0,5

select *****from users order by lname,fname limit 0,5

得到表的第二个5行:

select ***** from users limit 5,5

 

二十、group by 与聚合函数

使用group by后Mysql就能创建一个临时表,记录下符合准则的行与列的所有信息

count() 计算每个集合中的行数

select state,count(*****) from users group by state

*****号指示应该计算集合中的所有行

select count(*) from users

计算表中所有的行数

可以在任何函数或列名后使用单词as,然后指定一个作为别名的名称。如果需要的列名超过一个单词,就要使用单引号把文本字符串括起来

sum() 返回给定列的数目

min() 得到每个集合中的最小值

max() 得到每个集合中的最大值

avg() 返回集合的品均值

having

限制通过group by显示的行,where子句显示在group by中使用的行,having子句只限制显示的行。

 

二十一、连接表

在select语句的from部分必须列出所有要连接的表,在where部分必须显示连接所用的字段。

select * from companies,contacts where companies.company_ID=contacts.company_ID

当对一个字段名的引用不明确时,需要使用table_name.column_name语法指定字段来自于哪个表

 

二十二、多表连接

在select后面添加额外的列,在from子句中添加额外的表,在where子句中添加额外的join参数–>

学习MySQL:MySQL 数据类型

概览

1.在MySQL中,可用的数据类型分为四个主要类别:

(1)数值;

(2)字符;

(3)二进制;

(4)时间;

2.在每个类别中,存在多种特定的数据类型,这些数据类型使用的内存大小和磁盘空间各不相同,因此会对性能产生不同的影响;

3.对于单个记录,为列选择最佳数据类型所产生的性能影响相对较小,但随着数据库的增大,这些较小的影响可能会汇聚成大的影响;

应在设计过程中事先考虑这些影响,以免造成性能问题;

4.MySQL还支持“空间扩展”存储引擎功能;

通过空间扩展,能够以字符和二进制格式生成,存储和分析地理特征;

5.数据类型的ABC要素:

(1)Appropriate(适当):需要以最适合数据所代表的项的类型来表示数据;

(2)Brief(简洁):选择所用存储空间最少的数据类型。这可节省资源并提高性能;

(3)Complete(完整):选择的数据类型应分配有可存储特定项的最大可能值的充足空间;

数值数据类型

1.数值数据类型类:

(1)整数:整数没有小数部分;

即,没有小数位的单个整数值;

(2)浮点数(FLOAT/DOUBLE):表示包含整数部分,小数部分或同时包括二者的近似值数值;

此类数据类型使用服务器主机的CPU所用的本机二进制浮点格式(IEEE 754)来表示值;

该数据类型用于存储和计算会很高效,但值会存在舍入误差;

如果列可为空,则默认值为NULL;

如果列不可为空,则默认值为0(数值零);

(3)定点数(DECIMAL):包含整数部分,小数部分或同时包括二者;

DECIMAL列中的所有值均包含相同的小数位数,并且完全按给定方式进行存储;

DECIMAL值存储起来不如浮点数值高效,但DECIMAL值没有舍入误差,因此更加精确;

通常用于存储货币值(其中每个值的精度比其存储大小更加重要);

(4)BIT:BIT列规范规定了一个宽度,指明每个值的位数(1至64位);

2.“精度”和“范围”是适用于浮点值和定点值(这两种类型可以同时包含整数部分和小数部分)的术语:

(1)精度:有效位数;

(2)范围:小数点右侧的位数;

TIPS:可以使用=号跟浮点值进行比较;

但由于可能会出现舍入误差,因此结果可能并不总是与预期一样;

字符串数据类型

1.这些类型在以下几个方面有所不同:

(1)数据是以固定长度格式还是可变长度格式存储;

(2)可存储的最大长度;

(3)该类型是否支持非结构化字符串值;

2.为存储字符串数据,MySQL提供了以下数值数据类型存储类:

(1)文本:用于表示真实的字符串数据类型;

可以使用此类型存储非结构化且格式自由的字符串(如果其长度符合已定义的空间量);

(2)整数(枚举/集合):用于表示结构化字符串类型;

称为“结构化”的原因是,存储在这些类型的列中的值必须通过您所提供的值列表构建,从而定义数据类型;

字符集和排序支持

1.字符串具有以下特征:

(1)序列由特定字符集中的字符组成;

(2)多字节字符集中的每个字符所需的字节数可能是固定的,也可能是可变的;

(3)比较基于对字符串所关联的字符集的排序;

(4)多字节字符比较以字符而不是字节为单位执行;

(5)排序将验证字符的大写版本和小写版本是否等效;

(6)排序将决定同一个字符的不同重音标记是否等效;

(7)排序可以为二进制,其中基于数值字符值进行比较;

2.MySQL具有一个包含大量可供选择的字符集和排序的列表;

选择正确与否会对性能有很大的影响;

要查看可用的字符集:SHOW CHARACTER SET;

3.使用排序选择可以为相同的字符集选择不同的排序顺序;

例如,显示所有latin1字符集:SHOW COLLATION LIKE ‘latin1%’;

二进制字符串数据类型

1.与字符串不同,组成此类二进制字符串值的字节不代表字符;

因此,二进制字符串没有附加的字符语义,而且缺少字符串类所表示的字符集和整理信息;

2.在MySQL中,BLOB与TEXT类型非常相似,没有附加的字符集和排序;

时间数据类型

1.YYYY,MM,DD,hh,mm,ss和uuuuuu分别表示“年”,“月”,“日”,“小时”,“分钟”,“秒”和可选的“秒的小数位”;

2.通过为该类型提供一个参数,可声明秒的小数位(可选);

例如,TIME(3)是TIME类型,其中秒的小数位部分最多可达三位;

3.TIMESTAMP值采用UTC进行存储(将根据需要转换为当地时间或从当地时间进行转换),其范围为从1970-01-01 00:00:00.000000至2038-01-19 03:14:07.999999;

4.可以定义DATETIME和TIMESTAMP以自动记录当前日期和时间,而不管对行执行INSERT或UPDATE操作的时间为何时;

5.TIMESTAMP与DATETIME的对比:

(1)TIMESTAMP列值的范围比DATETIME列值的范围小,因此存储每个值所需的字节数更少;

(2)通过为不允许出现NULL的TIMESTAMP指定NULL值,可以将其设置为当前日期和时间;

例子:

CREATE TABLE t_time
(
id INT NOT NULL,
t1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
t2 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
t3 TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);


mysql>INSERT INTO t_time(id) VALUES(1);


mysql>COMMIT;


mysql>SELECT * FROM t_time;


+—-+———————+———————+———————+
| id | t1 | t2 | t3 |
+—-+———————+———————+———————+
| 1 | 2015-08-19 14:00:42 | 2015-08-19 14:00:42 | 0000-00-00 00:00:00 |
+—-+———————+———————+———————+
mysql>UPDATE t_time SET t1 = ‘2000-01-01 00:00:00’ WHERE id = 1;


Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>COMMIT;


Query OK, 0 rows affected (0.00 sec)
mysql>SELECT * FROM t_time;


+—-+———————+———————+———————+
| id | t1 | t2 | t3 |
+—-+———————+———————+———————+
| 1 | 2000-01-01 00:00:00 | 2015-08-19 14:00:42 | 2015-08-19 14:01:43 |
+—-+———————+———————+———————+
1 row in set (0.00 sec)

空间数据类型

MySQL实现了由开放地理空间协会(Open Geospatial Consortium, OGC)提出的“包含几何类型的SQL”环境的子集:

1.用于单个几何体值:

(1)GEOMETRY:层次结构的根类,任何类型的值;

(2)POINT:坐标空间中的单个位置;

(3)CURVE:一维几何体,由点组成的序列;

(4)LINESTRING:点之间具有线性内插的曲线;

(5)SURFACE:二维几何体;

(6)POLYGON:表示多边几何体的平面;

2.用于保存几何体值的集合:

(1)MULTIPOINT:Point元素;

(2)MULTICURVE:Curve元素;

(3)MULTILINESTRING:LineString元素;

(4)MULTISURFACE:Surface元素;

(5)MULTIPOLYGON:Polygon元素;

(6)GEOMETRYCOLLECTION:任意类型的几何体;

将数据类型设置为NULL

1.在SQL中,对表达式求值的结果可以为null;

null值是一个特殊的值,表示值无法进行计算或未知;

2.何时使用NULL:在数据库设计的开始阶段,当列出要包含在内的数据时,发现某些数据可能不适用于所有列;

3.何时不应使用NULL:在某些情况下,不应允许列中使用null值;

(1)最常见的情况即该列为主键时;

(2)另一个例子是:当列必须包含值时,数据库设计才有意义;

(3)NULL值不保存到索引中;

 

学习MySQL:体系结构及相关概念

学习MySQL:系统管理

学习MySQL:服务器配置

学习MySQL:客户机和工具
 

学习MySQL:客户机和工具

命令行客户机程序

1.这几个客户机都必须运行mysqld服务器程序,客户机才能访问数据库;

2.mysql是通用的命令行客户机,用于向服务器发送SQL语句,其中包括用于管理的SQL语句;

3.mysqladmin是可帮助管理服务器的管理命令行客户机;

4.mysqlimport为LOAD DATA INFILE语句提供了命令行界面;

使用该客户机可以将数据文件装入表中,而无需手动发出LOAD DATA INFILE语句;

之后讲导入导出数据时会具体再讲;

5.mysqldump是用于转储数据库和表中内容的命令行客户机;

使用它可备份数据库或将其复制到其他计算机;

调用命令行客户机

两种常见的选项语法格式:

1.长选项(–):双横线选项后面加等号和参数;

2.短选项(-):单横线选项后加空格和参数;

mysql -V;

连接参数选项

1.-h:后跟给定主机的主机名或IP地址,用于连接到服务器(默认为localhost);

2.-C:压缩客户机和服务器之间发送的所有信息(如果两者都支持压缩);

3.–protocol:后跟用于连接到服务器的连接协议:{TCP|SOCKET|PIPE|MEMORY };

4.-P:后跟端口号,用于代替默认值(3306);

5.-S:用于设置UNIX套接字文件或在Windows上使用的命名管道的名称;

6.–shared-memory-base-name:(仅Windows)通过共享内存连接到本地服务器时所使用的共享内存的名称;

此选项仅在服务器支持共享内存连接时适用;

调用mysql客户机

1.在命令行中提供凭证:

-u选项后面可带或不带空格;

-p选项后面不带空格,如果对该选项使用空值,则系统会提示您输入口令;

2.在登录路径中提供凭证:

使用此登录路径(通过mysql_config_editor创建)的凭证;

3.执行语句:mysql –login-path=admin -e “SELECT VERSION()”;

4.使用特定选项文件执行:

5.使用包含SQL语句的文本文件执行:

– 可以使用[ >| <]重定向流,用来运行脚本或者批处理文件;

– 文件必须为纯文本格式,其中每个语句都有语句终结符;

– 文件必须位于运行 mysql 客户机的主机上;

– <和-e是互斥的,不能同时使用

mysql 客户机:安全更新

1.可能会不小心发出一些会修改表中多个行的语句或者会返回特别大的结果集的语句,使用–safe-updates选项可帮助防止这些问题;

(可以启动时设置,也可以在选项文件中设置)

2.设置安全更新模式可施加以下SQL语句限制:

1).UPDATE和DELETE仅在包含WHERE子句(该子句通过键值明确标识了要更新或删除的记录)或LIMIT子句时才允许使用;

2).将单表SELECT语句中的输出限制为不超过1K行,但语句包含LIMIT子句时除外;

3).仅当MySQL为处理查询所检查的行不超过100W时,才允许使用多表SELECT语句;

例子:


# mysql

mysql>use db1;


mysql>SELECT * FROM t1;


mysql>UPDATE t1 SET id = id + 1;


mysql>COMMIT;



# mysql -uroot -p –safe-update

mysql>use db1;


mysql>UPDATE t1 SET id = id + 1;


ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql 客户机:输出格式

默认情况下,无论是以交互模式还是以批处理模式使用mysql,都会生成输出:

1.交互式:当以交互模式调用mysql时,会以表格格式显示查询输出,其中使用长条和短划线显示在方框列中列出的值;

–table(或 -t):生成表格输出格式,即使在以批处理模式运行时也是如此,这是交互模式的默认格式;

2.批处理:在通过使用文件作为命令行中的输入源来调用mysql时,mysql会以批处理模式运行,并且在显示的查询输出中使用制表符来分隔数据值;

–batch(或 -B):生成批处理模式(用制表符分隔的)输出(即使在以交互模式运行时也是如此),且不使用历史文件,这是批处理模式的默认格式;

在批处理模式下,使用–raw或-r选项可禁止字符转换(例如,将换行符和回车符转换为n或r等转义序列),在原始模式下,将按字面值输出字符;

3.使用以下选项可选择不同于以上任一默认格式的输出格式:

–html(或 -H):生成 HTML 格式的输出;

–xml(或 -X):生成 XML 格式的输出;

mysql 客户机:MySQL客户机命令

一.列出所有的 MySQL 客户机级别命令:mysql>HELP;

1.?与help一样,获得帮助信息;

2.clear:清除当前输入的语句,在错误的语句后面输入c即可;

3.connect:重新连接服务器,可以指定主机名和服务器,输入connect dbname host或或者r dbname host即可;

4.delimiter:语句分隔符,设置执行语句的符号,执行delimiter $$即可;

5.edit:调用vi修改sql语句,在要修改的语句后面输入e即可;

6.go:发送命令到mysql服务器;

7.pager:查询内容太多,分页显示,设置:>pager less,禁止:>nopager;

8.tee:把查询结果输入到一个文件中:>tee /tmp/rst.txt,禁止notee,主要用于数据库的备份脚本输出;

9.prompt:改变提示符,如:prompt royalwzy>;

则每次输入命令是提示符变为royalwzy>字符串(可以在配置文件中定义,prompt=xxx);

10.quit/exit:都是退出客户端,输入quit,exit和q都行;

11.source:执行一个sql脚本文件,文件名为参数,source /tmp/sql.txt;

12.system:执行操作系统的命令,用法:system ls -l /tmp 或者! ls -l /tmp;

13.status:查看服务器信息的状态,输入status或者s即可;

14.use:改变使用的数据库,后面跟数据库的名称,eg:use mysql;

15.charset:修改字符集,可以通过status查看当前使用的字符集,eg:charset latin1;

16.warnings:开启警告信息,当输入的sql语句出错时,可以通过show warning或者show errors来打印警告或者错误信息,设置:warning或者W,关闭:nowarning或者w;

17.rehash:设置客户端自动补全功能;

1).在服务器的配置文件中[mysql]节点下,默认使用no-auto-rehash选项;

2).注释no-auto-rehash选项,添加auto-rehash选项,reboot;

二.显示会话状态信息:mysql>s;

Using outfile:就是使用tee命令指定的值,把当前所有的操作和输出都重定向到一个文本;

三.日志会话查询及其输出:tee my_tee_file.txt;

mysql 客户机:SQL语句

一.数据定义语言(Data Definition Language, DDL)

1.CREATE DATABASE/TABLE:用于创建具有给定名称的数据库或表;

2.ALTER DATABASE/TABLE:可更改数据库或表的整体特性;

3.DROP DATABASE/TABLE:用于删除数据库中的所有表并删除该数据库,或者用于删除特定的表;

二.数据操纵语言(Data Manipulation Language, DML)

1.SELECT:用于从一个或多个表中检索所选的行;

2.INSERT:用于在现有表中插入新行;

3.DELETE:用于删除现有表中的行;

4.UPDATE:用于使用新值更新指定表中现有行的列;

5.JOIN:组合使用多个表以用于SELECT,多表DELETE和UPDATE语句;

mysql 客户机:有关SQL语句的帮助

获得服务器端帮助:>help contents;

1.可以通过help cmd获得更详细的信息;

2.获得管理操作的命令:>help administration;

3.获得数据类型:>help data types;

4.获得show命令的帮助:help show;

? show;

5.show variables:打印系统变量,类似oracle中的show parameter;

查询包含某一关键字的变量:show variables like ‘%buffer%’;

设置变量的值用set命令:set global|session key=value;

6.show variables和show status的区别

show variables:当服务器运行之后如果没有人工干预所有的参数不会发生改变;

show status:显示服务器运行过程中的动态信息,值会动态改变;

7.不必逐步浏览目录列表中所列出的项来获取有关特定主题的帮助,只需给出主题作为关键字即可获得一些提示:HELP STATUS;

mysql 客户机:SQL语句终结符

1.[;

]和[g]:常见的终结符,二者等效,可互换使用;

2.G:用于终止查询并以垂直方式显示查询结果,其中显示的每个输出行的每个列值均位于单独的行中;

此终结符在查询生成的输出行非常宽的情况下十分有用(因为竖直格式可使结果更易阅读);

3.c:如果决定放弃正在编写的语句,则可取消该语句并返回到新的mysql>提示符下;

mysql 客户机:特殊语句终结符

mysql 客户机:重新定义提示符

1.可以更改默认提示符,将当前信息放入提示符中,例如用户(u),主机(h)和数据库(d);

2.PROMPT关键字之后第一个空格后面的所有内容都将成为提示符字符串的一部分,包括其他空格;

该字符串可包含特殊序列;

1.3.要将提示符恢复为默认值,请指定不包含参数的PROMPT或R;

eg:prompt (u@h)[d]>

mysql 客户机:使用脚本文件

1.脚本文件应该为纯文本文件,其中所包含语句的格式要与以交互模式输入的语句的格式相同;

具体来说,每个语句都必须以 终结符结束;

2.SOURCE命令后的文件名无需用引号括起;

mysqladmin客户机

查看帮助:

1.create databasename:创建数据库;

2.debug:把bug信息写入日志文件;

3.drop databasename:删除数据库;

4.extended-status:列出服务器的附加信息;

5.flush-hosts:刷新主机缓存;

6.flush-logs:刷新所有的日志;

7.flush-status:清空状态变量;

8.flush-tables:刷新表;

9.flush-threads:刷新线程缓存;

10.flush-privileges:重新加载授权表,相当于reload;

11.kill id,id,…:杀掉mysql的进程;

12.password [new-password]:以当前格式修改密码;

13.old-password [new-password]:以旧的格式修改密码;

14.ping:检查mysqld是否活动;

15.processlist:列出所有活动的进程;

16.reload:重新加载授权表;

17.refresh:刷新所有的表,并重新打开日志文件;

18.shutdown:关闭Server;

19.status:查看服务器的状态信息;

20.start-slave:启动slave;

21.stop-slave:停止slave;

22.variables:打印变量状态;

23.version:查看服务器版本信息;

MySQL工具

1.MySQL Workbench:一个可视化的下一代数据库设计应用程序,可用于高效设计,管理和记录数据库结构;

它有开源和商业两种版本;

2.MySQL Proxy:一个位于客户机与MySQL服务器之间的简单程序,可监视,分析或传输客户机与服务器之间的通信;

MySQL Proxy 的灵活性使其具有多种用途,包括负载平衡/故障转移/查询分析/查询过滤和修改以及其他操作;

该工具当前尚不可用于生产;

3.MySQL Enterprise Monitor:MySQL的可视化企业监视系统,可用于检测MySQL服务器,通知潜在问题并就如何修复这些问题提供建议;

4.MySQL Enterprise Backup:使用该工具可以执行联机非阻塞“热”备份,从完整备份恢复数据,还支持创建压缩的备份文件;

5.MySQL Cluster Manager:通过自动执行常见的管理任务来简化MySQL Cluster Carrier Grade Edition数据库的创建和管理;

TIPS:345工具仅在MySQL商业版本中提供;

MySQL Enterprise Monitor

1.Enterprise Monitor可帮助管理多节点(可水平伸缩)环境中的多台MySQL服务器,调整当前MySQL服务器,发现MySQL数据库应用程序中存在的问题,并在这些问题变成严重问题或代价高昂的故障之前将其修复;

2.此Web GUI应用程序可主动监视企业数据库环境,并就MySQL如何增强MySQL所推动系统的安全性,优化其性能和减少其停机 时间提供专家建议;

3.Enterprise Monitor可监视各种类型的配置,从单个MySQL服务器直到支持繁忙Web站点的大型MySQL服务器群;

— MySQL Enterprise Monitor:系统信息显示板;

— MySQL Enterprise Monitor:访问;

— MySQL Workbench;

MySQL Workbench针对三种主要功能为DBA和开发者提供了基于GUI的跨平台集成工具环境:

1.SQL开发有助于进行以下任务:

编辑和执行SQL查询和脚本;

创建或变更数据库对象;

编辑表数据;

2.数据库设计和建模有助于进行以下任务:

执行增强型实体关系 (enhanced entity relationship, EER)建模;

编辑和执行SQL查询和脚本;

设计,生成和管理数据库;

3.服务器管理(取代了MySQL Administrator)有助于进行以下任务:

启动和停止服务器;

编辑数据库服务器配置;

管理用户;

导入和导出数据;

— MySQL Workbench:GUI窗口;

— MySQL Workbench:访问;

标准版(SE)提供了:

1.OSS版本的商业扩展;

2.高级功能;

3.需要付费;

MySQL Proxy

1.MySQL Proxy使用MySQL网络协议连接到网络,并提供一台或多台服务器与一台或多台MySQL客户机之间的通信;

在最基本的MySQL Proxy配置中,可以执行以下操作:

仅将查询从客户机传递到MySQL服务器,然后返回;

对使用该协议的任何与MySQL兼容的客户机,可不经修改地使用MySQL Proxy;

这包括mysql命令行客户机,任何使用MySQL客户机库的客户机以及任何支持MySQL网络协议的连接器;

监视和变更客户机和服务器之间的通信;

使用查询拦截添加分析,插入其他查询并删除其他结果;

交换信息的拦截可脚本化;

2.使用该代理可以对查询执行额外的监视,过滤或处理,而无需对客户机做出任何修改,客户机甚至不会知道正在与其通信的根本不是真正的MySQL服务器;

3.MySQL Proxy仍在开发中,尚未作为GA软件发行;

可以了解OneProxy;

— MySQL连接器;

— 第三方API;

1.大多数第三方API均基于C客户机库,并针对其他某种语言提供绑定;

2.虽然MySQL开发团队的成员经常与这些产品的开发者密切合作,但是这些API尚未得到Oracle的正式支持;

学习MySQL:体系结构及相关概念

学习MySQL:系统管理
学习MySQL:服务器配置