| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

MySQL

提供: MyMemoWiki
2020年10月11日 (日) 11:18時点におけるPiroto (トーク | 投稿記録)による版 (→‎限定して付与)
ナビゲーションに移動 検索に移動

目次

MySQL

Database | CentOS |

インストール

Windows

Ubuntu(apt-getでインストール)

  1. $ sudo apt-get install mysql-server
  • 途中でパスワードの設定を求められる

0816 mysql password.png

CentOS(yumからインストール)

手順

  1. $ sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm
  2. yum update
  3. $ sudo yum install mysql-community-server

ダウンロード

MySQL Community Server


アカウントの登録

  • mysql グループと mysqlユーザーの作成
  1. # groupadd mysql
  2. # useradd -g mysql mysql

解凍

  1. $ tar xvf MySQL-5.6.13-1.linux_glibc2.5.i386.rpm-bundle.tar

インストール

  • 標準の最低限のインストールには、サーバーとクライアント RPM をインストールします。
  • RPM はまた MySQL サーバーを運用するためのユーザー mysql (存在しない場合) のログインアカウントを作成する
  • サーバーがブート時に自動的に起動するように適切なエントリを /etc/init.d/ に作成する
  1. # rpm -ivh MySQL-shared-5.6.13-1.linux_glibc2.5.i386.rpm
  2. # rpm -ivh MySQL-shared-compat-5.6.13-1.linux_glibc2.5.i386.rpm
  3. # rpm -ivh MySQL-server-5.6.13-1.linux_glibc2.5.i386.rpm
  4. # rpm -ivh MySQL-client-5.6.13-1.linux_glibc2.5.i386.rpm

<blockquote>serverインストール時に、初期パスワードの情報がコンソールに出力される</blockquote>

  1. A random root password has been set. You will find it in '/root/.mysql_secret'.

<blockquote>もしくはログに出力されている</blockquote>

  1. /var/log/mysqld.log | grep "temporary password"
開発で必要(Djangoなど)
  1. # rpm -ivh MySQL-devel-5.6.13-1.linux_glibc2.5.i386.rpm

起動と停止

CentOS
  1. # /sbin/service mysql start
  2. Starting MySQL... [ OK ]
  3. # /etc/init.d/mysql stop
  4. Shutting down MySQL.. [ OK ]
CentOS7
  1. # systemctl enable mysqld
  2. # systemctl start mysqld
Ubuntu
  1. $ sudo /etc/init.d/mysql start
  2. $ sudo /etc/init.d/mysql stop
  3. $ sudo /etc/init.d/mysql restart
mysqld_safe(mysqld のラッパ)
  1. shell> cd mysql_installation_directory
  2. shell> bin/mysqld_safe &

起動設定がされたか確認

  1. # chkconfig | grep "mysql"
  2. mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off

権限の初期設定

忘れたパスワードをリセット

Ubuntu 初期パスワードの場所
  • 確認
  1. $ sudo cat /etc/mysql/debian.cnf
  2. # Automatically generated for Debian scripts. DO NOT TOUCH!
  3. [client]
  4. host = localhost
  5. user = debian-sys-maint
  6. password = KJmv1zRL0acKBftn
  7. socket = /var/run/mysqld/mysqld.sock
  8. [mysql_upgrade]
  9. host = localhost
  10. user = debian-sys-maint
  11. password = KJmv1zRL0acKBftn
  12. socket = /var/run/mysqld/mysqld.sock
  • ログイン
  1. piroto@jinmu:/etc/mysql$ mysql -u debian-sys-maint -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 15
  5. Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu)
  6. mysql> use mysql
  7. mysql> select User,Host,plugin from mysql.user;
  8. +------------------+-----------+-----------------------+
  9. | User | Host | plugin |
  10. +------------------+-----------+-----------------------+
  11. | debian-sys-maint | localhost | caching_sha2_password |
  12. | mysql.infoschema | localhost | caching_sha2_password |
  13. | mysql.session | localhost | caching_sha2_password |
  14. | mysql.sys | localhost | caching_sha2_password |
  15. | root | localhost | auth_socket |
  16. +------------------+-----------+-----------------------+
  17. 5 rows in set (0.00 sec)
  • rootパスワードの変更
  1. mysql> select version();
  2. +-------------------------+
  3. | version() |
  4. +-------------------------+
  5. | 8.0.21-0ubuntu0.20.04.4 |
  6. +-------------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> set password for 'root'@'localhost' = 'new password';
  10. Query OK, 0 rows affected, 1 warning (0.06 sec)
  • クライアントからログイン
    • sudo しないとERROR 1698 (28000): Access denied エラー
  1. iroto@jinmu:/etc/mysql$ mysql -u root -p
  2. Enter password:
  3. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  4. piroto@jinmu:/etc/mysql$ sudo mysql -u root -p
  5. Enter password:
  6. Welcome to the MySQL monitor. Commands end with ; or \g.
  7. Your MySQL connection id is 26
  8. Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu)
  9. mysql>
  10.  
