So Tired !_! 逆水行舟, 不进则退!

8Jul/16

MongoDB 备份(mongodump)与恢复(mongorerstore)

Posted by Nick Xu

MongoDB数据备份

在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。

mongodump命令可以通过参数指定导出的数据量级转存的服务器。

语法

mongodump命令脚本语法如下:

>mongodump -h dbhost -d dbname -o dbdirectory
  • -h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
  • -d:需要备份的数据库实例,例如:test
  • -o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

实例

在本地使用 27017 启动你的mongod服务。打开命令提示符窗口,进入MongoDB安装目录的bin目录输入命令mongodump:

>mongodump

执行以上命令后,客户端会连接到ip为 127.0.0.1 端口号为 27017 的MongoDB服务上,并备份所有数据到 bin/dump/ 目录中。命令输出结果如下:

MongoDB数据备份

mongodump 命令可选参数列表如下所示:

语法 描述 实例
mongodump --host HOST_NAME --port PORT_NUMBER 该命令将备份所有MongoDB数据 mongodump --host w3cschool.cc --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME 该命令将备份指定数据库的集合。 mongodump --collection mycol --db test

MongoDB数据恢复

mongodb使用 mongorerstore 命令来恢复备份的数据。

语法

mongorestore命令脚本语法如下:

>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
  • -h:MongoDB所在服务器地址
  • -d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • --directoryperdb:备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
  • --drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

接下来我们执行以下命令:

>mongorestore

执行以上命令输出结果如下:

MongoDB数据恢复

Tagged as: Comments Off
6Jun/16

mini osd 手动接isp引脚刷bootloader

Posted by Nick Xu

发现mini osd很容易出问题, 第一次刷了对应f3飞控的osd后用了几次就没有osd信息了, 只有图像, 后来又刷了一次, 结果还是用几次后又没了, 而且这次还无法用USB2TTL线刷系统, 听说只能用ISP线来刷单片机, 结果发现这MINI OSD根本没有接上ISP的引脚, 又不知道哪个才是ISP引脚, 找了N久, 在即将要放弃时, 终于找到了ISP引脚图(其实最重要的只是这张图, 其它都是次要)

 

MINI OSD ISP 引脚标注图, 触点很小, 接线时小心, 别短路了.

BOOTLOADER FLASH

下图是我的接线, 这是已经刷完BOOTLOADER后测试刷OSD系统了

IMG20160603223727

然后就是刷BOOTLOADER了, 当然你得先有ISP刷写器,我是USBasp刷写器, 装progisp1.72, 懒得打字了, 直接看图吧, 从论坛上找过来的

522F9946-4E0F-4922-991D-28FA57CDB229

第四步, 固件位置在 arduino-1.0.1\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex ,根据自己的arduino安装目录找吧

刷完BOOTLOADER就回到 arduino 刷OSD系统吧.

貌似手动刷了BOOTLOADER后变稳定了, 不会出现用几次就无法显示osd信息的情况, 估计是出厂时预刷有问题或者是出厂BOOTLOADER有问题. 还有一种可能是我的USB2TTL前两次刷的时候是跳线到3.3v而不是5v, 虽然接线还是接到5v的位置, 不过目前已无法考究具体是哪个原因导致的了.

 

 

Filed under: 其它, 单片机 Comments Off
18May/16

How To Mount a Remote Directory With SSHFS on a Linux

Posted by Nick Xu

How can I mount a remote directory with ssh on a Linux bases system? How do I use SSHFS to mount remote file systems over SSH on a Ubuntu or Debian/RHEL/CentOS/Arch Linux system?

SSH is a secure protocol and you can use it to mount a directory on a remote server or local laptop with the help of the SSHF service. With SSHFS you can mount remote server file system to your local development workstation/laptop powered by Linux.

More on SSHFS

