カテゴリー
Database

MySql の ユーザー パスワードの変更

MySql のユーザーのパスワードを変更する方法意外にも面倒でした。

root でログインします。


$ mysql -u root -p
Enter password:

次に、使用するデータベースを mysql に変更

mysql> use mysql;

そして、ユーザーのパスワードを変更。
(例として、ユーザ名: username 新パスワード: username_password で行っています。)

mysql> set password for 'username@'localhost' = password('username_password');
Query OK, 0 rows affected (0.11 sec)

以上です。

カテゴリー
Database

MySql の root パスワードのリセット

うかつにも MySql の root パスワードの設定時にタイプミスしていたようで、自分の覚えているパスワードを入力してもエラーになっております。


# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

しょうがないので以下のサイトを参考にパスワードをリセットします。

https://www.rackspace.com/knowledge_center/article/mysql-resetting-a-lost-mysql-root-password

まずは、mysqld が動作しているので停止します。


# /etc/init.d/mysqld stop

次に、mysqld_safe の –skip-grant-tables というオプションで実行。mysql をユーザー特権をスキップして開始する。(このオプションは –help でも表示されないので隠しオプションかな?)
アンパーサンド(&) をコマンドの末尾につけて実行します。


# mysqld_safe --skip-grant-tables &

そして、root でパスワードなしで実行。


# mysql -u root

以下、MySql コンソールで順次実行。ここでは、新しいパスワードを “new password” とします。


mysql> use mysql;
mysql> update user set password=PASSWORD("new password") where User='root';
mysql> flush privileges;
mysql> quit

最後に、mysqld を再起動します。


# /etc/init.d/mysqld stop
# /etc/init.d/mysqld start

新しいパスワードを確認してみます。


# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

以上です。無事リセットできました。 🙂

カテゴリー
Database

MySql 現行データベースのテーブル CREATE TABLE文を取得

現行システムのメンテナンスをしているとテーブル仕様書とデータベースのテーブルが異なることはありますね。

現行データベースのテーブルの CREATE 文を取得する方法を紹介します。

MySql コンソールからテーブル一つずつ取得する方法

mysql> SHOW CREATE TABLE table_name

以下、出力例です。(※見やすくなるように少し修正してあります。)

mysql> show create table Groups;
+--------+---------------------------------------------------+
| Table  | Create Table                                      |
+--------+---------------------------------------------------+
| Groups | CREATE TABLE `Groups` (
  `group_id` int(9) unsigned NOT NULL auto_increment,
  `group_parent_id` int(9) default NULL,
  `group_name` varchar(255) NOT NULL,
  `org_id` int(9) unsigned NOT NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  `deprecated` datetime default NULL,
  PRIMARY KEY  (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8      | 
+--------+--------------------------------------------------+

データなしでダンプする方法

# mysqldump -h localhost -u root -p --no-data database_name;

以下、ダンプした一部です。

--
-- Table structure for table `Groups`
--

DROP TABLE IF EXISTS `Groups`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Groups` (
  `group_id` int(9) unsigned NOT NULL auto_increment,
  `group_parent_id` int(9) default NULL,
  `group_name` varchar(255) NOT NULL,
  `org_id` int(9) unsigned NOT NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  `deprecated` datetime default NULL,
  PRIMARY KEY  (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

どちらの方法でも、AUTO_INCREMENT の初期値が現行の値が設定されていますので、新規でデータベースを作成する場合は注意が必要です。

カテゴリー
Database

SQL ○○別に最新レコードを抽出

例えば、顧客別に最新取引レコードを取り出すような場合のSQL文。

テーブル例

CREATE TABLE Cases (
    id                   int NOT NULL AUTO_INCREMENT,
    subject              text,
    customer_id          int,
    created_date         datetime,
  PRIMARY KEY (`id`)
) AUTO_INCREMENT = 1;

テーブルに格納されているデータ例

mysql> SELECT * FROM Cases;
+----+---------------------------+-------------+---------------------+
| id | subject                   | customer_id | created_date        |
+----+---------------------------+-------------+---------------------+
| 13 | aaaaa                     |           1 | 2014-10-29 11:47:51 |
| 14 | bbbbb                     |           1 | 2014-10-29 11:48:46 |
| 16 | vcvzxcvzxc                |           1 | 2014-10-30 17:32:50 |
|  6 | 雪で車が動かない          |           4 | 2014-02-26 12:46:16 |
|  8 | カーポートがつぶれた      |           4 | 2014-02-26 13:10:03 |
| 15 | cccc                      |           4 | 2014-10-29 13:17:35 |
|  5 | 電話機の故障              |           5 | 2014-02-26 10:25:56 |
|  9 | 30秒後以内              |           5 | 2014-02-26 13:25:48 |
| 11 | 11111                     |           6 | 2014-10-28 17:48:56 |
| 10 | aaaa                      |          11 | 2014-10-28 17:46:42 |
|  7 | aaa                       |          17 | 2014-02-26 13:06:00 |
| 12 | aaaaaaaa                  |          18 | 2014-10-28 17:49:44 |
+----+---------------------------+-------------+---------------------+

顧客ID別に作成日が最新のレコードを抽出するSQL文

mysql> SELECT * FROM Cases WHERE Cases.created_date = (SELECT MAX(c.created_date) FROM Cases AS c WHERE Cases.customer_id = c.customer_id);
+----+---------------------------+-------------+---------------------+
| id | subject                   | customer_id | created_date        |
+----+---------------------------+-------------+---------------------+
| 16 | vcvzxcvzxc                |           1 | 2014-10-30 17:32:50 |
| 15 | cccc                      |           4 | 2014-10-29 13:17:35 |
|  9 | 30秒後以内              |           5 | 2014-02-26 13:25:48 |
| 11 | 11111                     |           6 | 2014-10-28 17:48:56 |
| 10 | aaaa                      |          11 | 2014-10-28 17:46:42 |
|  7 | aaa                       |          17 | 2014-02-26 13:06:00 |
| 12 | aaaaaaaa                  |          18 | 2014-10-28 17:49:44 |
+----+---------------------------+-------------+---------------------+
カテゴリー
Database

MySql データベース名を変更

MySql データベース名を変更する方法をご紹介します。

1. 既存データベースをダンプ
2. 新データベースを作成
3. 新データベースへダンプしたデータをインポート

# mysqldump -u username -p -v olddatabase > olddbdump.sql
# mysqladmin -u username -p create newdatabase
# mysql -u username -p newdatabase < olddbdump.sql

参考:
https://stackoverflow.com/questions/67093/how-do-i-quickly-rename-a-mysql-database-change-schema-name