mysqldを--skip-grant-tables オプションで起動
  1. # mysqld --skip-grant-tables &
mysqld サーバに接続
  1. # mysql -u root mysql
新しいパスワードの設定
  1. mysql> update user set Password=PASSWORD('newpassword')
  2. -> where User='root';
  3. Query OK, 4 rows affected (0.11 sec)
  4. Rows matched: 4 Changed: 4 Warnings: 0
  5.  
  6. mysql> flush privileges;
  7. Query OK, 0 rows affected (0.01 sec)
rootパスワードの変更
  1. mysql> set password for 'root'@'localhost' = password('newpassword');
  2. Query OK, 0 rows affected (0.00 sec)
パスワードの設定 MySQL8
  1. mysql> set password for 'wordpress'@'localhost' = 'your password';

初期の権限変更ツール mysql_secure_installation

  • 初期パスワード /var/log/mysqld.log | grep "temporary password"
  1. # mysql_secure_installation
  2. Change the root password? [Y/n] n
  3. Remove anonymous users? [Y/n] Y
  4. Disallow root login remotely? [Y/n] Y
  5. Remove test database and access to it? [Y/n] n
  6. Reload privilege tables now? [Y/n] Y
  7.  
  8. All done! If you've completed all of the above steps, your MySQL
  9. installation should now be secure.
  10.  
  11. Thanks for using MySQL!
  12.  
  13. Cleaning up...

簡易設定

バージョンの確認

  1. mysql> select version();
  2. +-----------+
  3. | version() |
  4. +-----------+
  5. | 5.0.77 |
  6. +-----------+
  7. 1 row in set (0.00 sec)

MySQL 簡易設定

データベースの作成

作成

  1. # mysql -u root -p
  2. mysql> create database test_db default character set utf8;
  3. Query OK, 1 row affected (0.00 sec)
文字コード