sshfs is a filesystem based on the SSH file transfer protocol. It is used on a client system i.e. you need to install sshfs package on your local computer/laptop powered by CentOS/RHEL/Ubuntu/Debian/Arch Linux. No need to install anything on server (server1.cyberciti.biz). You only need an openssh server installed on server side. Our sample setup:

Fig.01: Our sample setup

Fig.01: Our sample setup

Installing SSHFS on a Ubuntu/Debian/Mint Linux

Type the following apt-get command:

sudo apt-get install sshfs

Sample outputs:

[sudo] password for nixcraft:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  sshfs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 41.7 kB of archives.
After this operation, 138 kB of additional disk space will be used.
Get:1 http://mirror.ox.ac.uk/sites/archive.ubuntu.com/ubuntu/ trusty/main sshfs amd64 2.5-1ubuntu1 [41.7 kB]
Fetched 41.7 kB in 1s (27.8 kB/s)
Selecting previously unselected package sshfs.
(Reading database ... 247545 files and directories currently installed.)
Preparing to unpack .../sshfs_2.5-1ubuntu1_amd64.deb ...
Unpacking sshfs (2.5-1ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up sshfs (2.5-1ubuntu1) ...

Installing SSHFS on an Arch Linux

Type the following command:

sudo pacman -S sshfs fuse

Installing SSHFS on a RHEL (Red Hat)/CentOS Linux

First, turn on EPEL repo and then type the following yum command to install FUSE-Filesystem to access remote filesystems via SSH on a CentOS/RHEL:

sudo yum install fuse-sshfs

Sample outputs:

Loaded plugins: auto-update-debuginfo, protectbase, rhnplugin, security
This system is receiving updates from RHN Classic or RHN Satellite.
Setting up Install Process
0 packages excluded due to repository protections
Resolving Dependencies
--> Running transaction check
---> Package fuse-sshfs.x86_64 0:2.4-1.el6 will be installed
--> Processing Dependency: fuse >= 2.2 for package: fuse-sshfs-2.4-1.el6.x86_64
--> Running transaction check
---> Package fuse.x86_64 0:2.8.3-4.el6 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
=======================================================================================================================
 Package                   Arch                  Version                     Repository                           Size
=======================================================================================================================
Installing:
 fuse-sshfs                x86_64                2.4-1.el6                   epel                                 52 k
Installing for dependencies:
 fuse                      x86_64                2.8.3-4.el6                 rhel-x86_64-server-6                 71 k
 
Transaction Summary
=======================================================================================================================
Install       2 Package(s)
 
Total download size: 123 k
Installed size: 115 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): fuse-2.8.3-4.el6.x86_64.rpm                                                              |  71 kB     00:00
(2/2): fuse-sshfs-2.4-1.el6.x86_64.rpm                                                          |  52 kB     00:00
-----------------------------------------------------------------------------------------------------------------------
Total                                                                                  173 kB/s | 123 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : fuse-2.8.3-4.el6.x86_64                                                                             1/2
  Installing : fuse-sshfs-2.4-1.el6.x86_64                                                                         2/2
  Verifying  : fuse-sshfs-2.4-1.el6.x86_64                                                                         1/2
  Verifying  : fuse-2.8.3-4.el6.x86_64                                                                             2/2
 
Installed:
  fuse-sshfs.x86_64 0:2.4-1.el6
 
Dependency Installed:
  fuse.x86_64 0:2.8.3-4.el6
 
Complete!

How do I mount the remote file system?

The syntax is

sshfs user@server /path/to/mountpoint
sshfs user@server /path/to/mountpoint options

First, create a directory using mkdir command:

sudo mkdir /mnt/server1

I’m going to mount file system using root user and you need to type root password when prompted:

sudo sshfs root@192.168.1.142:/ /mnt/server1/
 
##  OR use ssh key based login ##
sudo sshfs -o IdentityFile=~/.ssh/keyfile /mnt/server1/

Sample outputs:

Password for root@freebsd10:

Verify it:

sudo df -h

Sample outputs:

Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/wks05-root  487G  114G  350G  25% /
none                    4.1k     0  4.1k   0% /sys/fs/cgroup
udev                     17G  4.1k   17G   1% /dev
tmpfs                   3.4G  1.9M  3.4G   1% /run
none                    5.3M     0  5.3M   0% /run/lock
none                     17G  160k   17G   1% /run/shm
none                    105M   50k  105M   1% /run/user
/dev/sda1               239M   89M  138M  40% /boot
root@192.168.1.142:/     20G   12G  6.8G  64% /mnt/server1

To access and/or to see the remote file system, run:

sudo -s
cd /mnt/server1
ls -l

Sample ouputs:

Fig. 02: sshfs in action

Fig. 02: sshfs in action

Dealing with “Permission denied” error and recommended procedure for mounting the remote directory

If you get an error that read as cannot access server1: Permission denied, add yourself to a group called fuse:

$ sudo gpasswd -a "$USER" fuse
Adding user nixcraft to group fuse

Next, create a mount point inside your own home directory:

$ mkdir $HOME/server1
$ ls -ld !$
ls -ld $HOME/server1
drwxrwxr-x 2 nixcraft nixcraft 4096 Mar  8 04:34 /home/nixcraft/server1

To mount the remote file system, enter:

sshfs -o idmap=user  root@192.168.1.142:/ $HOME/server1
df
ls -l $HOME/server1
Fig.03: Using sshfs without root access on local laptop/desktop

Fig.03: Using sshfs without root access on local laptop/desktop

How do I unmount the remote file system?

The syntax is:

sudo umount /mnt/server1
 
## OR ##
fusermount -u /mnt/server1

Verify it:

df -h

How can I permanently mount the remote file system by updating /etc/fstab?

Edit the /etc/fstab file, enter:

sudo vi /etc/fstat

The syntax is:

userNameHere@FQDN_OR_IP_HERE:/path/to/source/  /local/mountdir/  fuse.sshfs  defaults,_netdev  0  0

Examples

Add the following entry at the bottom of the file:

sshfs#root@192.168.1.142:/ /mnt/server1

Another example with additional options:

sshfs#$root@192.168.1.142:/ /mnt/server1 fuse defaults,idmap=user,allow_other,reconnect,_netdev,users,IdentityFile=/path/to/.ssh/keyfile 0 0

Recommend option for on-demand mounting if you are using systemd:

vivek@server1.cyberciti.biz:/project/www/ /mnt/server1  fuse.sshfs noauto,x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/vivek/.ssh/id_rsa,allow_other,reconnect 0 0

Save and close the file. Where,

  1. root@192.168.1.142 : Remote server with sshd
  2. fuse : File system type.
  3. idmap=user : Only translate UID of connecting user.
  4. allow_other : Allow access to other users.
  5. reconnect : Reconnect to server.
  6. _netdev : The filesystem resides on a device that requires network access (used to prevent the system from attempting to mount these filesystems until the network has been enabled on the system).
  7. users : Allow every user to mount and unmount the filesystem.
  8. IdentityFile=/path/to/.ssh/keyfile – SSH key file.
22Mar/16

如何利用NFC伪造一张门禁卡

Posted by Nick Xu

0×00 前言

我租住的杭州一个老小区一年前出现了所谓的“出租房杀人事件”,事件过后民警叔叔们给小区的每个单元都装上了门禁,所有住户都需要在物业处登记,物业的工作人员会让你提供身份证或者公交卡用来注册,注册之后就可以刷卡进门了。

但由于某些原因,我并不想去登记注册一张门禁卡,正好手头有一部nexus5,众所周知nexus5是有nfc功能的,我便想能不能用nexus5的nfc功能伪造一张门禁卡呢? 一番尝试之后,就有了下文的方法。 (从来没接触过无线安全,对Proxmark3,acr122u 等设备也是一窍不通,各位大牛见笑了)

