记一次MySQL删库的数据恢复

未分类

昨天因为不可描述的原因,数据库直接被 drop database删除。在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路。

第一次干这种事,各种不得法。因为我们既没有备份,也没有开启binlog,连innodb_file_per_tabe_也没有。一番折腾后向万能的朋友圈求救,朋友给了两个链接,最终救了一下命。以下先按编号记下 URL,后续引用之。

  • http://dba.stackexchange.com/questions/23251/is-there-a-way-to-recover-a-dropped-mysql-database

  • https://github.com/chhabhaiya/undrop-for-innodb

  • Recover InnoDB dictionary

其中URL1和URL3的内容基本上相同,是整个恢复工作的蓝本。URL2是URL1中引用的一个twindb团队开发的一个工具,现在他们官方已经删除了,URL2是该工具的一个fork,或者说是备份。

恢复过程以URL3为蓝本,先去URL2 git clone一份代码下来,然后按其说明编译,我们在ubuntu server 14.04 64bit 版本的情况下,成功编译完成,编译中需要安装各种依赖不表。

然后用 stream_parser 处理ibdata1 文件,接下来恢复SYS_TABLES 和 SYS_INDEXES,建议此过程中严格遵守参考资料,比如把这些资料恢复到dumps/default 目录中,而不是随意起名,以免横生枝节。

这里还有一个坑,就是URL3里用的c_parser -4f 是会出错的,而URL1里用的是c_parser -4Df ,就不会出错,所以大家做的时候一定要把这个D加上。感叹一下,如果不细心的人真的没法做这事!摔!

接下来按URL3的说明把数据字典导入 MySQL。这一步可以不做,按URL1里高票答案的方法来获取索引ID,比较麻烦。URL3的方法应该会出这样的错:

ERROR 1148 (42000) at line 2: The used command is not allowed with this MySQL version

这是因为MySQL默认不启用LOAD DATA LOCAL INFILE 导致的,需要给mysql 命令加上–local-infile 参数。这是参考文献的一个坑。趟过这个坑以后,我可以告诉你一个捷径,就是URL2里的代码里其实有一个文件recover_dictionary.sh ,它干的就是恢复数据字典的事情,所以你只要把这个shell脚本里的mysql 都替换成mysql –local-infile -uroot -pxxxxx 就行,其中xxxx是指你的root账号密码,不过前提是你很听话的用了前面说的dumps/default 目录,不然就再多一轮替换。

接下来的内容,大部分是参考文献里没有的了。

恢复数据字典后,就可以用URL3介绍的方式找出你对应的所有数据库和表的索引ID了。这个时候就遇到为 c_parser 提供数据表建表语句的问题了,这个问题难就难在先有鸡还是先有蛋,一般来说,数据库都被删掉了,哪还有办法去搞出CREATE TABLE 这种建表语句呢?好就好在我们用的是django,它对数据迁移的完美支持救了我一命。在这里讲一句题外话,使用类似django/ror/laravel等有数据迁移框架在此就看出多么重要了。只要在根据原有项目做一次migrate,数据表就建好了,这时候只要用mysqldump导出对应表的建表语句即可:

mysqldump --add-drop-table=0 --add-lock=0 -d DBNAME TABLENAME -uroot -p > xxxx.sql

因为c_parser 非常弱,只处理CREATE TABLE 语句,多一点干扰都不行,所以上面的参数都是必要的。

接下来就是参考URL1把某一个表的数据恢复出来,这里有一个坑,URL1里说把数据恢复到dump.tsv里,其实是不对的,这里应该用dumps/default/TABLENAME,别问我为什么知道,我不会告诉你我找这个原因找瞎了眼,好吧,跟你说,因为生成的load_cmd.sql 里直接引用 dumps/default/TABLENAME,无法设置。所以最后我们这里可用的命令是:

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000002410.page -t xxxx.sql > dumps/default/TABLENAME 2> load_cmd.sql

把数据恢复出来以后,执行