確認

  1. mysql> show create database test_db;
  2. +----------+------------------------------------------------------------------+
  3. | Database | Create Database |
  4. +----------+------------------------------------------------------------------+
  5. | test_db | CREATE DATABASE `test_db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
  6. +----------+------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

権限

  • 接続を許可するユーザーをmysqlデータベース内で管理している
  • ユーザーがアクセスする際にはアクセス元のホスト(IPアドレス)もセットで認証が行われる

権限テーブル

テーブル名 説明
user ユーザーの基本的な定義
host ホストに対する権限の定義
db データベースに対する権限の定義
tables_priv テーブルに対する権限の定義
clumuns_priv カラムに対する権限の定義

ユーザーの作成

  1. mysql> create user test_user@localhost;
  2. Query OK, 0 rows affected (0.03 sec)

権限の付与

限定して付与
  1. mysql> grant create,alter,select,insert,update,delete,index on *.* to test_user@localhost;
  2. Query OK, 0 rows affected (0.00 sec)
管理権限を付与
  • test_admin@localhost を作成した上で管理権限を付与
  • リモートアクセスを可能とするには、test_admin@localhost の部分を test_admin@'%' とする
  1. mysql> grant all privileges on *.* to test_admin@localhost identified by 'newpassword' with grant option;
  2. Query OK, 0 rows affected (0.00 sec)

外部から接続

ポートを開ける

  1. # firewall-cmd --permanent --zone=public --add-port=3306/tcp
  2. # firewall-cmd --reload
  1. piroto@jinmu:~$ sudo ufw allow 3306
  2. ルールを追加しました
  3. ルールを追加しました (v6)
  4. piroto@jinmu:~$ sudo ufw status
  5. 状態: アクティブ
  6.  
  7. To Action From
  8. -- ------ ----
  9. 80 ALLOW Anywhere
  10. 3306 ALLOW Anywhere
  11. 80 (v6) ALLOW Anywhere (v6)
  12. 3306 (v6) ALLOW Anywhere (v6)

root@%を追加

確認
  1. mysql> select user,host from mysql.user;
  2. +------------------+-----------+
  3. | user | host |
  4. +------------------+-----------+
  5. | mysql.infoschema | localhost |
  6. | mysql.session | localhost |
  7. | mysql.sys | localhost |
  8. | pma | localhost |
  9. | root | localhost |
  10. | wordpress | localhost |
  11. +------------------+-----------+
ユーザーの追加
  1. mysql> create user 'root'@'%' identified by 'パスワード';
  2. mysql> set password for 'root'@'%' = 'パスワード';
  3. mysql> grant all on *.* to 'root'@'%';
確認
  1. mysql> select user, host from user;
  2. +------------------+-----------+
  3. | user | host |
  4. +------------------+-----------+
  5. | root | % |
  6. | mysql.infoschema | localhost |
  7. | mysql.session | localhost |
  8. | mysql.sys | localhost |
  9. | pma | localhost |
  10. | root | localhost |
  11. | wordpress | localhost |
  12. +------------------+-----------+

バックアップとリストア

mysqldump

  • 通常mysqldumpコマンドを使用する
  • データをテキストファイルとしてダンプするというシンプルな仕組みのコマンド
  • CREATE TABLE および INSERT文として出力される

テーブル名を指定してダンプ

  1. mysqldump [オプション] データベース名 [テーブル名 ...]

複数のデータベースを対象とする

  1. mysqldump [オプション] --databases [オプション] データベース名 [データベース名 ...]

すべてのデータベースを対象とする

  1. mysqldump [オプション] --all-databases [オプション]

バックアップ

  1. # mysqldump --default-character-set=utf8 -uroot -p mt > mt_backup20140120.sql
  2. Enter password:

レストア例

  • mysqldumpの出力はSQL文の羅列であるため、復元するにはリダイレクトを使ってmysqlに結果を与えれば良い
  1. # mysql -u root -p mt < mt_backup20140120.sql

Tips

管理

データファイルの場所

  1. /etc/my.cnf
  2. datadir=/var/lib/mysql

テーブル一覧を表示

  1. # mysql -u root -p
  2. mysql> use mt
  3. Reading table information for completion of table and column names
  4. You can turn off this feature to get a quicker startup with -A
  5.  
  6. Database changed
  7. mysql> show tables;
  8. +-------------------+
  9. | Tables_in_mt |
  10. +-------------------+
  11. | mt_asset |
  12. | mt_asset_meta |
  13. | mt_association |
  14. | mt_ts_funcmap |
  15. | mt_ts_job |
  16. +-------------------+
  17. 44 rows in set (0.00 sec)

セッションの確認と切断

  1. show processlist;
  2. kill [Id]

SQL

制約を無視してテーブルをtruncateする

  • 一旦、FOREIGN_KEY_CHECKSを0にする
  1. mysql> SET FOREIGN_KEY_CHECKS=0;
  2. mysql> truncate table hoge;
  3. mysql> SET FOREIGN_KEY_CHECKS=1;

mysqlコマンド

ソースファイルのSQLを実行

  1. \.<ファイル名>

データベースの変更

  1. use

ヘルプ

  1. help

テーブル定義を確認

  1. show create table テーブル名

テーブル一覧

  1. show tables

ポートを調べる

  1. mysql> show variables like 'port';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | port | 3306 |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

プログラミング

JDBC Download

C#から接続

  1. using MySql.Data.MySqlClient;
  2. using System;
  3. using System.Data;
  4.  
  5. namespace Mt2Wp
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. var pgm = new Program();
  12. pgm.AccessTest();
  13. }
  14.  
  15. public void AccessTest()
  16. {
  17. // Unable to convert MySQL date/time value to System.DateTime
  18. // https://stackoverflow.com/questions/2934844/unable-to-convert-mysql-date-time-value-to-system-datetime
  19. var conInfo = $"Database=wordpress;Data Source=192.168.0.2;User Id=root;Password={password}; pooling = false; convert zero datetime=True";
  20. using(var conn = new MySqlConnection(conInfo))
  21. {
  22. conn.Open();
  23.  
  24. var da = new MySqlDataAdapter("select * from wp_posts", conn);
  25. var ds = new DataSet();
  26. da.Fill(ds);
  27.  
  28. foreach (DataTable table in ds.Tables)
  29. {
  30. foreach (DataRow row in table.Rows)
  31. {
  32. foreach (DataColumn col in table.Columns)
  33. {
  34. Console.Write($"{row[col]}\t");
  35. }
  36. Console.WriteLine("");
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }