DBとか」カテゴリーアーカイブ

OracleのImport/Exportについて

「Oracle10g → 11g へのデータ移行」
の記事がちょこちょこ参照されているようで、やっぱりみんなバージョン違いのImport/Exportはちょっと困ってるんだろうな、と。
なので、今回は己の備忘録も兼ねてimp/expコマンドとはまた別のやり方を。

基本的には imp/expコマンドとほとんど同じで、使うコマンドは impdp/expdp です。

以下、DBサーバ上で作業することを前提に記載します。

impdp/expdp の場合、出力するディレクトリオブジェクトを設定する必要があります。

Exportするディレクトリを「C:\db\expdata」とした場合、
以下、SQL Plus にて、

SQL> create directory [DIR_NAME] as 'C:\db\expdata'

と設定します。

[DIR_NAME]はどんな名前でもいいです。
「test1」でも「expdir」でも。
あくまでも、ディレクトリオブジェクト名なので。

その後、

SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME];

とやってあげると、指定されたテーブルのDumpデータが、指定されたディレクトリに作成されます。
※テーブル単位、ユーザ単位、スキーマ単位など、そのあたりはマニュアルやら他のサイトを参照してください

ちなみに、数百万レコード単位のテーブルから、条件を指定してExportしたい、という場合、

SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME] QUERY='TABLE_NAME:WHERE ID >= ''1000000''';

のように、WHERE句を付与することで抽出出来ます。

また、下位バージョンから上位バージョンへのImport/Exportは問題ないのですが、上位バージョンから下位バージョンへのImport/Exportの場合、Exportする際にバージョンを指定してあげる必要があります。

SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME] VERSION=10.2.0;

次に、ExportしたファイルをImportする場合、こちらもまずはディレクトリオブジェクトを設定する必要があります。

Importするファイルが存在するディレクトリを「C:\db\impdata」とした場合、
以下、SQL Plus にて、

SQL> create directory [DIR_NAME] as 'C:\db\impdata'

と設定します。

その後、

SQL> host impdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[EXPORT_FILE_NAME] tables=[TABLE_NAME];

とやってあげると、指定されたテーブルにExportしたデータがImportされます。

Import時もExport時も、create directory で作成したディレクトリオブジェクト設定は、削除しないとずっと残ってしまうので、

SQL> drop directory [DIR_NAME];

として、削除してください。

imp/expコマンドより、impdp/expdpコマンドの方が全然早いので、こっちの方がオススメです。

では。

phpMyAdminへの不正アクセスについて

なんやかんやで、昔からphpMyAdminへの不正アクセスアタックはあるもので。

以下、どんなリクエストがあるか、リストします。
※DocumentRootが/var/www/htmlの場合です

