分类: 菜鸟Linux笔记

菜鸟学习LINUX笔记

  • web server setup with Debian 7 (Wheezy)

    Setup bash and update the system

    cp /etc/skel/.bashrc /root/.bashrc
    apt-get update
    apt-get dist-upgrade

    Configure hostname correctly

    Make sure to have the following two lines (with the same format) at the top of your /etc/hosts file

    127.0.0.1 localhost.localdomain localhost
    xxx.xxx.xxx.xxx web1.myserver.com web1

    Note: xxx.xxx.xxx.xxx is the public IP address assigned to your server.
    Install all needed packages

    apt-get install php5 mysql-server mysql-client apache2 iptables phpmyadmin varnish shorewall vsftpd php5-cli php5-curl php5-dev php5-gd php5-idn php5-imagick php5-imap php5-memcache php5-ming php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xcache php5-xmlrpc php-apc php-pear php-xml-rpc postfix apg ca-certificates heirloom-mailx

    MySQL/PhpMyAdmin:

    mysql root password: xxx
    repeat mysql root password: xxx
    web server to reconfigure automatically: apache2
    configure database for phpmyadmin with dbconfig-common? Yes
    Password of the database’s administrative user: xxx
    Password for phpmyadmin: xxx
    Password confirmation: xxx

    Postfix:

    Select Internet Site
    System mail name: (insert here the FQDN, for example web1.myserver.com)

    Setup FTP

    Stop VSFTP server:

    /etc/init.d/vsftpd stop

    Create backup configuration:

    mv /etc/vsftpd.conf /etc/vsftpd.conf.backup

    Add new configuration:

    listen=YES
    listen_port=21
    anonymous_enable=NO
    local_enable=YES
    guest_enable=YES
    guest_username=nobody
    user_sub_token=$USER
    local_root=/var/www/vhosts/$USER
    virtual_use_local_privs=YES
    user_config_dir=/etc/vsftpd/users
    pam_service_name=vsftpd_local_and_virtual
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    ftpd_banner=Welcome to my ftp server
    write_enable=YES
    download_enable=YES
    dirlist_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    xferlog_file=/var/log/xferlog
    connect_from_port_20=YES
    connect_timeout=60
    data_connection_timeout=300
    idle_session_timeout=300
    local_max_rate=0
    max_clients=0
    max_per_ip=3

    Create an empty chroot_list file:

    touch /etc/vsftpd/chroot_list

    Start VSFTP server:

    /etc/init.d/vsftpd start

    Setup Apache

    Stop Apache web server:

    /etc/init.d/apache2 stop

    Backup Apache configuration:

    cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.backup

    Edit the following lines in /etc/apache2/apache2.conf

    From Timeout 300 to Timeout 45
    From KeepAliveTimeout 5 to KeepAliveTimeout 15
    Change the mpm_prefork_module section like the following:


    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    ServerLimit 400
    MaxClients 400
    MaxRequestsPerChild 10000

    Edit /etc/apache2/ports.conf and change the port 80 with 8080 since we are going to use Varnish:

    NameVirtualHost *:8080
    Listen 8080

    Change the port (from 80 to 8080) also in the default virtual host /etc/apache2/sites-enabled/000-default Now restart Apache:

    /etc/init.d/apache2 restart

    Setup Varnish

    Stop Varnish daemon:

    /etc/init.d/varnish stop

    Open /etc/varnish/default.vcl and make sure the backend section is like this:

    backend default {
    .host = “127.0.0.1”;
    .port = “8080”;
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    }

    Now edit /etc/default/varnish and set the DAEMON_OPTS variable like this:

    DAEMON_OPTS=”-a :80 \
    -T localhost:6082 \
    -f /etc/varnish/default.vcl \
    -p thread_pools=4 \
    -p thread_pool_max=1500 \
    -p listen_depth=2048 \
    -p lru_interval=1800 \
    -h classic,169313 \
    -p max_restarts=6 \
    -p connect_timeout=600 \
    -p send_timeout=2000 \
    -s malloc,2G”

    Restart Varnish:

    /etc/init.d/varnish restart

    Setup MySQL

    MySQL is already configured. You only need to log slow queries (that is often usefult during slow load page investigation). Todo it, open /etc/mysql/my.cnf and decomment the following two lines:

    log_slow_queries = /var/log/mysql/mysql-slow.log
    long_query_time = 2

    Configure Shorewall firewall rules

    Copy the default configuration for one interface:

    cp /usr/share/doc/shorewall/examples/one-interface/interfaces /etc/shorewall/interfaces
    cp /usr/share/doc/shorewall/examples/one-interface/policy /etc/shorewall/policy
    cp /usr/share/doc/shorewall/examples/one-interface/rules /etc/shorewall/rules
    cp /usr/share/doc/shorewall/examples/one-interface/zones /etc/shorewall/zones

    Now open /etc/shorewall/policy file and change the line:

    net all DROP info

    removing info directive given it fills the system logs:

    net all DROP

    Now open /etc/shorewall/rules and add the following rules at the bottom of the file:

    HTTP/ACCEPT net $FW
    SSH/ACCEPT net $FW
    FTP/ACCEPT net $FW

    # real apache since varnish listens on port 80
    #ACCEPT net $FW tcp 8080

    NOTE: in case you want to allow ICMP (Ping) traffic from a specific remote hosts you need to add a rule similar to the following where xxx.xxx.xxx.xxx is the remote IP address, before the Ping(DROP) rule:

    Ping(ACCEPT) net:xxx.xxx.xxx.xxx $FW

    Now edit /etc/default/shorewall and change startup=0 to startup=1 You are now ready to start the firewall:

    /etc/init.d/shorewall start

    Setup Postfix

    Stop postfix server:

    /etc/init.d/postfix stop

    Edit /etc/mailname and set your server domain name, for example:

    server1.mycompany.com

    Then, in order to monitor mail traffic coming from PHP you need to edit /etc/php5/apache2/php.ini. Go to [mail function] section and set the following two options:

    sendmail_path = /usr/local/bin/sendmail-wrapper
    auto_prepend_file = /usr/local/bin/env.php

    Now create the two files above:

    sendmail-wrapper:

    #!/bin/sh
    logger -p mail.info sendmail-wrapper.sh: site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, pwd=${PWD}, uid=${UID}, user=$(whoami)
    /usr/sbin/sendmail -t -i $*

    env.php:

    Now make they both have executable flag:

    chmod +x /usr/local/bin/sendmail-wrapper
    chmod +x /usr/local/bin/env.php

    Add also /usr/local/bin/ to the open_basedir php list in /etc/apache2/conf.d/phpmyadmin.conf

    php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/local/bin/

    Restart Postfix:

    /etc/init.d/postfix start

    Prepare environment

    Create all needed directories and files

    mkdir /root/cron_scripts
    mkdir -p /var/www/vhosts
    mkdir -p /etc/vsftpd/users
    touch /etc/vsftpd/passwd

    Now download all tools to manage the server locally:

    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/ADD_ALIAS.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/ADD_DOMAIN.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/ADD_ALIAS.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/ADD_FTP_VIRTUAL_USER.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/ALIAS_LIST.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/DEL_ALIAS.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/DEL_DOMAIN.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/DEL_FTP_VIRTUAL_USER.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/DOMAIN_LIST.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/MYSQL_CREATE.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/UPDATE_ALL_FTP_PASSWORD.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/UPDATE_FTP_PASSWORD.sh
    chmod 770 *.sh

    Download also the tools that will be used with cron:

    cd /root/cron_scripts
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/cron_scripts/backup_mysql.sh
    wget https://raw.githubusercontent.com/matteomattei/servermaintenance/master/LAMP/cron_scripts/mysql_optimize.sh
    chmod 770 *.sh

    Edit /root/ADD_DOMAIN.sh and change ADMIN_EMAIL variable with your email address.
    Edit /root/MYSQL_CREATE.sh and change the variable MYSQL_ROOT_PASSWORD with your MySQL root password.
    Edit /root/cron_scripts/backup_mysql.sh and change the variable DB_PASSWORD with your MySQL root password and MAIL_NOTIFICATION with your email address.
    Edit /root/cron_scripts/mysql_optimize.sh and change the variable MYSQL_ROOT_PASSWORD with your MySQL root password.

    Configure CRON

    Edit /etc/crontab and add the following lines at the bottom:

    # mysql optimize tables
    3 4 * * 7 root /root/mysql_optimize.sh

    # mysql backup
    32 4 * * * root /root/backup_mysql.sh

  • Git远程操作详解

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能。

    Git有很多优势,其中之一就是远程操作非常简便。本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Git远程操作。

    git clone
    git remote
    git fetch
    git pull
    git push
    本文针对初级用户,从最简单的讲起,但是需要读者对Git的基本用法有所了解。同时,本文覆盖了上面5个命令的几乎所有的常用用法,所以对于熟练用户也有参考价值。

    70369b664f92cba09bf720bf6f22d160

    一、git clone

    远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone命令。

    git clone <版本库的网址>
    比如,克隆jQuery的版本库。
    git clone https://github.com/jquery/jquery.git
    该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
    git clone <版本库的网址> <本地目录名>
    git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。

    git clone http[s]://example.com/path/to/repo.git/
    git clone ssh://example.com/path/to/repo.git/
    git clone git://example.com/path/to/repo.git/
    git clone /opt/git/project.git
    git clone file:///opt/git/project.git
    git clone ftp[s]://example.com/path/to/repo.git/
    git clone rsync://example.com/path/to/repo.git/
    SSH协议还有另一种写法。

    git clone [user@]example.com:path/to/repo.git/
    通常来说,Git协议下载速度最快,SSH协议用于需要用户认证的场合。各种协议优劣的详细讨论请参考官方文档。

    二、git remote

    为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。

    不带选项的时候,git remote命令列出所有远程主机。

    git remote
    origin
    使用-v选项,可以参看远程主机的网址。

    git remote -v
    origin git@github.com:jquery/jquery.git (fetch)
    origin git@github.com:jquery/jquery.git (push)
    上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。

    克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。

    git clone -o jQuery https://github.com/jquery/jquery.git
    git remote
    jQuery
    上面命令表示,克隆的时候,指定远程主机叫做jQuery。

    git remote show命令加上主机名,可以查看该主机的详细信息。

    git remote show <主机名>
    git remote add命令用于添加远程主机。

    git remote add <主机名> <网址>
    git remote rm命令用于删除远程主机。

    git remote rm <主机名>
    git remote rename命令用于远程主机的改名。

    git remote rename <原主机名> <新主机名>
    三、git fetch

    一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。

    git fetch <远程主机名>
    上面命令将某个远程主机的更新,全部取回本地。

    默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。

    git fetch <远程主机名> <分支名>
    比如,取回origin主机的master分支。

    git fetch origin master
    所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。

    git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

    git branch -r
    origin/master

    git branch -a
    * master
    remotes/origin/master
    上面命令表示,本地主机的当前分支是master,远程分支是origin/master。

    取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

    git checkout -b newBrach origin/master
    上面命令表示,在origin/master的基础上,创建一个新分支。

    此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

    git merge origin/master
    # 或者
    git rebase origin/master
    上面命令表示在当前分支上,合并origin/master。

    四、git pull

    git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。

    git pull <远程主机名> <远程分支名>:<本地分支名>
    比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。

    1
    $ git pull origin next:master
    如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

    git pull origin next
    上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

    git fetch origin
    git merge origin/next
    在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。

    Git也允许手动建立追踪关系。

    git branch –set-upstream master origin/next
    上面命令指定master分支追踪origin/next分支。

    如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
    git pull origin
    上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。

    如果当前分支只有一个追踪分支,连远程主机名都可以省略。
    git pull
    上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

    如果合并需要采用rebase模式,可以使用–rebase选项。
    git pull –rebase <远程主机名> <远程分支名>:<本地分支名>
    五、git push

    git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
    git push <远程主机名> <本地分支名>:<远程分支名>
    注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

    如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
    git push origin master
    上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

    如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
    git push origin :master
    # 等同于
    git push origin –delete master
    上面命令表示删除origin主机的master分支。

    如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
    git push origin
    上面命令表示,将当前分支推送到origin主机的对应分支。

    如果当前分支只有一个追踪分支,那么主机名都可以省略。
    git push
    如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
    git push -u origin master
    上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

    不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
    git config –global push.default matching
    # 或者
    git config –global push.default simple
    还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。

    git push –all origin
    上面命令表示,将所有本地分支都推送到origin主机。

    如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项。

    git push –force origin
    上面命令使用–force选项,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–force选项。

    最后,git push不会推送标签(tag),除非使用–tags选项。

    git push origin –tags

  • make: g++: Command not found

    make: g++: Command not found
    g++ make: g++: Command not found

    sudo apt-get install build-essential

  • lftp Fatal error: Certificate verification: Not trusted – Junk Food for the Brain

    If you use lftp alot, occasionally you will encounter sites that just use ssl to secure transmission, but don’t actually purchase a proper SSL cert for the domain.

    You would get the following error message:

    Fatal error: Certificate verification: Not trusted

    If you are sure its really the intended site (No Man in the Middle Attacks!), you can temporaryly disable certificate verification by the following command at the lftp prompt:

    lftp > set ssl:verify-certificate no

    To permanently set this for lftp, you could add this to your /etc/lftp.conf or in your home directory ~/.lfptrc file.

  • dpkg: error processing mysql-server-5.5 (–configure)

    rm -rf /var/lib/mysql /etc/mysql ~/.mysql
    apt-get –yes autoremove –purge mysql-server-5.5
    apt-get –yes autoremove –purge mysql-client-5.5
    apt-get –yes autoremove –purge mysql-common

    deluser mysql
    apt-get autoclean
    apt-get update && apt-get upgrade
    apt-get install mysql-server-5.5 mysql-client-5.5

    NOTE: when you get ‘dpkg: error…’ please run step below:
    $ dpkg –configure -a

    Setting up mysql-server-5.5 (5.5.41-0ubuntu0.14.04.1) ...
    /var/lib/dpkg/info/mysql-server-5.5.postinst: line 146: logger: command not found
    ATTENTION: An error has occured. More info is in the syslog!
    /var/lib/dpkg/info/mysql-server-5.5.postinst: line 236: logger: command not found

    dpkg: error processing package mysql-server-5.5 (–configure):
    subprocess installed post-installation script returned error exit status 127
    after installing bsdutils,

    apt-get install bsdutils
    mysql installation passed normally

  • Android手机装上Linux系统

    昨天发现手机安装linux脚本已经自动化了,直接下载一个应用即可全自动安装,就在闲置的手机上安装了下;像:

    Linux Installer https://play.google.com/store/apps/details?id=com.zpwebsites.linuxonandroid

    手机都需要root。尝试了下Linux Installer,教程比较详细

    http://android.galoula.com/en/LinuxInstall/

    需要注意一个地方是,最后install linuxchroot script时,注意设置linuxinstaller的系统可写权限,不然安装无响应或者提示写权限出错。

    我装的是Debian Linux的arm发行版,apt-get用起来很方便。

  • chattr: command not found

    Solution: Install e2fsprogs:

    apt-get install e2fsprogs

  • debian7 wheezy install mysql-server-5.5 error

    dpkg: error processing mysql-server (–configure):

    dependency problems – leaving unconfigured

    Processing triggers for libapache2-mod-php5 …

    [ ok ] Reloading web server config: apache2.

    Errors were encountered while processing:

    mysql-server-5.5

    mysql-server

    E: Sub-process /usr/bin/dpkg returned an error code (1)

     

    # wget http://dev.mysql.com/get/mysql-apt-config_0.2.1-1debian7_all.deb

    # dpkg -i mysql-apt-config_0.2.1-1debian7_all.deb //安装时选1,使用5.6版本。

    # apt-get update

    # apt-get install mysql-server

  • linux删除/var/cache,不能升级

    mkdir -pv /var/cache/apt/archives/partial

  • mysql配置文件my.cnf详解

    basedir = path 使用给定目录作为根目录(安装目录)。

    character-sets-dir = path 给出存放着字符集的目录。

    datadir = path 从给定目录读取数据库文件。

    pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。

    socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下,如果MySQL客户与服务器是通过命名管道进行通信 的,–sock选项给出的将是该命名管道的名字(默认设置是MySQL)。

    lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。

     

     

    mysqld程序:语言设置

     

    character-sets-server = name 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容,这个字符集也可以用–default-character-set选项给出; 但这个选项已经显得有点过时了。

    collation-server = name 新数据库或数据表的默认排序方式。

    lanuage = name 用指定的语言显示出错信息。

     

     

    mysqld程序:通信、网络、信息安全

     

    enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL,但可以用–socket选项来改变。

    local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。

    myisam-recover [=opt1, opt2, …] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。

    old-passwords 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。

    port = n 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。

    safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。

    shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows)。

    shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MySQL)。

    skip-grant-tables 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。

    skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系。

    skip-name-resovle 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。

    skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接,不允许ICP/IP连接; 这提高了安全性,但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。

    user = name mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用–user=mysql选项来启动mysqld程序。

     

     

    mysqld程序:内存管理、优化、查询缓存区

     

    bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。

    key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M)。

    join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。

    max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。

    max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。

    query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。

    query_cache_size = n 查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。

    query_cache_type = 0/1/2 查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响应SELECT SQL_CACHE命令。

    read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。

    read_rnd_buffer_size = n 类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。

    sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序。

    table_cache = n 同时打开的数据表的数量(默认设置是64)。

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

     

     

    mysqld程序:日志

     

    log [= file] 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。

    log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名)。

    long_query_time = n 慢查询的执行用时上限(默认设置是10s)。

    long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同–log-slow-queries选项)。

    log-bin [= filename] 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志,binary update log)。这种日志的文件名是filename.n或默认的hostname.n,其中n是一个6位数字的整数(日志文件按顺序编号)。

    log-bin-index = filename 二进制日志功能的索引文件名。在默认情况下,这个索引文件与二进制日志文件的名字相同,但后缀名是.index而不是.nnnnnn。

    max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前,MySQL服务器会自动提供一个新的二进制日志文件接续上。

    binlog-do-db = dbname 只把给定数 据库里的变化情况记入二进制日志文件,其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况,就必须在配置文件使用多个本选项来设置,每个数据库一行。

    binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件。

    sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0,意思是由操作系统来负责二进制日志文件的同步工作。

    log-update [= file] 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数,MySQL会使用hostname.err作为种日志文件的名字。

     

     

    mysqld程序:镜像(主控镜像服务器)

     

    server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。

    log-bin = name 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n,其中的n是一个6位数字的整数(日志文件顺序编号)。

    binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。

     

     

    mysqld程序:镜像(从属镜像服务器)

     

    server-id = n 给服务器分配一个唯一的ID编号

    log-slave-updates 启用从属服务器上的日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)。

    master-host = hostname 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件),它将忽略此选项。

    master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件,它将忽略此选项。

    master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件,它将忽略此选项。

    master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。

    master-connect-retry = n 如果与主控服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件,它将忽略此选项。

    master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置。

    read-only = 0/1 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。

    read-log-purge = 0/1 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。

    replicate-do-table = dbname.tablename 与–replicate-do-table选项的含义和用法相同,但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%–对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理)。

     

     

    replicate-do-db = name 只对这个数据库进行镜像处理。

    replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理。

    replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理。

    replicate-ignore-db = dbname 不对这个数据库进行镜像处理。

    replicate-rewrite-db = db1name > db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。

    report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关–主控服务器可以用这条命令生成一份从属服务器的名单。

    slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信–如果它们都支持这么做的话。

    slave-skip-errors = n1, n2, …或all 即使发生出错代码为n1、n2等的错误,镜像处理工作也继续进行(即不管发生什么错误,镜像处理工作也继续进行)。如果配置得当,从属服务器不应 该在执行 SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项,从属服务器上的镜像工作就可能因为发生错误而中断,中断后需要有人工参与才能继续进行。

     

     

    mysqld–InnoDB:基本设置、表空间文件

     

    skip-innodb 不加载InnoDB数据表驱动程序–如果用不着InnoDB数据表,可以用这个选项节省一些内存。

    innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。

    innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话,这个数字很可能需要加大。

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

    innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB。除文件名外,还可以用硬盘分区的设置名来定义表 空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。

    innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件,那些文件的增大速度相对是比较小的。

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

    innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB,默认设置是1,意思是不把缓存在INSERT缓存区的数据写入数据表,那些数据将在MySQL服务器下次启动 时再写入 (这么做没有什么风险,因为INSERT缓存区是表空间的一个组成部分,数据不会丢失)。把这个选项设置为0反面危险,因为在计算机关闭时,InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作,操作系统也许会在它完成数据同步工作之前强行结束InnoDB,而这会导致数据不完整。

    mysqld程序:InnoDB–日志

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

    innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单 位进行设置。

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

    innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync,用fsync()函数进行同步; O_DSYNC,用O_SYNC()函数进行同步。

    innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能,把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与 MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。

    mysqld程序–InnoDB:缓存区的设置和优化

    innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响,如果计算机上只运行有 MySQL/InnoDB数据库服务器,就应该把全部内存的80%用于这个用途。

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

    innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。

    innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。

    innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。

     

    mysqld程序:其它选项

    bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址,这个选项将非常重要。

    default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。

    default-timezone = name 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。

    ft_min_word_len = n 全文索引的最小单词长度工。这个选项的默认设置是4,意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。

    Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。

    Sql-mode = model1, mode2, … MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、 oracle、no_zero_date、pipes_as_concat。