mysql --local-infile -uroot -p DBNAME < load_cmd.sql

就可以把数据导进去了,记得在数据库里查询一下有没有成功,如果没有数据恢复出来,应该是其中的某些环节出了问题。

这样就成功恢复了某一个表,只要按这里最后三条命令(导出建表语句、恢复数据、导入数据)重复地做下去,你就能把基本上所有的数据都恢复出来了。之所以说是“基本上”,原因是我系统中使用了utf8mb4 编码(为了兼容emoji),结果是如果数据中有emoji的内容就会在导入数据的环节出错,暂时没有找到办法恢复这个数据。

以上就是整个恢复过程,枯燥、压力山大,这种事情我不想再经历了。如果你也遇到这样的数据恢复需求,希望这篇笔记能够帮到你。但也不要指望我能帮到你更多了,我的经验也仅止于此,天大地大,就此别过,不要找我。谢谢!

mongodb导入导出备份恢复

mongodb数据库同样离不开必要的维护,如备份、恢复、导入、导出。
其实备份和恢复比导入和导出要方便些,而且一般不会出错,所以大部分时候使用备份和恢复操作就可以了

1. 备份Mongodb

mongodump -h RuiyIp -d dataname -o /home/aa/dev/mongodb/data
mongodump mongo导出数据库命令 mongodump --help 可以查看该命令下所有的帮助

-h 导出源
-d 要导出的数据库名称
-o 数据库要导出的位置

在终端滚过N行之后,数据库导出完成,可以去/home/aa/dev/mongodb/data 目录下查看导出的文件,bson格式的(我导出后没有马上就看到文件,等了一会才出现的,原因不明)

2. 恢复使用:mongorestore 命令

mongorestore -d cmsdev  /home/xx/dev/mongodb/data/cmsdev

-d 使用的数据库名称

后面直接加你刚才导出的目录,这样是直接恢复所有表
如果-c 是恢复一个表

3. 导入

mongoimport -d my_mongodb -c user user.dat

参数说明:

-d 指明使用的库, 本例中为” my_mongodb”
-c 指明要导出的表, 本例中为”user”
可以看到导入数据的时候会隐式创建表结构

4. 导出

mongoexport -d my_mongodb -c user -o user.dat

参数说明:

-d 指明使用的库, 本例中为” my_mongodb”
-c 指明要导出的表, 本例中为”user”
-o 指明要导出的文件名, 本例中为”user.dat”

从上面可以看到导出的方式使用的是JSON 的样式

memcached数据库简单配置介绍

一、memcached数据库

(基于内存的储存方式;默认端口11211)

1、装包yum -y install memcached telnet (telnet是一款远程访问工具,mem软件无客户端,所以需安装telnet连接服务器)

2、启服务:systemctl restart memcached.server
查看端口是否启用:netstat -antpu | grep mem

3、查看配置文件(默认不需要修改):vim /etc/sysconfig/memcached

4、连接数据库验证是否可用:telnet 127.0.0.1 11211 (测试环境使用的工具)

set name 0 180 3 添加一个数据
get name 查看添加的数据
  • 0代表数据不压缩
  • 180数据在内存里只存180秒
  • 3代表存3个字符的数据

5、安装php和数据库关联的软件

正常情况下,数据库要和php脚本关联起来,php软件包并不具备关联功能,需要手动安装;

软件包可以通过搜索查看:yum list | grep memcached

yum -y install php-pecl-memcache (安装可以关联mem数据库的软件)

开启次服务systemctl restart php-fpm

6、之前做过nginx的动静分离,现在可以直接放一个php的页面到html下面直接访问;

二、基于java的web集群指定共用数据库

1、这个环境需要在两个web服务器上配置,先cp软件
需要先安装一个jave关联memcached的软件,这个软件只需要在lnmp中cp相应文件即可实现;

cd lnmp_soft/session
cp *jar /usr/local/tomcat/lib (关联软件的相关包)
cp context.xml /usr/local/tomcat/conf/ (配置文件)