0×01分析

由于身份证,公交卡等很多卡都可以用来当门禁卡,那基本上有九成把握这个门禁只是简单读取卡的id,并不会去解密里面的内容,只要简单模拟一个相同id的卡就可以刷开门禁。

0×02“采样”

我们下载一款名为“TagInfo”的android应用,用它来读取一下现在可以刷开门禁的卡信息。(跟同楼的妹子借的)

如下图:

卡的id为:D2:69:76:5B

接着我们找另一台nexus5看一下手机原来的id,扫描出来这台nexus5的id是在不停变化的,如下图:

原来出于安全考虑,android手机的id是一个4个字节长度的随机id,每次连接都会变化,并且都以 “0×80”开头。

android官方并没有提供任何的api可以指定修改nfc的id,但是我们可以用直接修改配置文件的方式来实现,前提当然是手机必须root过了。

0×03Just Do IT

1、到手机的 /etc/ 目录找一个文件名为libnfc-brcm-20791b05.conf,默认情况下,文件中NFA_DM_START_UP_CFG 的配置项是这样的值:

1
{45:CB:01:01:A5:01:01:CA:17:00:00:00:00:06:00:00:00:00:0F:00:00:00:00:E0:67:35:00:14:01:00:00:10:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:00:C8}

2、通过修改这个值就可以改变id。把该文件下载到电脑上,先在最后面增加一个0×33作为标志位,接着接上要指定的id长度,在当前的情况下就是0×04,最后在后面接上要制定的id:“0xD2,0×69,0×76,0x5B”,接着改变最首的数字,加上我们总共增加的字符串长度,这里我们需要加上6,所以最后配置项变成:

1
{4B:CB:01:01:A5:01:01:CA:17:00:00:00:00:06:00:00:00:00:0F:00:00:00:00:E0:67:35:00:14:01:00:00:10:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:00:C8:33:04:D2:69:76:5B}

3、采用adb的方式覆盖系统中原来的文件,然后重启

adb root
adb remount
adb push libnfc-brcm-20791b05.conf /etc/
adb reboot

重启之后我们发现,这台nexus5的id已经被改成了我们想要的。

 

 

拿着修改好的nexus5去试试看?记得必须在唤醒屏幕的情况下nfc才有效。

Tagged as: , Comments Off
22Mar/16

Mac OS X 下部分Android手机无法连接adb问题之解决方案

Posted by Nick Xu

打开终端,在任意当前路经下都可以直接执行adb命令,通过USB线将Android手机和Mac PC连接后,adb devices,没有相应设备的列表。下面是解决办法:
1. 打开终端,输入:system_profiler SPUSBDataType,查看Mac系统所有USB设备信息,找到相应的厂商Vender ID。
查到相应连有Android手机设备的usb hub,找到相应的厂商Vender ID,比如,我的测试机K-Touch T619天语手机就无法连接adb,查到的相应信息片段如下:
  1. -----------------
  2.  Spreadtrum phone:
  3.               Product ID: 0x5d04
  4.               Vendor ID: 0x1782
  5.               ...
  6.        Serial Number: T619
  7.        ...
  8. -----------------

2. 终端进入/Users/user/.android,应该有一个adb_usb.ini文件,如果没有就创建,然后将上面的Vender ID “0x1782”单独一行加入到该文件,然后退出。

  1. # ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
  2. # USE 'android update adb' TO GENERATE.
  3. 1 USB VENDOR ID PER LINE.
  4. 0x1782

3. 重启adb server进程。

终端依次执行下面命令:
  1. adb kill-server
  2. adb start-server

然后通过adb devices命令就可以查看到以相应设备Serial Number为名字的设备。如:

  1. -MacBook-Pro:.android user$ adb devices
  2. List of devices attached
  3. emulator-5554   device
  4. T619    device

PS:

1. 有时 adb devices不能显示连接设备,需要拔掉数据线,多插几次,并且退出终端,然后重新打开,再输入命令就能发现连接的设备,再无法连接请重启电脑,等待系统初始化环境设置。
需要注意的是并不是所有的android机器都能解决,比如有的手机有供应商ID,缺少产品ID,依然无法识别,这种奇葩形的就只能找其它方法了。
2. Windows(XP、7)下面也可以同样的方法解决。但是前提也是已经指定了adb环境变量并且安装了相应Android手机设备的adb usb驱动,判断有没有装通过将手机和Windows连接,设备管理器里面没有发现显示有问号的设备就说明装了,有就说明没有安装。然后在C:\Users\username\.android目录下面也有一个adb_usb.ini文件,像前面那样别起一行添加相应设备的Vender ID,重启adb server进程即可。
3. 如果发现无法启动ADB SERVER, 运行下面这行查看具体原因:
adb nodaemon server
Tagged as: , , Comments Off
17Mar/16

install Python Imaging Library on mac

Posted by Nick Xu

# download
curl -O -L http://effbot.org/media/downloads/Imaging-1.1.7.tar.gz
# extract
tar -xzf Imaging-1.1.7.tar.gz
cd Imaging-1.1.7
# build and install
ln -s /usr/local/include/freetype2 /usr/local/include/freetype
xcode-select --install
python setup.py build
sudo python setup.py install
# or install it for just you without requiring admin permissions:
# python setup.py install --user
Tagged as: , Comments Off
2Mar/16

在 Mac 下用 Homebrew 安装 MySQL

Posted by Nick Xu

在 Mac 下用 Homebrew 安装 MySQL, 网上的教程倒是很多,不过大多数都很默契地雷同。如果稍有点定制要求,就无从下手了。

我先也不免俗,从基本的开始:

一、首先安装 Homebrew

1
2
3
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
$ brew install git
$ brew update

二、安装 MySQL

用下面的命令就可以自动安装了:

1
$ brew install mysql

如果想让 MySQL 开机自动启动,可以如下操作:

1
2
3
4
$ mkdir -p ~/Library/LaunchAgents
$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$ find /usr/local/Cellar/mysql/ -name "homebrew.mxcl.mysql.plist" -exec cp {} ~/Library/LaunchAgents/ \;
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

设置 MySQL 用户以及数据存放地址

1
2
$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

好了,可以启动了

1
$ mysql.server start

另外的参数还有 {start|stop|restart|reload|force-reload|status}

大部分的介绍就在此结束了。

三、更详细的设置

配置文件 my.cnf

作为用惯了 Linux 的人, 一定会去 /etc 下找 my.cnf, 让你失望了,这个文件要自己建立。如果看一下帮助

1
$ mysqld --help --verbose

就会发现系统会按这个顺序去找 my.cnf

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/local/etc/my.cnf
  4. ~/.my.cnf

一般网上大虾都会这么教小白建立 my.cnf, 其实这个默认的文件里面几乎没什么内容。

1
$ sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

所以,还是自己老老实实参考 linux 下的配置文件吧。

my.cnf (my.cnf.txt)download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with 
# ticks/quotes escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing 
# the socket location.
[client]
port        = 3306
#socket     = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions 
# are currently parsed.
[mysqld_safe]
#socket     = /var/run/mysqld/mysqld.sock
#nice       = 0

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
#   If you make changes to these settings and your system uses 
#   apparmor, you may also need to also adjust 
#   /etc/apparmor.d/usr.sbin.mysqld.
#

#user       = mysql
#socket     = /var/run/mysqld/mysqld.sock
port        = 3306
#basedir    = /usr
datadir    = /usr/local/var/mysql
#tmpdir     = /tmp
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 127.0.0.1
#
# * Fine Tuning
#
key_buffer          = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size   = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
#max_connections       = 100
#table_cache           = 64
#thread_concurrency    = 10
#
# * Query Cache Configuration
#
query_cache_limit   = 1M
query_cache_size    = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1

log_error                = /usr/local/var/mysql/MacBook15.local.err

# Here you can see queries with especially long duration
#log_slow_queries   = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or 
# for replication.
# note: if you are setting up a replication slave, see 
#       README.Debian about other settings you may need 
#       to change.
#server-id          = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size     = 100M
#binlog_do_db       = include_database_name
#binlog_ignore_db   = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

# Query Caching
query-cache-type = 1

# Default to InnoDB
default-storage-engine=innodb

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]
key_buffer      = 16M

错误日志

错误日志默认会存在数据目录下,也就是上面所定义的 /usr/local/var/mysql/,如果 Mac 电脑名字是 MacBook,那日志的全路径就是 /usr/local/var/mysql/MacBook.local.err

让别的电脑访问数据库

取消下面两个文件中关于绑定 127.0.0.1 的语句
/etc/my.cnf

1
bind-address = 127.0.0.1

~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

1
<string>--bind-address=127.0.0.1</string>

就我个人而言,不需要 MySQL 自启动,所以只要在 /etc/my.cnf 改一下就好了。

Tagged as: Comments Off
2Mar/16

用gzip/gunzip备份,压缩数据库

Posted by Nick Xu

缘起:公司服务器上数据库越来越大,以前备份数据时将数据库整个dump出来,然后用tar czvf压缩备份,还原时用tar zxvf解压缩,每次都作这种事情的确很烦。

浏览PostgreSQL文档时,看到介绍数据库备份部分的内容时,找到一个不错的办法可以直接将数据库dump出来并自动压缩,还原数据库也可以从压缩文件直接还原到数据库,原来数据库dump出来大概50多M的plain text文件压缩后只有不到7MB,非常利于网络传输,且原理并不复杂,只用到了Linux的gzip/gunzip和管道命令而已。

MySQL:

Ruby代码  收藏代码
  1. # Backup
  2. mysqldump -u username -p dbname | gzip > outfile.gz
  3. # Restore
  4. cat outfile.gz | gunzip | mysql -u username -p dbname

PosgreSQL:

Ruby代码  收藏代码
  1. # Backup
  2. pg_dump dbname | gzip > outfile.gz
  3. # Restore
  4. cat outfile.gz | gunzip | psql dbname

还可以远程备份/还原,拿PosgreSQL举例:

Ruby代码  收藏代码
  1. pg_dump -h host1 dbname | psql -h host2 dbname

这种用法虽然基础,但确让我又一次体会到了Linux/Unix下面的工具,作一件小事,并把他做好这个原则。自己写代码模块的时候,习惯把关联功能集成在一起,比如一个encrypt模块,我会把加密/解密两个方法成对写成一个scope中,且其他人大抵也多是如此操作,合乎常理呀。但是Linux下面就把压缩,解压缩用两个程序来处理(gzip/gunzip),然后用管道把他们串联起来,然后就可以去执行一些匪夷所思的任务。赞叹

Tagged as: , Comments Off
1Mar/16

killing of MySQL processlist(清理mysql所有队列)

Posted by Nick Xu

mysql> select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 3 into outfile '/tmp/a.txt';
mysql> source /tmp/a.txt;
26Feb/16

Linux下使用 rsync 同步文件夹

Posted by Nick Xu

Rsync 是一个小巧的算法的强大实现。它最基本的功能是高效地镜像一个文件系统的能力。使用 rsync,可以灵活地选用一组网络协议,诸如 nfs、smb 或 ssh,方便地让一个文件系统与另一个文件系统保持同步更新。Rsync 的第二个功能,也就是备份系统使用的功能,它可以把已经发生改变或是被删除的文件的老的版本归档。
软件简介
Rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync本来是用以取代rcp的一个工具,它当前由rsync.samba.org维护。Rsync使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。
Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方Rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在windows平台下也有相应的版本,比较知名的有cwRsync和Sync2NAS。
Rsync的基本特点如下:
1.可以镜像保存整个目录树和文件系统;
2.可以很容易做到保持原来文件的权限、时间、软硬链接等;
3.无须特殊权限即可安装;
4.优化的流程,文件传输效率高;
5.可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
6.支持匿名传输。
命令语法
rsync的命令格式可以为以下六种:
rsync [OPTION]… SRC DEST
rsync [OPTION]… SRC [USER@]HOST:DEST
rsync [OPTION]… [USER@]HOST:SRC DEST
rsync [OPTION]… [USER@]HOST::SRC DEST
rsync [OPTION]… SRC [USER@]HOST::DEST
rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]
对应于以上六种命令格式,rsync有六种不同的工作模式:
1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。
3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。
4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。
5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。
6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
1、同步本机文件测试
rsync -help
你可以看到很多参数,选择自己觉得需要的参数即可。
先测试一下本机同步:
rsync -vzrtopgu -progress /Data/scripts/ /tmp/back_srcipt/
会看到文件在传输,再运行一次,就知道没有运行复制,因为文件没有修改过
增加文件测试:
touch /Data/scripts/test.txt
再运行上面的脚本就可以看到把这个新文件传输过去了,没有复制别的文件。
2、服务器间同步文件
在服务器间rsync传输文件,需要有一个是开着rsync的服务,而这一服务需要两个配置文件,说明当前运行的用户名和用户组,这个用户名和用户组讲在改变文件权限和相关内容的时候有用,否则有时候会出现提示权限问题。配置文件也说明了模块,模块化管理服务的安全性,每个模块的名称都是自己定义的,可以添加用户名密码验证,也可以验证IP,设置目录是否可写等。【重点地方为红色字体】
vim /etc/rsyncd/rsyncd.conf
############## 内容开始 #############
port = 73
address = 0.0.0.0
uid=nobody
gid=nobody
use chroot=yes
# yes为只读,如果是no,则可以从client发送文件到此服务器
read only=no
 
