mysql - meetbill/op_practice_book GitHub Wiki

1 日常使用

1.1 读取 MySQL 数据库中某个表的第一行和最后一行数据

读取第一行

select * frommytable order by IDasc limit 0,1
读取最后一行
select * from mytable order by ID desclimit 0,1
读取前 100 行
select * from mytable order byIDasc limit 0,100
mytable 即是要读取的表名,ID 是要排序的对象。

1.2 mysqldump 参数之 A B

  • -A 同参数 --all-databases,备份所有库,并在备份文件中生成创建库的语句及 use 语句。这样方便恢复时不用创建指定数据库

  • -B 此参数用于指定多个数据库,同 -A 参数,生成创建库的语句及 use 语句。

不指定上述参数时,默认第一个选项为数据库名,如果有第二个及更多选项则为表名

1.3 在 MySQL 数据库进行子查询

  • 在一个查询中的查询结果作为外层查询的条件,用 IN/NOT IN 关键字

  • 例:SELECT fsid,limited,used from quota where fsid IN (SELECT fsid from test.user WHERE status=0);

  • 内层查询语句不返回查询的记录,而是返回一个Boolean值,用 EXISTS / NOT EXISTS 关键字

2 配置相关

2.1 innodb_force_recovery 在 MySQL 中的用法

MySQL 数据库,当 innodb 表空间损坏时候,尝试启动数据库不成功,可以使用 innodb_force_recovery 参数进行强制启动

在主配置文件 my.cnf 中添加 innodb_force_recovery=6

innodb_force_recovery 参数解释:
innodb_force_recovery 影响整个 InnoDB 存储引擎的恢复状况,默认值为 0,表示当需要恢复时执行所有的恢复操作。
当不能进行有效的恢复操作时,mysql 有可能无法启动,并记录下错误日志。
innodb_force_recovery 可以设置为 1-6, 大的数字包含前面所有数字的影响。
当设置参数值大于 0 后,可以对表进行 select,create,drop 操作,但 insert,update 或者 delete 这类操作是不允许的。
1(SRV_FORCE_IGNORE_CORRUPT): 忽略检查到的 corrupt 页
2(SRV_FORCE_NO_BACKGROUND): 阻止主线程的运行,如主线程需要执行 full purge 操作,会导致 crash
3(SRV_FORCE_NO_TRX_UNDO): 不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE): 不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB 存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO): 不执行前滚的操作。

修复表空间受损的表: 数据起来后,innodb 类型的表不能写操作,但可以读,此时对表做 check,查找到异常的表,读取出来,导入到 myisam 表里面,drop 原表 然后在 my.cnf 中去掉 innodb_force_recovery 的设置,重启 mysql 把 myisam 表转成 innodb 表;

3 部署相关

3.1 一台机器上启动多个 MySQL 实例

环境:MySQL 5.1 上操作

  • 1、关闭原有的默认端口 3306 的 mysql:service mysqd stop

  • 2、创建数据文件目录

    #创建一个新的空数据库
    [root@meetbill  ~]# mkdir /var/lib/mysql_3307
    [root@meetbill  ~]# mysql_install_db --datadir=/var/lib/mysql_3307 --user=mysql
  • 3、给数据文件赋予 mysql 用户与用户组

    [root@meetbill  ~]# chown -R mysql.mysql /var/lib/mysql_3307
  • 4、创建 multi 的配置 cnf 文件,用于启动这个 mysql 实例,/etc/my_multi.cnf

    [mysqld_multi]
    mysqld     = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    # user       = root    #用于登陆和关闭此服务
    # password   = 123456   #同上
    
    [mysqld3307]
    socket     = /tmp/mysql_3307.sock
    port       = 3307
    pid-file   = /var/lib/mysql_3307/3307.pid
    datadir    = /var/lib/mysql_3307/
    log        = /var/lib/mysql_3307/3307.log
    character-set-server    = utf8
    user       = mysql
  • 5、启动你的多实例

    [root@meetbill  ~]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf start 3307
  • 6、检查是否启动成功

  • 7、设置新的密码

    [root@meetbill  ~]#  mysqladmin -uroot -S /tmp/mysql_3307.sock password 123456
  • 8、登陆查看存储目录是否正确

    [root@meetbill  ~]# mysql -uroot -S /tmp/mysql_3307.sock -p
    mysql> show variables like '%datadir%';
  • 9、授权

    [root@meetbill  ~]# mysql -uroot -S /tmp/mysql_3307.sock -p
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'127.0.0.1' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
    mysql> flush privileges;
  • 10、登陆测试

    [root@meetbill ~]# mysql -umyuser -pmypassword -h127.0.0.1 -P3307
  • 11、关闭 MySQL

    [root@meetbill ~]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf --user=root --password=123456 stop 3307
⚠️ **GitHub.com Fallback** ⚠️