2、修改配置文件vim /usr/local/tomcat/conf/context.xml
只需要修改36行的配置,写入我们web集群共用的memcached数据库的ip地址

3、重启web服务;启动数据库

记录一次失败的 Upgrade MySQL to MariaDB 经历

摘要

每次“折腾”其实都是有不少收获的,比如这次的折腾虽然以失败告终,但是至少也算是体验了一番Upgrade MySQL to MariaDB的过程,对MariaDB也算是有了一个初步的认识了。有条件还是要尽早将MySQL替换为MariaDB最好,至于说数据的导入、导出完全不用担心“转换”的,它们之间的兼容性那真的是“刚刚的”,毕竟是出自同一个创始人之手的开源数据库嘛!

其实这次升级 MySQL 是个很偶然的决定,主要就是看到了 wooCommerce 插件升级的时候联想到了最近总是发现在使用了 wooCommerce 插件后数据库总有不正常错误出现,从 wooCommerce 插件的支持情况来看可能是因为 MySQL 版本低于 5.6 造成的,所以就想升级 MySQL 的打算了,受制于服务器只有 1G 内存一直没有实现,还以为 MariaDB 对内存没有这个要求呢!

未分类

想到就要行动起来,因为使用的是军哥的 LNMP1.5 测试版,在 upgrade.sh 脚本里就自带了 Upgrade MySQL to MariaDB 的选项,就直接用脚本升级了,数据库太大了,编译安装耗时近一个多小时。结果是彻底失败,MariaDB 里竟然没有任何数据表,PhpMyAdmin 里也是彻底乱了套,界面错位,无法正常操作。折腾了两个多小时才发现是 ngx_lua_waf 拦截造成的,无奈暂时关闭 WAF。这时候站点已经都无法访问了。没有办法只能请出阿里云的镜像回滚恢复了。

恢复正常后还是不甘心呀!所以继续努力继续折腾,这次提前把数据库都导出来以备不时之需,关闭 WAF 防火墙重新来过,近一个小时的等待后终于成功了,这次很完美,数据表依然是丢失的,还好编译前有备份,立马导入数据,又发现 MariaDB 的 root 密码竟然无效了,只能重置数据库密码了。终于恢复网站访问了!么么哒!!!

未分类

等等,有点儿不对劲儿,服务器控制台终端好卡的感觉,一看负载,我去一直在“飙升”直至网站打开出现 503 错误,负载还在持续飙升一路到 50 多了!我去,这也太猛了吧!难道是因为 MariaDB 没有优化所致?于是又对 MariaDB 的配置文件进行了一番研究调整了一些参数优化了一番,重新载入 MariaDB 后,CPU 的负载依然是 90%以上,这时候突然想起来 MySQL 5.6 以后的版本对服务器内存有要求至少是 2G 以上,难道 MariaDB 也有这个要求,MariaDB 的版本我选的是 10.2.12 版,百度、谷姐一番后基本上可以确定就是服务器物理内存太小造成的了!哎,无语了,看来升级到 MariaDB 也是没有办法的,只能是镜像回滚恢复了。

至此,这次 Upgrade MySQL to MariaDB 的折腾还是以失败而告终了,服务器配置太低是主要原因,虽然 MariaDB 那么的诱人,但至少目前来看是无福消受了!我说为啥阿里云 ECS 1G1 核的卖的这么便宜,原来又是“套路”呀!唉,真的是彻底的服了!

不过,每次“折腾”其实都是有不少收获的,比如这次的折腾虽然以失败告终,但是至少也算是体验了一番 Upgrade MySQL to MariaDB 的过程,对 MariaDB 也算是有了一个初步的认识了。有条件还是要尽早将 MySQL 替换为 MariaDB 最好,至于说数据的导入、导出完全不用担心“转换”的,它们之间的兼容性那真的是“刚刚的”,毕竟是出自同一个创始人之手的开源数据库嘛!

MariaDB/MySQL配置文件my.cnf解读

MariaDB/MySQL的默认设置性能非常差,仅仅起一个功能测试的作用,不能用在生产环境中,因此要对一些参数进行调整优化。当然,对配置文件各参数的调整需要根据实际环境,不同时期不同数量级的数据进行性能优化。

未分类

MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。本文的参数配置基于MariaDB 10.2,硬件内存4G。文中一些选项值的设置只是推荐值,不要盲目的接受这些建议。每个 MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

基本结构

[client]
port        = 3306 #客户端默认连接端口
socket      = /tmp/mysql.sock  #用于本地连接的socket套接字

[mysqld]  # 服务端基本配置
port        = 3306 # mysql监听端口
socket      = /tmp/mysql.sock #为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
user    = mariadb # mysql启动用户
basedir = /usr/local/mariadb # 安装目录
datadir = /data/mysql # 数据库数据文件存放目录
log_error = /data/mysql/mariadb.err #记录错误日志文件
pid-file = /data/mysql/mariadb.pid  #pid所在的目录
skip-external-locking  #不使用系统锁定,要使用myisamchk,必须关闭服务器
...

my.cnf配置文件以方括号如[client]区分模块作用域,其中[client]表示客户端配置,[mysqld]是服务端配置。以上几个选项是最基础的,每个选项有简单说明,其中有关路径的配置是基于本站文章:CentOS7下源码编译安装MariaDB 10.2和Linux下使用二进制格式安装MariaDB的安装路径来配置的,所以在配置前可以先按照两文先安装好MairaDB。

选项配置及说明

key_buffer_size = 32M 这个参数用来缓存MyISAM存储引擎的索引参数。MySQL5.5默认为InnoDB存储引擎,所以这个参数可以设置小点,64MB即可。

max_allowed_packet = 1M 允许最大接收数据包的大小,防止服务器发送过大的数据包。可以设置为16MB或者更大,但设置的太大也可能有危险。

table_open_cache = 128 #MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64,假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。

sort_buffer_size = 768K 在表进行order by和group by排序操作时,由于排序的字段没有索引,会出现Using filesort,为了提高性能,可用此参数增加每个线程分配的缓冲区大小。默认为256KB,这个参数不要设置过大,一般在128~256KB即可。另外,一般出现Using filesort的时候,要通过增加索引来解决。

net_buffer_length = 8K 包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。

read_buffer_size = 768K 该参数用于表的顺序扫描,表示每个线程分配的缓冲区大小。比如在进行全表扫描时,MySQL会按照数据的存储顺序依次读取数据块,每次读取的数据块首先会暂存在read_buffer_size中,当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。默认为128K,这个参数不要设置过大,一般在128~256之间。

read_rnd_buffer_size = 512K 该参数用于表的随机读取,表示每个线程分配的缓冲区大小。比如,按照一个非索引字段做order by排序操作时,就会利用这个缓冲区来暂存读取的数据。默认为256KB,这个参数不要设置过大,一般在128~512KB。

myisam_sort_buffer_size = 8M 当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”

thread_cache_size = 16 线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。

query_cache_size = 16M 缓存select语句和结果集大小的参数。查询缓存会存储一个select查询的文本与被传送到客户端的相应结果。如果之后接收到一个相同的查询,服务器会从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。如果你的环境中写操作很少,读操作频繁,那么打开query_cache_type=1,会对性能有明显提升。如果写操作频繁,则应该关闭它(query_cache_type=0)。

tmp_table_size = 32M 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。

explicit_defaults_for_timestamp = true 是否显示默认时间戳

#skip-networking

max_connections = 500 该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

max_connect_errors = 100 如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。

open_files_limit = 65535 mysql打开最大文件数

log-bin=mysql-bin 这些路径相对于datadir

binlog_format=mixed 日志格式

server-id = 1 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。在复制数据同步的时候会用到,Helloweba后面会有文章介绍。

