Percona XtraBackup备份mysql数据库 技术手册

https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
一、安装两个必需库

sudo yum -y install libdv perl-DBD-MySQL

如果libev库在yum源找不到的话,需要在rpmfind.net网站下载自行安装。

wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
rpm libev-4.15-1.el6.rf.x86_64.rpm

二、安装percona-xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.5/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm

https://yq.aliyun.com/articles/59272

https://my.oschina.net/lionel45/blog/691406

http://blog.itpub.net/29418060/viewspace-1676617/

linux screen 命令详解

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。 Continue reading

Laravel中的异常处理

Eloquent try/catch on duplicate key Exception and delete?

I’ve a form for a new vendor where the controller listens for its POST.
From there on I’m creating a new endor and the equivalential login for this vendor.

Controller :

$vendor = Vendor::create( $request->all() );  
$login = Vendor::createLogin($vendor->vendor_id);

the createLogin function :

public static function createLogin($lid){  
    $name = self::find($lid)->vendor_name;  
    $name = explode(' ', $name);  
        
    $vendor_login = [
        'username' => strtolower( end($name) ) . '.vendor',
        'group' => 'vendor'
    ];
    
    try{
        $user = User::create( $vendor_login );
        return $user;
    }
    catch (Illuminate\Database\QueryException $e){
        $error_code = $e->errorInfo[1];
        if($error_code == 1062){
            self::delete($lid);
            return 'houston, we have a duplicate entry problem';
        }
    }

Creating a new, nonexistant one : works perfectly.
However the try/catch block never seems to be reached since
I’m always getting laravels inbuild error site with the QueryException
for the duplicate entry on the users table. How can I make it work,
that on a duplicate entry it deletes the vendor it set before from the
table Vendor AND returns an error to display for the user?

转自:https://laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete

MySQL的InnoDB引擎强烈建议使用自增主键的原因

1)InnoDB使用聚集索引,数据记录本身被存于主索引的叶子节点上,这就要求同一个叶子节点内的各条数据记录按主键顺序存放,因此每当一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子,则开辟一个新的页(节点)。

如果表使用自增主键,那么每次插入新的记录时,记录就会顺序添加到当前索引节点后续位置,当一页写满,就会自动开辟一个新的页。这样就就会形成一个紧凑的索引结构,近似顺序填满,由于每次插入时也不需要移动所有数据,因此效率很高,也不会增加很多额外的开销维护索引。

如果使用非自增主键,由于每次插入主键的值近乎于随机,因此每次新纪录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新纪录插到合适位置而移动数据,甚至目标页面可能已经被写到磁盘而从缓存中清除,这增加了很多额外开销,同时频繁的移动,分页造成了大量的碎片,得到不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建并优化填充页面。

2)由于MySQL从磁盘读取数据时一块一块来读取的,同时,根据局部性原理,MySQL引擎会选择预读一部分和你当前读数据所在内存相邻的数据块,这个时候这些相邻数据块的数据已经存在于内存中。由于数据库大部分是查询操作,这个时候,如果主键是自增的话,数据存储都是紧凑地存储在一起的,那么对于局部性原理利用和避免过多地I/O操作都有着巨大的促进作用

mysql中数据类型与占用空间大小的关系

1、  如一个表有10个int类型的字段,那么每行数据大小为

4(每个int类型占用4字节byte) * 10 = 40Bytes

mysql_int_datatype

2、 如一个表有10个varchar(20)的字段,编码为utf8,那每行占用大小为

3(每个汉字占用3字节) * 20 * 10 = 600Bytes

如果是英文字符的话,则为

1(1个字符占用1个字节) * 20  * 10 = 200Bytes

mysql_varchar_datatype

则以上两种情况 ,每行的数据均<8K (1024byte * 8) ,符合以下规则( 1024byte = 1KB)

mysql

 

Laravel框架数据库CURD操作、连贯操作使用方法

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

一、Selects

检索表中的所有行

$users = DB::table('users')->get();
foreach ($users as $user)
{
var_dump($user->name);
}

从表检索单个行

$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);

检索单个列的行

$name = DB::table('users')->where('name', 'John')->pluck('name');

检索一个列值列表

$roles = DB::table('roles')->lists('title');

该方法将返回一个数组标题的作用。你也可以指定一个自定义的键列返回的数组

$roles = DB::table('roles')->lists('title', 'name');

 

指定一个Select子句

$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();

Select子句添加到一个现有的查询

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();

where

$users = DB::table('users')->where('votes', '>', 100)->get();

Continue reading