/var/www/html/MyAdmin
/var/www/html/_phpmyadmin
/var/www/html/admin
/var/www/html/cpanelphpmyadmin
/var/www/html/cpphpmyadmin
/var/www/html/db
/var/www/html/dbadmin
/var/www/html/myadmin
/var/www/html/mysql
/var/www/html/mysqladmin
/var/www/html/php
/var/www/html/php-my-admin
/var/www/html/phpMyAdmin
/var/www/html/phpMyAdmin-2
/var/www/html/phpMyAdmin-2.10.0
/var/www/html/phpMyAdmin-2.10.0.0
/var/www/html/phpMyAdmin-2.10.0.1
/var/www/html/phpMyAdmin-2.10.0.2
/var/www/html/phpMyAdmin-2.10.1.0
/var/www/html/phpMyAdmin-2.10.2.0
/var/www/html/phpMyAdmin-2.11.0.0
/var/www/html/phpMyAdmin-2.11.1-all-languages
/var/www/html/phpMyAdmin-2.11.1.0
/var/www/html/phpMyAdmin-2.11.1.1
/var/www/html/phpMyAdmin-2.11.1.2
/var/www/html/phpMyAdmin-2.6.1-pl2
/var/www/html/phpMyAdmin-2.6.1-pl3
/var/www/html/phpMyAdmin-2.6.4-pl3
/var/www/html/phpMyAdmin-2.6.4-pl4
/var/www/html/phpMyAdmin-2.6.4-rc1
/var/www/html/phpMyAdmin-2.6.5
/var/www/html/phpMyAdmin-2.6.6
/var/www/html/phpMyAdmin-2.6.9
/var/www/html/phpMyAdmin-2.7.0-beta1
/var/www/html/phpMyAdmin-2.7.0-pl1
/var/www/html/phpMyAdmin-2.7.0-pl2
/var/www/html/phpMyAdmin-2.7.0-rc1
/var/www/html/phpMyAdmin-2.7.5
/var/www/html/phpMyAdmin-2.7.6
/var/www/html/phpMyAdmin-2.7.7
/var/www/html/phpMyAdmin-2.8.2
/var/www/html/phpMyAdmin-2.8.2.3
/var/www/html/phpMyAdmin-2.8.3
/var/www/html/phpMyAdmin-2.8.4
/var/www/html/phpMyAdmin-2.8.5
/var/www/html/phpMyAdmin-2.8.6
/var/www/html/phpMyAdmin-2.8.7
/var/www/html/phpMyAdmin-2.8.8
/var/www/html/phpMyAdmin-2.8.9
/var/www/html/phpMyAdmin-2.9.0
/var/www/html/phpMyAdmin-2.9.0-rc1
/var/www/html/phpMyAdmin-2.9.0.1
/var/www/html/phpMyAdmin-2.9.0.2
/var/www/html/phpMyAdmin-2.9.1
/var/www/html/phpMyAdmin-2.9.2
/var/www/html/phpMyAdmin-3.0.0-rc1-english
/var/www/html/phpMyAdmin-3.0.0.0-all-languages
/var/www/html/phpMyAdmin-3.0.1.0
/var/www/html/phpMyAdmin-3.0.1.0-english
/var/www/html/phpMyAdmin-3.0.1.1
/var/www/html/phpMyAdmin-3.1.0.0
/var/www/html/phpMyAdmin-3.1.0.0-english
/var/www/html/phpMyAdmin-3.1.1.0-all-languages
/var/www/html/phpMyAdmin-3.1.2.0
/var/www/html/phpMyAdmin-3.1.2.0-all-languages
/var/www/html/phpMyAdmin-3.1.2.0-english
/var/www/html/phpMyAdmin-3.4.3.1
/var/www/html/phpMyAdmin2
/var/www/html/phpMyAdmin3
/var/www/html/phpadmin
/var/www/html/phpmyadmin
/var/www/html/pma
/var/www/html/scripts
/var/www/html/websql

上記に該当するURLの方は変更した方がよろしいかと。

では。

CodeIgniter 2.0.2 + Oracle 10.2.0.3 の接続について

あまり日本語のエントリが無かったので、ちょっと書いてみる。
PHP+Oracleの環境については、手前味噌ですがこちらの記事を参照。
CodeIgniterの環境設定については、ユーザガイドを参照。

動作検証を実施したサーバ環境は、以下。
・CentOS 4.8
・Oracle 10.2.0.3
・Oracle Instant Client 11.0.2
・PHP 5.3.2
・CodeIgniter 2.0.2

設定したコンフィグの内容は以下。
application/config/database.php


$db[‘default’][‘hostname’] = ‘//DB_SERVER_IP:PORT/SID‘;
$db[‘default’][‘username’] = ‘USER_ID‘;
$db[‘default’][‘password’] = ‘PASSWORD‘;
$db[‘default’][‘database’] = ‘DATABASE_NAME‘;
$db[‘default’][‘dbdriver’] = ‘oci8’; ← コレ。「OCI8」のドライバを指定する
$db[‘default’][‘dbprefix’] = ”;
$db[‘default’][‘pconnect’] = TRUE;
$db[‘default’][‘db_debug’] = TRUE;
$db[‘default’][‘cache_on’] = FALSE;
$db[‘default’][‘cachedir’] = ”;
$db[‘default’][‘char_set’] = ‘utf8’;
$db[‘default’][‘dbcollat’] = ‘utf8_general_ci’;
$db[‘default’][‘swap_pre’] = ”;
$db[‘default’][‘autoinit’] = TRUE;
$db[‘default’][‘stricton’] = FALSE;


こんな感じで。

これであとはModel作ってSQL発行すればOK。
ActiveRecordでも問題無し。
簡単でした。

ちなみに、Oracleでシーケンスを取得するのにはこんな感じで。

function get_seq() {
  $this->db->SELECT(‘SEQUENCE_NAME.nextval as nextval’,FALSE)->FROM(‘dual’);
  $query = $this->db->get();
  return $query->result();
}

