如何压缩Mysql数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何压缩Mysql数据库相关的知识,希望对你有一定的参考价值。

如何压缩mysql数据库,请详细一点,什么类型的表是可以压的,怎么压,是命令还是额外工具!!!

压缩表从名字上来看,简单理解为压缩后的表,也就是把原始表根据一定的压缩算法按照一定的压缩比率压缩后生成的表。

1.1 压缩能力强的产品

表压缩后从磁盘占用上看要比原始表要小很多。如果你熟悉列式数据库,那对这个概念一定不陌生。比如,基于 PostgreSQL 的列式数据库 Greenplum;早期基于 MySQL 的列式数据库 inforbright;或者 Percona 的产品 tokudb 等,都是有压缩能力非常强的数据库产品。

1.2 为什么要用压缩表?

情景一:磁盘大小为 1T,不算其他的空间占用,只能存放 10 张 100G 大小的表。如果这些表以一定的比率压缩后,比如每张表从 100G 压缩到 10G,那同样的磁盘可以存放 100 张表,表的容量是原来的 10 倍。情景二:默认 MySQL 页大小 16K,而 OS 文件系统一般块大小为 4K,所以在 MySQL 在刷脏页的过程中,有一定的概率出现页没写全而导致数据坏掉的情形。比如 16K 的页写了 12K,剩下 4K 没写成功,导致 MySQL 页数据损坏。这个时候就算通过 Redo Log 也恢复不了,因为几乎有所有的关系数据库采用的 Redo Log 都记录了数据页的偏移量,此时就算通过 Redo Log 恢复后,数据也是错误的。所以 MySQL 在刷脏数据之前,会把这部分数据先写入共享表空间里的 DOUBLE WRITE BUFFER 区域来避免这种异常。此时如果 MySQL 采用压缩表,并且每张表页大小和磁盘块大小一致,比如也是 4K,那 DOUBLE WRITE BUFFER 就可以不需要,这部分开销就可以规避掉了。查看文件系统的块大小:

root@ytt-pc:/home/ytt#  tune2fs -l /dev/mapper/ytt--pc--vg-root  | grep -i 'block size'Block size:               4096


    1.3 压缩表的优势

    压缩表的优点非常明显,占用磁盘空间小!由于占用空间小,从磁盘置换到内存以及之后经过网络传输都非常节省资源。

    简单来讲:节省磁盘 IO,减少网络 IO。

    1.4 压缩表的缺陷

    当然压缩表也有缺点,压缩表的写入(INSERT,UPDATE,DELETE)比普通表要消耗更多的 CPU 资源。

    压缩表的写入涉及到解压数据,更新数据,再压缩数据,比普通表多了解压和再压缩两个步骤,压缩和解压缩需要消耗一定的 CPU 资源。所以需要选择一个比较优化的压缩算法。

    1.5 MySQL 支持的压缩算法

    这块是 MySQL 所有涉及到压缩的基础,不仅仅用于压缩表,也用于其它地方。比如客户端请求到 MySQL 服务端的数据压缩;主从之间的压缩传输;利用克隆插件来复制数据库操作的压缩传输等等。

    从下面结果可以看到 MySQL 支持的压缩算法为 zlib 和 zstd,MySQL 默认压缩算法为 zlib,当然你也可以选择非 zlib 算法,比如 zstd。至于哪种压缩算法最优,暂时没办法简单量化,依赖表中的数据分布或者业务请求。

参考技术A 9月16日 13:31
一. 安装DBI模块

步骤1:

从TOOLS栏目中下载DBI.zip,下载完后用winzip解开到一个temp目录,共有三个文件:
Readme
DBI.ppd
DBI.tar.gz

步骤2:

在DOS窗口下,temp目录中运行下面的DOS命令:
ppm install DBI.ppd

如果提示无效命令,可在perl/bin目录下运行

二. 安装DBD-Mysql模块

从软件下载中下载DBD-Mysql.zip,安装方法同一.

三. 准备数据库

启动mysql,首先创建一个数据库mydata,然后创建一个表address

mysql> create database mydata;
Query OK, 1 row affected (0.00 sec)

mysql> use mydata;
Database changed
mysql> create table address (
-> id int(5) not null,
-> name varchar(40) not null,
-> email varchar(50) not null,
-> telephone int(12) null);
Query OK, 0 rows affected (0.05 sec)