expire_logs_days = 10 启用二进制日志后,保留日志的天数。服务器会自动清理指定天数前的日志文件,如果不设置则会导致服务器空间耗尽。一般设置为7~14天。

default_storage_engine = InnoDB 新数据表的默认存储引擎(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。

innodb_file_per_table = 1 InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

innodb_data_home_dir = /data/mysql InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。

innodb_data_file_path = ibdata1:10M:autoextend 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。

innodb_log_group_home_dir = /data/mysql 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。

innodb_buffer_pool_size = 128M 这个参数是InnoDB存储引擎的核心参数,默认为128KB,这个参数要设置为物理内存的60%~70%。

innodb_log_file_size = 32M 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。

innodb_log_buffer_size = 8M 事务日志所使用的缓存区。InnoDB在写事务日志的时候,为了提高性能,先将信息写入Innodb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)时,再将日志写到文件(或者同步到磁盘)中。可以通过innodb_log_buffer_size参数设置其可以使用的最大内存空间。默认是8MB,一般为16~64MB即可。

innodb_flush_log_at_trx_commit = 1 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。

innodb_lock_wait_timeout = 50 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。

示例:内存4G的my.cnf配置

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
user    = mariadb
basedir = /usr/local/mariadb
datadir = /data/mysql
log_error = /data/mysql/mariadb.err
pid-file = /data/mysql/mariadb.pid
skip-external-locking
key_buffer_size = 64M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 1M
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 16M
thread_cache_size = 32
query_cache_size = 32M
tmp_table_size = 64M

explicit_defaults_for_timestamp = true
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id   = 1
expire_logs_days = 10

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir = /data/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/mysql
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 1M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

使用sysbench测试mariadb性能的经验总结

github地址: https://github.com/akopytov/sysbench
我测试用的系统: CentOS Linux release 7.2.1511 (Core)
sysbench版本用了最新的, 1.1.0
过程中也搜了很多教程, 所以重复的就不多说, 主要说一下教程中没看到的或不够清楚的

1. 安装

安装可以用yum也可以自己下下来编译, 我两种都尝试了一下, 自己编译注意看情况指定–with-mysql-includes和 –with-mysql-libs, 比如:

./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib

如果是上面这种方式编译安装的, 将会只带mysql驱动, 跑测试的时候就不用指定 –db-driver

如果是yum安装的, 默认除了mysql还会带一个PostgreSQL的驱动, 就得指定 –db-driver=mysql, 否则会报错提示没指定驱动啥的

带了哪些驱动可以从sysbench –help里看到

2. 跑测试

勤看帮助。

sysbench –help的最上面是通用选项, 主要用到的比如线程数(–threads), 限制跑多久(–time), 跑多少次事件(–events)
sysbench –help的最后, 可以看到自带的测试方式有这些, 这就是–test=后面可以带的参数

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

基础用法(help, prepare, run, cleanup)参考github页面

想测数据库的, 一开始可能会有点懵逼, 因为这里没看到测试数据库的参数, 网上教程大都是旧的, 按那些填也没用, 而github主页上好像也没找到说明?

我也蛋疼了好一会儿, –help和github主页看了无数遍, 终于才在github主页最上面瞄到这个:

未分类

我tm也是醉了, 这里一般都当作介绍区域看一眼就跳过了, 谁会想到唯一能找到使用方式的线索在这里???

所以搜一下这个oltp_.lua吧, find / -name oltp_.lua, 会列出一堆lua脚本, 选择你要测的直接复制完整路径作为参数传给–test, 然后其他一堆参数该填的填, 就可以跑起来了

要注意的主要是这个参数–rand-type=, 这里官网给了可选的范围: {uniform, gaussian, special, pareto, zipfian}, 其他几个还能勉强看出是一些数学分布, uniform和special完全不知道是干什么的, uniform只知道有个统一的意思, 并不能确定, 搜也搜不到, 于是提了个issue问了一下:

未分类