[bn]
path=/home/
list=false
write only=yes
auth users=backup
secrets file=/etc/rsyncd/rsyncd.secrets
hosts allow=192.168.30.0/255.255.255.0
############# 内容结束 #############
vim /etc/rsyncd/rsyncd.secrets
##############内容开始##############
backup:reoGWh^#fL
一行一个用户,用户名:密码
##############内容结束###############
服务启动方式:
/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
修改rsyncd.pass权限
chmod 600 /etc/rsyncd/rsyncd.secrets
此步省略会导致rsync无法启动
客户端可以直接执行
export RSYNC_PASSWORD="reoGWh^#fL";/usr/bin/rsync -avl --port=73 $FILE_DIR/InstanceServer/* backup@192.168.30.95::bn/InstanceServer_PH/
客户端也需要有密码文件,当然路径可以不一样
rsync -rvlHpogDtS -progress -password-file=/etc/rsyncd.pass aslibra@192.168.1.3::web_aslibra /tmp/aslibra.com/
注意:客户端密码文件只保存一个密码!不要带上用户名,权限设置为600
第二个模块是没有验证的情况,都可读
rsync -rvlHpogDtS -progress aslibra@192.168.1.3::web_aslibra_public /tmp/aslibra.com/
第三个是验证ip,而且可写
发送文件很简单,把后面两个参数反过来就可以,拿上一个例子
rsync -rvlHpogDtS -progress /tmp/aslibra.com/ aslibra@192.168.1.3::web_aslibra_public
这样会提示出错,因为web_aslibra_public是只读的
rsync -rvlHpogDtS -progress /tmp/aslibra.com/ aslibra@192.168.1.3::web_aslibra_write
这样就可以了,但要看从哪个IP来的了,否则也失败
下面是摘录的一些详细的参数说明:
rsyncd.conf参数
uid
该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是”nobody”。
gid
该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为”nobody”。
exlude
用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用-exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用”-”和”+”来指定是exclude还是include。
但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exlude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。
exlude from
指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exlude列表定义。
include
用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用-include来指定模式,结合include和exlude可以定义复杂的exlude/include规则。一个模块只能指定一个include选项,但是可以在模式前面使用”-”和”+”来指定是exclude还是include。
include from
指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。
auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果”auth users”被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在”secrets file”选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。
secrets file
该选项指定一个包含定义用户名:密码对的文件。只有在”auth users”被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个。(例如:/etc/rsyncd.secrets)
strict modes
该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。
hosts allow
该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:
o xxx.xxx.xxx.xxx,客户主机只有完全匹配该IP才允许访问。例如:192.167.0.1
o a.b.c.d/n,属于该网络的客户都允许连接该模块。例如:192.168.0.0/24
o a.b.c.d/e.f.g.h,属于该网络的客户都允许连接该模块。例如:192.168.0.0/255.255.255.0
o 一个主机名,客户主机只有拥有该主机名才允许访问,例如:backup.linuxaid.com.cn。
o *.linuxaid.com.cn,所有属于该域的主机都允许。
默认是允许所有主机连接。
hosts deny
指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义
ignore errors
指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过-delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。
ignore nonreadable
指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的
客户端同步命令
v, -verbose 详细模式输出
-q, -quiet 精简输出模式
-c, -checksum 打开校验开关,强制对文件传输进行校验
-a, -archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, -recursive 对子目录以递归模式处理
-R, -relative 使用相对路径信息
rsync foo/bar/foo.c remote:/tmp/
则在/tmp目录下创建foo.c文件,而如果使用-R参数:
rsync -R foo/bar/foo.c remote:/tmp/
则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。
-b, -backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用-suffix选项来指定不同的备份文件前缀。
-backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, -update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, -links 保留软链结
-L, -copy-links 想对待常规文件一样处理软链结
-copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
-safe-links 忽略指向SRC路径目录树以外的链结
-H, -hard-links 保留硬链结
-p, -perms 保持文件权限
-o, -owner 保持文件属主信息
-g, -group 保持文件属组信息
-D, -devices 保持设备文件信息
-t, -times 保持文件时间信息
-S, -sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, -dry-run现实哪些文件将被传输
-W, -whole-file 拷贝文件,不进行增量检测
-x, -one-file-system 不要跨越文件系统边界
-B, -block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, -rsh=COMMAND 指定替代rsh的shell程序
-rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, -cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
-existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
-delete 删除那些DST中SRC没有的文件
-delete-excluded 同样删除接收端那些被该选项指定排除的文件
-delete-after 传输结束以后再删除
-ignore-errors 及时出现IO错误也进行删除
-max-delete=NUM 最多删除NUM个文件
-partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
-force 强制删除目录,即使不为空
-numeric-ids 不将数字的用户和组ID匹配为用户名和组名
-timeout=TIME IP超时时间,单位为秒
-I, -ignore-times 不跳过那些有同样的时间和长度的文件
-size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
-modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T -temp-dir=DIR 在DIR中创建临时文件
-compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 -partial
-progress 显示备份过程
-z, -compress 对备份的文件在传输时进行压缩处理
-exclude=PATTERN 指定排除不需要传输的文件模式
-include=PATTERN 指定不排除而需要传输的文件模式
-exclude-from=FILE 排除FILE中指定模式的文件
-include-from=FILE 不排除FILE指定模式匹配的文件
-version 打印版本信息
-address 绑定到特定的地址
-config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
-port=PORT 指定其他的rsync服务端口
-blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
-progress 在传输时现实传输过程
-log-format=formAT 指定日志文件格式
-password-file=FILE 从FILE中得到密码
-bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, -help 显示帮助信息
Tagged as: Comments Off
site
site
test