SELECT に 「FALSE」付けてあげないと、うまく取得出来ないです。
※勝手に「”」「’」とか付けちゃうので

では。

Oracle10g → 11g へのデータ移行

※2017/04/25 追記
こっちの記事の方がいいかも。
OracleのImport/Exportについて

32bit版Oracle10gから64bit版Oracle11gへのデータ移行手順を。
忘れない内に。

まず、10gの方でExport。

次に、11gの方でDB作成、ユーザ作成。

で、11gの方でImport。

Importオプションは以下。

imp system/manager@[インスタンス名] fromuser=[ユーザ名] touser=[ユーザ名] file=[Dumpデータファイルパス] log=[ログファイルパス]

以上で完了。

細かいオプションやら何やらは、環境に依って変わると思うので、マニュアル等で調べてくださいな。

では。

さくらインターネットの共用サーバでEC-CUBEのモバイル版を動かす

現在運用中のEC-CUBEのサイトがある。

さくらインターネットの共用サーバで動作している。

で、今まではPCサイトのみで動作していたのだが、モバイル版もカスタマイズして使えるようにして欲しいと。

専用サーバの場合、ゴリゴリとサーバ自体の設定をいじれるから問題無いのだが、さくらの共用サーバはそうもいかない。

インストールされた状態のままでもうまく動かない。

色々やって、うまく動くようになったので、備忘録。

1) SC_DbConn.phpの修正(data/class/SC_DbConn.php)

DB接続部分でなにやらエラーが出てうまく動かなかったので、コンストラクタのDB接続部分をこんな感じで修正。

// 既に接続されていないか、新規接続要望の場合は接続する。
if(!isset($objDbConn->connection) || $new) {
if($dsn != "") {
$objDbConn = DB::connect($dsn, $options);
$this->dsn = $dsn;
// ここから下3行を追加
$buf = $objDbConn->prepare('SET NAMES utf8');
$objDbConn->execute($buf);
mysql_set_charset("utf8");
} else {
if(defined('DEFAULT_DSN')) {
$objDbConn = DB::connect(DEFAULT_DSN, $options);
$this->dsn = DEFAULT_DSN;
} else {
return;
}
}
}

2) php.iniをばらまく

さくらサーバの場合、html/mobile配下に設置されている.htaccessが効かないので、php.iniにして、その配下のディレクトリ全てにばらまく。

$ cd html/mobile
$ mv .htaccess .htaccess.bk
$ vi php.ini
mbstring.language=Japanese
output_handler=null
mbstring.encoding_translation=Off
magic_quotes_gpc=Off
mbstring.internal_encoding=UTF-8
variables_order=EGPS
session.auto_start=Off
session.use_trans_sid=On
$ cp ./php.ini ./cart/
$ cp ./php.ini ./contact/
$ cp ./php.ini ./entry/
$ cp ./php.ini ./forgot/
$ cp ./php.ini ./frontparts/bloc/
$ cp ./php.ini ./guide/
$ cp ./php.ini ./mypage/
$ cp ./php.ini ./products/
$ cp ./php.ini ./regist/
$ cp ./php.ini ./shopping/
$ cp ./php.ini ./unsupported/
$ cp ./php.ini ./user_data/

とりあえず、こんな感じでうまく動くようになりました。

でわ。

MySQLでテーブル毎に設定されているストレージエンジンを確認する方法

MySQLでは、各テーブル毎にストレージエンジンを設定する事が出来ます。

大体は、この2つのどちらかになるかと思います。

MyISAM:検索に強いらしい

InnoDB:トランザクションが使えるらしい

と言う事で、各テーブル毎に設定されているストレージエンジンを確認する方法です。

# mysql -u root
mysql> use information_schema;
mysql> select table_name, engine from tables where table_schema = DB_NAME;
+--------------------+--------+
| table_name         | engine |
+--------------------+--------+
| hogehoge           | InnoDB |
| hagehage           | MyISAM |
| higehige           | InnoDB |
+--------------------+--------+
mysql> exit;

「show table status」でも確認出来ますが、複数DBが動いている状態だと、全てのDBのテーブルが表示されてしまうので。

でわ。

MySQLで予約語をフィールド名に設定する方法

掲題の件、基本的にはやっちゃダメです。

ですが、よく分かってない人がDB設計やったりすると、予約語をフィールド名に設定されたりします。

で、Create Table する時に、エラーになったり・・・