输入些数据:

mysql> insert into address values (
-> 1,’Nighthawk’,’nighthawk@163.net’,92384092);
Query OK, 1 row affected (0.00 sec)

四. 下面用perl程序来插入若干记录并做查询.

use DBI;

#连接数据库mydata
my $dbh = DBI->connect(’DBI:mysql:mydata’) or die "无法连接数据库: " . DBI->errstr;

print "插入若干记录n";
my $sth = $dbh->prepare(q
INSERT INTO address (id, name,email,telephone) VALUES (?, ?, ?, ?)
) );

print "输入记录,回车结束:";
while ($inputdata =<>)
chop $inputdata;
last unless($inputdata);
my ($id, $name,$email, $tel) = split( /,/, $inputdata);
$sth->execute($id, $name, $email,$tel)

# $dbh->commit;

print "下面根据输入的名字打印出EMAIL地址和电话n";
my $sth = $dbh->prepare(’SELECT * FROM address WHERE name=?’)
or die $dbh->errstr;
print "请输入姓名,回车结束:";
while ($inputname =<>)
my @data;
chomp $inputname;
last unless($inputname);
$sth->execute($inputname) or die "错误: " . $sth->errstr;
while (@data = $sth->fetchrow_array())
print "Email:$data[2]t Telephone:$data[3]n";


#断开连接
$dbh->disconnect;

参考文献:Nighthawk 版权所有

Linux下安装MySQL数据库(压缩包方式安装)

1、这里我将Mysql安装在/usr/local/mysql目录里面,也可以安装在其他地方;

mkdir /usr/local/mysql
2、下载MySQL压缩包

wget http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.11-Linux-glibc2.5-x86_64.tar.gz

// 如果上边的命令不行的话 可以使用下边的命令
curl -O -L http://dev.MySQL.com/get/Downloads/MySQL-5.7/mysql-5.7.11-Linux-glibc2.5-x86_64.tar.gz
3、解压并复制

tar -xvf mysql-5.7.11-Linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.11-Linux-glibc2.5-x86_64/* /usr/local/mysql/
4、创建data目录

mkdir /usr/local/mysql/data
5、创建mysql用户组及其用户

groupadd mysql
useradd -r -g mysql mysql
6、初始化数据

复制代码
[[email protected] mysql] ./bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
2016-01-20 02:47:35 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-01-20 02:47:45 [WARNING] The bootstrap log isn‘t empty:
2016-01-20 02:47:45 [WARNING] 2016-01-19T18:47:36.732678Z 0 [Warning] --bootstrap is deprecated. Please consider using --initialize instead
2016-01-19T18:47:36.750527Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2016-01-19T18:47:36.750560Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
复制代码
7、复制配置文件到 /etc/my.cnf

cp -a ./support-files/my-default.cnf /etc/my.cnf (选择y)
8、MySQL的服务脚本放到系统服务中

复制代码
cp -a ./support-files/mysql.server /etc/init.d/mysqld
修改my.cnf文件

These are commonly set, remove the # and set as required.

basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306

server_id = .....

socket = /tmp/mysql.sock
character-set-server = utf8

Remove leading # to set options mainly useful for reporting servers.

The server defaults are faster for transactions and fast SELECTs.

Adjust sizes as needed, experiment to find the optimal values.

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

复制代码
9、创建In

ln -s /usr/local/mysql/ /usr/bin/
10、启动服务

service mysqld start
11、初始化密码

mysql5.7会生成一个初始化密码,在root中.mysql_secret文件中。

[[email protected] ~]# cat /root/.mysql_secret

Password set for user [email protected]‘ at 2017-03-16 00:52:34

ws;fmT7yh0CM
12、登录并修改密码

[[email protected] ~]# mysql -u root -p

alter user [email protected] identified by ‘tiger‘;

flush privileges;
13、退出重新登录,完成

复制代码
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.11 sec)






































以上是关于如何压缩Mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.6 for Windows 解压缩版配置安装

mysql 5.6 for Windows 解压缩版配置安装

mysql数据库备份怎么保证数据

Linux下安装MySQL数据库(压缩包方式安装)

Linux下安装MySQL数据库(压缩包方式安装)

mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库