好吧原来uniform就是离散均匀分布, 简单来说就是普通随机, special如作者所说,是不科学的,但它又是默认值……(还能说啥,前面的白测了_(:з」∠)
(简单对比了一下uniform和special, special测出来的性能大致是uniform的1.7倍)

3. 各lua脚本的区别

虽然没写过lua, 不过打开脚本看看基本能看出来, 我只测了下面三个(下列为后缀), 它们分别干的事是:

•  insert:, 即为纯insert
•  read_write 包括:  select (range, sum, order, distinct) ,  update,  update(non-index),  delete
•  read_only: select (range, sum, order, distinct)

--range_selects 参数决定select是否是仅单点 (只使用where=,而不使用上面括号中条件)

4. 其他

注意帮助最后一句写的See ‘sysbench help’ for a list of options for each test.
所以要看参数的话就是 sysbench xx.lua help, 可以看到参数用来设置测试用的表数量, 表大小之类的

自己撸了个python脚本测insert(主要是为了测别的), 用了sqlalchemy, 性能和测试脚本差距比较大…

我是三台虚拟机做了galera分布式集群的, 实测发现单节点跑测试时其他节点cpu也会飚起来, 所以就不贴结果了, 可能参考性不够强.

编译安装MariaDB

环境centOS6.9 MariaDB10.1.8

1、环境准备

yum -y install ncurses-devel 
yum -y install gcc-c++

2、介质准备

mariadb10.1.8,cmake3.8.2

3、安装cmake

tar xfz cmake-3.8.2.tar.gz
    cd cmake-3.8.2
    ./bootstrap
    make
    make install
    cmake --version

4、创建用户和组、数据目录

groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /home/data/mariadbdata
chown -R mysql:mysql /home/data/mariadbdata

5、解压、编译安装

tar xfz mariadb-10.1.8.tar.gz
cd mariadb-10.1.8

cmake . -DCMAKE_INSTALL_PREFIX=/home/opt/mariadb -DMYSQL_DATADIR=/home/date/mariadbdata -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make
make install

6、安装数据库,配置my.cnf

cp -pv /home/opt/mariadb/support-files/my-innodb-heavy-4G.cnf /home/opt/mariadb/my.cnf
scripts/mysql_install_db --defaults-file=${INSTALL_DIR}/my.cnf --user=mysql --basedir=/home/opt/mariadb --datadir=/home/date/mariadbdata

7、配成Linux服务(名称mariadb)

cp -pv ${INSTALL_DIR}/support-files/mysql.server /etc/init.d/mariadb
chkconfig --add /etc/init.d/mariadb
chkconfig --list mariadb
service mariadb start

Linux之mariaDB的应用(论坛的搭建)

在mariadb的学习后,可以简单搭建一个论坛;
由于我之前已经下载了论坛文件的压缩包,这里就直接使用了

(1)下载模板Discuz_X3.2_SC_UTF8.zip

未分类

(2)解压包Discuz_X3.2_SC_UTF8.zip ##有readme,upload,utility,database四个目录

未分类

(3)cp -r upload/ /var/www/html/ ##把解压出来的upload目录复制到/var/www/html/

未分类

(4)chmod 777 /var/www/html/upload/* -R ##给目录下所有文件权限

未分类

测试:地址栏:IP/upload ##进行安装

未分类

安装

未分类

设置管理员用户密码

未分类

登录

未分类

主页

未分类

每一步都有提示,按提示安装

curl  -I   域名    域名         ##查看网站详情

baidu:

未分类

网易邮箱163:服务器采用nginx(俄罗斯的)

未分类

MariaDB基本命令

MariaDB名称来自Michael Widenius的女儿Maria的名字。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

1. 数据库安装并初始化

yum install mariadb-server.x86_64 -y    ##安装数据库
systemctl start mariadb         ##开启数据库服务
netstat -antlupe|grep mysql     ##查看数据库的接口信息
mysql                   ##测试能否打开数据库
vim /etc/my.cnf             ##关闭数据库对外接口
    skip-networking=1       ##在第6行添加命令(跳过网络服务)
:wq
systemctl restart mariadb       ##重启服务
netstat -antlupe|grep mysql     ##此时查看数据库端口已经关闭
mysql_secure_installation       ##数据库初始化,这里我们输入密码后全部选择y

2. MYSQL基本操作指令

mysql -uroot -p123  ##进入数据库(这里不要养成习惯因为输入密码时明文的)

1)查看****重点内容

show databases;                 ##显示数据库
use mysql;                  ##进入数据库
show tables;                    ##显示数据库中的表
select * from mysql.user;           ##查询mysql库下的user表中的数据
desc user;                  ##查看user表的数据结构
flush privileges;               ##刷新数据库信息
select host,user,password from user;        ##查询user表中的host,user,password字段
select host,user,password from user where host="::1"##查询表中字段中有关::1的数据

未分类

未分类

2)创建

create database westos;             ##创建westos数据库
use westos;                 ##进入westos数据库
create table linux(             ##创建表,user,passwd字段
user varchar(15) not null,
passwd varchar(15) not null             ##varchar可变型字符变量
 );
insert into linux values ('student','student');     ##在linux表中插入值为student student
select * from linux;                    ##查询linux中的数据

未分类

未分类

3)更改

alter table linux rename messages;          ##将linux表重命名为messages
alter table linux add age varchar(4);           ##添加age字段到linux表中
ALTER TABLE linux DROP age;             ##删除age字段
ALTER TABLE linux ADD age VARCHAR(5) AFTER name;    ##在name字段后添加字段age
ALTER TABLE linux ADD age VARCHAR(5)            
update linux set password=student where username=student;##更新linux表中user1的密码为password2

4)删除

delete from linux where username=user1;         ##删除linux表中user1的所有内容
drop table linux;                   ##删除linux表
drop database westos;                   ##删除westos数据库

5)用户授权

CREATE USER lee@localhost identified by 'lee';      ##创建用户lee密码为lee
grant select insert on  *.* to lee@localhost;   ##授权user1 密码为passwd1只能在本地 查询数据库的所以内容 
grant all on mysql.* to lee@'%' identified by 'lee2';   ##授权user2 密码为passwd2  可以从远程任意主机登录mysql 并且可以对mysql数据库任意操作
show grants for lee@localhost;          ##查看已经修改的权限;        
revoke insert on *.* from lee@localhost;    ##删除掉用户lee的添加数据权限;

6)备份

/var/lib/mysql
mysqldump -uroot -p123 westos > /mnt/mysql.sql  ##备份mysql库到mysql.bak
mysql -uroot -p123 -e "DROP database westos"
mysql -uroot -p123 westos < /mnt/mysql.sql      ##恢复mysql.bak 到westos库

7)mysql 密码恢复

/etc/init.d/mysqld stop
或者systemctl stop mariadb
mysqld_safe --skip-grant-tables &   ##跳过grant-tables授权表  不需要认证登录本地mysql数据库
update mysql.user set password=password('westos') where user='root';    ##更新mysql.user 表中条件为root用户的密码为加密westos
修改完成后
ps aux|grep mysql
kill -9 +端口号 结束所有关于mysql的进程
systemctl start mysql 

3. php-mysq

@@php -m 可以查看php所支持的服务,因为本身默认不支持mysql
所以需要安装php-mysql模块才能使用@@
phpmyadmin

yum install php php-mysql httpd mysql mysql-server  ##安装需要的服务
tar jxf phpmyadmin-*.tar.bz2 -C /var/www/html       ##将下载好的东西解压
mv phpmyadmin phpadmin                  ##重命名
cp config.sample.inc.php config.inc.php         ##复制文件
vim config.inc.php                  ##php3.4版本不需要
add 
$cfg['blowfish_secret'] = 'test';
/etc/init.d/httpd start

测试:http://172.25.254.117/phpadmin

未分类

未分类

4. discuz论坛建立

下载DISCUZ压缩包

unzip解压
cp -r upload /var/www/html/
chomd 777 /var/www/html/upload/* -R

测试:http://172.25.254.117/upload

未分类

LVM之Cache加速

概述

我们知道LVM是管理本地磁盘,更好的提供块设备服务的机制;

在现实环境中,我们的机器通常都有几种不同类型的磁盘存在,高性能的磁盘容量低,容量大的磁盘性能差,那如何利用Linux系统的各种cache机制来提升LVM卷的性能呢?

存储磁盘分类

通常我们使用的存储磁盘有三种,分别对应不同的容量、性能、价格,有:SATA盘,SSD盘和PCIE-SSD;

他们三个的大致性能容量和价格如下表所示:

未分类

从上面可以看出,可以作为普通磁盘加速的磁盘有:SSD盘和PCIE-SSD,其中SSD盘是最常见和用的最多的,PCIE卡在超高性能需求场所有使用。

注:其实现在SSD/PCIE-SSD的每GB价格相差不大了,若对超高性能有需求,PCIE-SSD是个很好的选择;

Cache算法

通常我们使用高性能磁盘来加速低性能磁盘时,都会选择一种Linux内核支持的Cache算法,现在Linux内核支持的常用Cache算法有如下几种;

flashcache

flashcache 是 facebook 开源的 ssd 存储产品,它基于内核的 devicemapper 机制,允许将 ssd 设备映射为机械存储设备的缓存,堆叠成为一个虚拟设备供用户读写,从而在一定程度上兼顾 ssd 的高速与机械存储设备的高容量,更加经济高效地支撑线上业务。

flashcache 支持三种缓存策略:

  • 回写(Write Back):修改内容之后,并不立即写入后端设备
  • 写透(Write Through): 修改内容时写入后端设备,同时也更新前端设备中的缓存块
  • 环写(Write Around): 修改内容时,先写入后端设备,同时使前端设备中对应的缓存块失效

参考:

https://github.com/facebookarchive/flashcache

https://en.wikipedia.org/wiki/Flashcache

bcache

bcache是linux内核块设备层cache,类似于flashcache使用ssd作为hdd的缓存方案,相比于flashcache,bcache更加灵活,支持ssd作为多块hdd的共享缓存,并且还支持多块ssd(还未完善),能够在运行中动态增加,删除缓存设备和后端设备。

从3.10开始,bcache进入内核主线。bcache支持writeback、writethrough、writearoud三种策略,默认是wriththrough,可以动态修改,缓存替换方式支持lru、fifo和random三种。

参考:

https://bcache.evilpiepirate.org/

http://www.sysnote.org/2014/06/20/bcache-analysis/

dm-cache

作为linux内核的一部分,dm-cache采用device mapper机制允许用户建立混合卷。dm-cache可以采用一个或多个快速设备为后端慢速存储系统扮演缓存的角色。

dm-cache设计成由3个物理存储设备来混合成一个逻辑卷的形式。操作模式和缓存策略决定了缓存数据的性能。这三个物理设备分别为:

  • 原始设备:提供主要的慢速存储(通常是一个硬盘或者SAN)
  • 缓存设备:提供高速原始设备数据的缓存(通常是一个SSD)
  • 元数据设备:记录硬盘块在缓存中的位置,脏标志以及执行缓存策略所需的内部数据

dm-cache支持写回,写通和旁路三种模式。

参考:

https://en.wikipedia.org/wiki/Dm-cache

LVM加速策略

flashcache

基于flashcache的使用策略(SSD-SATA 1对1),我们有如下策略:

未分类

bcache

bcache可以用一块SSD盘做多个SATA盘的缓存,有如下策略:

未分类

LVM自带Cache策略

LVM自带Cache策略可以配置两个LV之间做缓存,有如下策略:

未分类

LVM Cache策略选择

现实中,考虑稳定性和可靠性,使用flashcache作为Cache策略的比较多。

但最近bcache也越来越得到大范围的使用,在某些测试报告中,其性能多数场景优于flashcache。