と言う事で、予約語をフィールド名に設定する方法です。

create table test_table (
id int(5) not null auto_increment,
option varchar(100),
group char(10)
) type=MyISAM;

この場合、「option」「group」が予約語になります。

このままこのSQLを発行するとエラーになります。

なので、こうやって書いてやります。

create table test_table (
id int(5) not null auto_increment,
`option` varchar(100),
`group` char(10)
) type=MyISAM;

これで、Create Table が成功します。

Insertする時やUpdateする時も同じようにやってあげる必要があるかもです。

そのあたりは各自で検証を・・・

でわ。

CentOS4.6+MySQL 4.0.26 その2

昨年末より色々と調べていた、MySQL 4.0.26 の設置にようやく成功した。

# rpm -ivh ./MySQL-server-4.0.26-0.i386.rpm
Preparing...                ########################################### [100%]
1:MySQL-server           ########################################### [100%]
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
Fatal error: Can't change to run as user 'mysql'.  Please check that the user exists!
091130  7:05:11 Aborting
091130  7:05:11 /usr/sbin/mysqld: Shutdown Complete
Installation of grant tables failed!
Examine the logs in /var/lib/mysql for more information.
You can also try to start the mysqld daemon with:
/usr/sbin/mysqld --skip-grant &
You can use the command line tool
/usr/bin/mysql to connect to the mysql
database and look at the grant tables:
shell> /usr/bin/mysql -u root mysql
mysql> show tables
Try 'mysqld --help' if you have problems with paths. Using --log
gives you a log in /var/lib/mysql that may be helpful.
The latest information about MySQL is available on the web at
http://www.mysql.com
Please consult the MySQL manual section: 'Problems running mysql_install_db',
and the manual section that describes problems on your OS.
Another information source is the MySQL email archive.
Please check all of the above before mailing us!
And if you do mail us, you MUST use the /usr/bin/mysqlbug script!

とりあえず、以下コマンドにて、ちゃんとmysqlという名称のDBが設置されているかどうか、確認した。

# mysql -u root mysql

すると、

-bash: mysql: command not found

との事。

mysql のクライアントを入れ忘れていたので、他のも含めてインストール。

# rpm -ivh MySQL-client-4.0.26-0.i386.rpm
# rpm -ivh MySQL-devel-4.0.26-0.i386.rpm
# rpm -ivh MySQL-Max-4.0.26-0.i386.rpm

でもって、再度「mysql -u root mysql」を実行も、mysql自体が動いていないから見れないわけで・・・

/etc/my.cnf を作って、mysqlのログを吐くように指定などなど。

# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[mysql.server]
user=mysql
basedir=/var/lib
[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

でもって、「/etc/rc.d/init.d/mysql start」を実行も、動かない。

ログを参照したところ、以下が出力されていましたわ。

100309 03:18:51  mysqld started
100309  3:18:51  InnoDB: Started
100309  3:18:51 Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
100309  3:18:51 Aborting
100309  3:18:51  InnoDB: Starting shutdown...
100309  3:18:53  InnoDB: Shutdown completed
100309  3:18:53 /usr/sbin/mysqld-max: Shutdown Complete
100309 03:18:53  mysqld ended

あれ?

そもそも、「mysql.host」が無いって、ダメじゃね?

って事で、色々とまた調査開始。

そう言えば、postgreSQLは「initdb」とかあったな、とか思って、実はMySQLでも必要じゃね?と。

ありました。

「mysql_install_db」が。

つか、最初のエラーメッセージのところにも、ちゃんと書いてあったね。。。

「’Problems running mysql_install_db’」

って。。。

早速実行。

/usr/bin/mysql_install_db
# mysql_install_db
Neither host 'localhost.localdomain' nor 'localhost' could not be looked up with
/usr/bin/resolveip
Please configure the 'hostname' command to return a correct hostname.
If you want to solve this at a later stage, restart this script with
the --force option

おう?

ホスト名を設定しろって事かね?

とりあえず、ホスト名を設定。

hostname www.example.com

再度実行。

/usr/bin/mysql_install_db
# mysql_install_db
Neither host 'www.example.com' nor 'localhost' could not be looked up with
/usr/bin/resolveip
Please configure the 'hostname' command to return a correct hostname.
If you want to solve this at a later stage, restart this script with
the --force option

あれ?

また調査開始。

「–no-defaults」オプションを付けると出来るってエントリがあったので、やってみたけど、結果変わらず。

エラーメッセージを良く読んだところ、「–force」を付けろとの事。

やってみた。

# /usr/bin/mysql_install_db --force
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
100309  3:29:05 /usr/sbin/mysqld: Shutdown Complete
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h www.example.com password 'new-password'
See the manual for more instructions.
You can start the MySQL daemon with:
cd / ; /usr/bin/mysqld_safe &
You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests
Please report any problems with the /usr/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at https://order.mysql.com

ふむ、どうやら出来たっぽい。

では、起動してみようって事で「/etc/rc.d/init.d/mysql start」を実行。

しかし、起動せず。

エラーログ参照。

100309 03:29:46  mysqld started
100309  3:29:46  InnoDB: Started
100309  3:29:46 /usr/sbin/mysqld-max: Can't find file: './mysql/host.frm' (errno: 13)
100309  3:29:46 Fatal error: Can't open privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
100309  3:29:46 Aborting
100309  3:29:46  InnoDB: Starting shutdown...
100309  3:29:48  InnoDB: Shutdown completed
100309  3:29:48 /usr/sbin/mysqld-max: Shutdown Complete
100309 03:29:48  mysqld ended

エラーログ変わった。

「host.frm」が無い?

あぁ~・・・

多分、パーミッションの問題っぽい。

って事で、パーミッションの設定を実施。

# cd /var/lib/mysql
# chown -R mysql:mysql ./mysql

んでもって、起動スクリプトを実施。

ログを参照。

100309 03:31:04  mysqld started
100309  3:31:04  InnoDB: Started
/usr/sbin/mysqld-max: ready for connections.
Version: '4.0.26-Max'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Official MySQL RPM

プロセスを参照。

# ps auxwww | grep mysql
root      2531  0.0  0.1   2412  1076 pts/0    S    03:31   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/www.example.com.pid
mysql     2562  0.0  1.5 120272 15792 pts/0    Sl   03:31   0:00 /usr/sbin/mysqld-max --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/www.example.com.pid --skip-locking --socket=/var/lib/mysql/mysql.sock

動いた!!!!

長い闘いは終わった・・・

あとは、Webのミドルウェアとの繋ぎ込みだな。

でわ。

MySQL備忘録-その1

■auto_incrementの値を初期化する方法

該当テーブルのレコードを全て削除し、以下SQLを発行する。

ALTER TABLE TABLE_NAME AUTO_INCREMENT = 1;

■重複レコードを抽出する方法

SELECT * FROM TABLE_NAME GROUP BY FIELD_A HAVING COUNT(FIELD_A) > 1;

ちょっとした事だし、忘れそうなので、書いておきます。

でわ。

CentOS4.6+MySQL 4.0.26

参った。

RPMでインストール自体は出来るのだが・・・

# rpm -ivh ./MySQL-server-4.0.26-0.i386.rpm
Preparing...                ########################################### [100%]
1:MySQL-server           ########################################### [100%]
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
Fatal error: Can't change to run as user 'mysql'.  Please check that the user exists!
091130  7:05:11 Aborting
091130  7:05:11 /usr/sbin/mysqld: Shutdown Complete
Installation of grant tables failed!
Examine the logs in /var/lib/mysql for more information.
You can also try to start the mysqld daemon with:
/usr/sbin/mysqld --skip-grant &
You can use the command line tool
/usr/bin/mysql to connect to the mysql
database and look at the grant tables:
shell> /usr/bin/mysql -u root mysql
mysql> show tables
Try 'mysqld --help' if you have problems with paths. Using --log
gives you a log in /var/lib/mysql that may be helpful.
The latest information about MySQL is available on the web at
http://www.mysql.com
Please consult the MySQL manual section: 'Problems running mysql_install_db',
and the manual section that describes problems on your OS.
Another information source is the MySQL email archive.
Please check all of the above before mailing us!
And if you do mail us, you MUST use the /usr/bin/mysqlbug script!

途中でエラーが出て、MySQLが起動出来ない・・・

4.1系ならインストールも起動も出来るのだが、4.0系→4.1系でデータ型やら、ちょっと変わった部分があるので、そのままデータを移行出来ないのです。

色々調べてみたのだが、回避方法が見つからない。。。orz

4.0系の最新バージョンを入れようとしたのだが、もう、4.0系が公開されていないので、入れようもないのです。

色々やってみるか。。

でわ。