Commit 7468714a authored by unknown's avatar unknown

manual merge


mysql-test/suite/binlog/t/binlog_row_mix_innodb_myisam.test:
  Auto merged
mysql-test/suite/ndb/r/ndb_read_multi_range.result:
  Auto merged
mysql-test/suite/ndb/t/ndb_read_multi_range.test:
  Auto merged
mysql-test/suite/rpl/r/rpl_row_max_relay_size.result:
  Auto merged
mysql-test/suite/rpl/t/rpl_row_create_table.test:
  Auto merged
mysql-test/suite/rpl/t/rpl_row_flsh_tbls.test:
  Auto merged
mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result:
  Auto merged
mysql-test/suite/rpl/r/rpl_row_basic_11bugs.result:
  Auto merged
mysql-test/suite/rpl/r/rpl_row_flsh_tbls.result:
  Auto merged
mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result:
  Auto merged
sql/ha_ndbcluster_binlog.cc:
  Auto merged
sql/rpl_rli.h:
  Auto merged
BitKeeper/deleted/.del-rpl_extraMaster_Col.test:
  Delete: mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test
parents 47058476 b0ac87dc
DROP TABLE IF EXISTS t1;
CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`t` VARCHAR( 10 ) NOT NULL
) ENGINE = ndbcluster;
GRANT USAGE ON *.* TO user1@localhost IDENTIFIED BY 'pass';
DROP TABLE `test`.`test`;
drop user user1@localhost;
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
DROP TABLE IF EXISTS t1;
**** Testing WL#3228 changes. ****
*** Create "wider" table on slave ***
STOP SLAVE;
RESET SLAVE;
CREATE TABLE t1 (
a float (47),
b double (143,9),
c decimal (65,30),
d numeric (4,0),
e bit (32),
f char (21),
g varchar (1300),
h binary (33),
j varbinary (200),
k enum ('5','6','7', '8','9','0'),
l set ('1','2','3','4','5','6','7','8','9','0','11','12','13','14','15','16','17','18','19','21','22','23','24','25','26','27','28','29'),
m TINYBLOB,
n BLOB,
o MEDIUMBLOB,
p LONGBLOB,
q TINYTEXT,
r TEXT,
s MEDIUMTEXT,
t LONGTEXT
);
*** Create same table on master but with narrow columns ***
CREATE TABLE t1 (
a float (44),
b double (10,3),
c decimal (10,2),
d numeric (3,0),
e bit (16),
f char (10),
g varchar (100),
h binary (20),
j varbinary (20),
k enum ('5','6','7'),
l set ('1','2','3','4','5','6','7','8','9','0'),
m TINYBLOB,
n BLOB,
o MEDIUMBLOB,
p LONGBLOB,
q TINYTEXT,
r TEXT,
s MEDIUMTEXT,
t LONGTEXT
);
RESET MASTER;
*** Start replication ***
START SLAVE;
*** Insert data on master and display it. ***
INSERT INTO t1 () VALUES (
17.567,
2.123,
10.20,
125,
hex(64),
'TEST',
'This is a test',
'binary data',
'more binary data',
'6',
'7',
"blob 1",
"blob 2",
"blob 3",
"blob 4",
"text 1",
"text 2",
"text 3",
"text 4");
SELECT * FROM t1 ORDER BY a;
a b c d e f g h j k l m n o p q r s t
17.567 2.123 10.20 125 # TEST This is a test # more binary data 6 7 blob 1 blob 2 blob 3 blob 4 text 1 text 2 text 3 text 4
*** Select data from slave to compare ***
SELECT * FROM t1 ORDER BY a;
a b c d e f g h j k l m n o p q r s t
17.567 2.123000000 10.200000000000000000000000000000 125 # TEST This is a test # more binary data 6 7 blob 1 blob 2 blob 3 blob 4 text 1 text 2 text 3 text 4
DROP TABLE t1;
Create varchar table on master
CREATE TABLE t1 (
a VARCHAR(50),
b VARCHAR(100),
c VARCHAR(300),
d CHAR(5)
);
Alter varchar table on slave
ALTER TABLE t1 CHANGE COLUMN a a VARCHAR(100);
ALTER TABLE t1 CHANGE COLUMN b b VARCHAR(400);
ALTER TABLE t1 CHANGE COLUMN c c VARCHAR(500);
ALTER TABLE t1 CHANGE COLUMN d d CHAR(100);
Insert some values and select them on master
INSERT INTO t1 VALUES ("This is a test of col a.",
"This is another test of col b.",
"This is a test of the large col c.",
"Col d");
SELECT * FROM t1;
a b c d
This is a test of col a. This is another test of col b. This is a test of the large col c. Col d
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(50) DEFAULT NULL,
`b` varchar(100) DEFAULT NULL,
`c` varchar(300) DEFAULT NULL,
`d` char(5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Insert some values and select them on slave
SELECT * FROM t1;
a b c d
This is a test of col a. This is another test of col b. This is a test of the large col c. Col d
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(100) DEFAULT NULL,
`b` varchar(400) DEFAULT NULL,
`c` varchar(500) DEFAULT NULL,
`d` char(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
Create bit table on master
CREATE TABLE t1 (
a BIT(7),
b BIT(8),
c BIT(21),
d BIT(11),
e BIT(11)
);
Create bit table on slave
DROP TABLE t1;
CREATE TABLE t1 (
a BIT(16),
b BIT(22),
c BIT(54),
d BIT(25),
e BIT(13)
);
Insert some values and select them on master
INSERT INTO t1 VALUES (
b'1010101',
b'10101011',
b'101010110101010101111',
b'10101010101',
b'10101011111'
);
SELECT BIN(a), BIN(b), BIN(c), BIN(d), BIN(e) FROM t1;
BIN(a) BIN(b) BIN(c) BIN(d) BIN(e)
1010101 10101011 101010110101010101111 10101010101 10101011111
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` bit(7) DEFAULT NULL,
`b` bit(8) DEFAULT NULL,
`c` bit(21) DEFAULT NULL,
`d` bit(11) DEFAULT NULL,
`e` bit(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Insert some values and select them on master
SELECT BIN(a), BIN(b), BIN(c), BIN(d), BIN(e) FROM t1;
BIN(a) BIN(b) BIN(c) BIN(d) BIN(e)
1010101 10101011 101010110101010101111 10101010101 10101011111
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` bit(16) DEFAULT NULL,
`b` bit(22) DEFAULT NULL,
`c` bit(54) DEFAULT NULL,
`d` bit(25) DEFAULT NULL,
`e` bit(13) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
*** Cleanup ***
DROP TABLE t1;
...@@ -473,3 +473,22 @@ a b ...@@ -473,3 +473,22 @@ a b
1 1 1 1
10 10 10 10
drop table t1, t2; drop table t1, t2;
create table t1 (id int primary key) engine ndb;
insert into t1 values (1), (2), (3);
create table t2 (id int primary key) engine ndb;
insert into t2 select id from t1;
create trigger kaboom after delete on t1
for each row begin
delete from t2 where id=old.id;
end|
select * from t1 order by id;
id
1
2
3
delete from t1 where id in (1,2);
select * from t2 order by id;
id
3
drop trigger kaboom;
drop table t1;
...@@ -315,5 +315,26 @@ partition by key(a); ...@@ -315,5 +315,26 @@ partition by key(a);
insert into t2 values (1,1), (10,10); insert into t2 values (1,1), (10,10);
select * from t2 where a in (1,10) order by a; select * from t2 where a in (1,10) order by a;
drop table t1, t2; drop table t1, t2;
#bug#30337
create table t1 (id int primary key) engine ndb;
insert into t1 values (1), (2), (3);
create table t2 (id int primary key) engine ndb;
insert into t2 select id from t1;
delimiter |;
create trigger kaboom after delete on t1
for each row begin
delete from t2 where id=old.id;
end|
delimiter ;|
select * from t1 order by id;
delete from t1 where id in (1,2);
select * from t2 order by id;
drop trigger kaboom;
drop table t1;
-- source include/have_ndb.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`t` VARCHAR( 10 ) NOT NULL
) ENGINE = ndbcluster;
# Add user1@localhost with a specific password
# and connect as that user
GRANT USAGE ON *.* TO user1@localhost IDENTIFIED BY 'pass';
connect (user1,localhost,user1,pass,*NO-ONE*);
# Run the query 100 times
disable_query_log;
disable_result_log;
let $i= 100;
while ($i)
{
select count(*) from information_schema.tables union all select count(*) from information_schema.tables union all select count(*) from information_schema.tables;
dec $i;
}
enable_query_log;
enable_result_log;
disconnect user1;
# Switch back to the default connection and cleanup
connection default;
DROP TABLE `test`.`test`;
drop user user1@localhost;
##################################################################
# rpl_colSize #
# #
# This test is designed to test the changes included in WL#3228. #
# The changes include the ability to replicate with the master #
# having columns that are smaller (shorter) than the slave. #
##################################################################
-- source include/master-slave.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
--echo **** Testing WL#3228 changes. ****
--echo *** Create "wider" table on slave ***
sync_slave_with_master;
STOP SLAVE;
RESET SLAVE;
eval CREATE TABLE t1 (
a float (47),
b double (143,9),
c decimal (65,30),
d numeric (4,0),
e bit (32),
f char (21),
g varchar (1300),
h binary (33),
j varbinary (200),
k enum ('5','6','7', '8','9','0'),
l set ('1','2','3','4','5','6','7','8','9','0','11','12','13','14','15','16','17','18','19','21','22','23','24','25','26','27','28','29'),
m TINYBLOB,
n BLOB,
o MEDIUMBLOB,
p LONGBLOB,
q TINYTEXT,
r TEXT,
s MEDIUMTEXT,
t LONGTEXT
);
--echo *** Create same table on master but with narrow columns ***
connection master;
eval CREATE TABLE t1 (
a float (44),
b double (10,3),
c decimal (10,2),
d numeric (3,0),
e bit (16),
f char (10),
g varchar (100),
h binary (20),
j varbinary (20),
k enum ('5','6','7'),
l set ('1','2','3','4','5','6','7','8','9','0'),
m TINYBLOB,
n BLOB,
o MEDIUMBLOB,
p LONGBLOB,
q TINYTEXT,
r TEXT,
s MEDIUMTEXT,
t LONGTEXT
);
RESET MASTER;
--echo *** Start replication ***
connection slave;
START SLAVE;
--echo *** Insert data on master and display it. ***
connection master;
INSERT INTO t1 () VALUES (
17.567,
2.123,
10.20,
125,
hex(64),
'TEST',
'This is a test',
'binary data',
'more binary data',
'6',
'7',
"blob 1",
"blob 2",
"blob 3",
"blob 4",
"text 1",
"text 2",
"text 3",
"text 4");
# Replace values in columns that display differently between SBR & RBR
--replace_column 5 # 8 #
SELECT * FROM t1 ORDER BY a;
--echo *** Select data from slave to compare ***
sync_slave_with_master;
connection slave;
# Replace values in columns that display differently between SBR & RBR
--replace_column 5 # 8 #
SELECT * FROM t1 ORDER BY a;
# Test boundary limits of varchar and char fields
# Master/Slave
# <256/<256 with m < s, m > s, and m == s <-- col a
# >255/<256 with m < s, m > s, and m == s <-- error will be caught in BUG#22086
# <256/>255 with m < s, m > s, and m == s <-- col b
# >255/>255 with m < s, m > s, and m == s <-- col c
#
# Test boundary limits of CHAR fields
# Master/Slave
# <256/<256 with m < s, m > s, and m == s <-- col d
# >255/<256 with m < s, m > s, and m == s <-- error char limited to 255 chars
# <256/>255 with m < s, m > s, and m == s <-- error char limited to 255 chars
# >255/>255 with m < s, m > s, and m == s <-- error char limited to 255 chars
connection master;
DROP TABLE t1;
--echo Create varchar table on master
CREATE TABLE t1 (
a VARCHAR(50),
b VARCHAR(100),
c VARCHAR(300),
d CHAR(5)
);
sync_slave_with_master slave;
--echo Alter varchar table on slave
ALTER TABLE t1 CHANGE COLUMN a a VARCHAR(100);
ALTER TABLE t1 CHANGE COLUMN b b VARCHAR(400);
ALTER TABLE t1 CHANGE COLUMN c c VARCHAR(500);
ALTER TABLE t1 CHANGE COLUMN d d CHAR(100);
connection master;
--echo Insert some values and select them on master
INSERT INTO t1 VALUES ("This is a test of col a.",
"This is another test of col b.",
"This is a test of the large col c.",
"Col d");
SELECT * FROM t1;
SHOW CREATE TABLE t1;
sync_slave_with_master slave;
--echo Insert some values and select them on slave
SELECT * FROM t1;
SHOW CREATE TABLE t1;
# Test boundary limits of bit fields
# m < s, m % 8 != 0, and s % 8 == 0 col a
# m < s, m % 8 == 0, and s % 8 != 0 col b
# m < s, m % 8 != 0, and s % 8 != 0 col c
# m > s, m % 8 != 0, and s % 8 == 0 <-- error will be caught in BUG#22086
# m > s, m % 8 == 0, and s % 8 != 0 <-- error will be caught in BUG#22086
# m > s, m % 8 != 0, and s % 8 != 0 <-- error will be caught in BUG#22086
connection master;
DROP TABLE t1;
--echo Create bit table on master
CREATE TABLE t1 (
a BIT(7),
b BIT(8),
c BIT(21),
d BIT(11),
e BIT(11)
);
sync_slave_with_master slave;
--echo Create bit table on slave
DROP TABLE t1;
CREATE TABLE t1 (
a BIT(16),
b BIT(22),
c BIT(54),
d BIT(25),
e BIT(13)
);
connection master;
--echo Insert some values and select them on master
INSERT INTO t1 VALUES (
b'1010101',
b'10101011',
b'101010110101010101111',
b'10101010101',
b'10101011111'
);
SELECT BIN(a), BIN(b), BIN(c), BIN(d), BIN(e) FROM t1;
SHOW CREATE TABLE t1;
sync_slave_with_master slave;
--echo Insert some values and select them on master
SELECT BIN(a), BIN(b), BIN(c), BIN(d), BIN(e) FROM t1;
SHOW CREATE TABLE t1;
--echo *** Cleanup ***
connection master;
DROP TABLE t1;
sync_slave_with_master;
# END 5.1 Test Case
#############################################################
# Purpose: To test having extra columns on the master WL#3915
#############################################################
-- source include/master-slave.inc
-- source include/have_innodb.inc
let $engine_type = 'InnoDB';
set binlog_format=row;
-- source extra/rpl_tests/rpl_extraMaster_Col.test
set binlog_format=statement;
-- source extra/rpl_tests/rpl_extraMaster_Col.test
#############################################################
# Purpose: To test having extra columns on the master WL#3915
#############################################################
-- source include/master-slave.inc
let $engine_type = 'MyISAM';
set binlog_format=row;
-- source extra/rpl_tests/rpl_extraMaster_Col.test
set binlog_format=statement;
-- source extra/rpl_tests/rpl_extraMaster_Col.test
###########################################
# Purpose: Wrapper for rpl_extraMaster_Col.test
# Using NDB
###########################################
-- source include/have_ndb.inc
-- source include/ndb_master-slave.inc
-- source include/have_binlog_format_row.inc
let $engine_type = 'NDB';
-- source extra/rpl_tests/rpl_extraMaster_Col.test
###########################################
# Purpose: Wrapper for rpl_extraMaster_Col.test
# Using NDB
###########################################
-- source include/have_ndb.inc
-- source include/ndb_master-slave.inc
-- source include/have_binlog_format_statement.inc
let $engine_type = 'NDB';
-- source extra/rpl_tests/rpl_extraMaster_Col.test
...@@ -2817,6 +2817,8 @@ int ha_ndbcluster::write_row(uchar *record) ...@@ -2817,6 +2817,8 @@ int ha_ndbcluster::write_row(uchar *record)
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
else if (thd->slave_thread) else if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
m_rows_changed++; m_rows_changed++;
...@@ -3107,6 +3109,8 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data) ...@@ -3107,6 +3109,8 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data)
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
else if (thd->slave_thread) else if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
/* /*
Execute update operation if we are not doing a scan for update Execute update operation if we are not doing a scan for update
...@@ -3177,6 +3181,9 @@ int ha_ndbcluster::delete_row(const uchar *record) ...@@ -3177,6 +3181,9 @@ int ha_ndbcluster::delete_row(const uchar *record)
else if (thd->slave_thread) else if (thd->slave_thread)
((NdbOperation *)trans->getLastDefinedOperation())-> ((NdbOperation *)trans->getLastDefinedOperation())->
setAnyValue(thd->server_id); setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
((NdbOperation *)trans->getLastDefinedOperation())->
setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
if (!(m_primary_key_update || m_delete_cannot_batch)) if (!(m_primary_key_update || m_delete_cannot_batch))
// If deleting from cursor, NoCommit will be handled in next_result // If deleting from cursor, NoCommit will be handled in next_result
...@@ -3215,6 +3222,8 @@ int ha_ndbcluster::delete_row(const uchar *record) ...@@ -3215,6 +3222,8 @@ int ha_ndbcluster::delete_row(const uchar *record)
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
else if (thd->slave_thread) else if (thd->slave_thread)
op->setAnyValue(thd->server_id); op->setAnyValue(thd->server_id);
else if (!(thd->options & OPTION_BIN_LOG))
op->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING);
} }
} }
...@@ -3960,6 +3969,8 @@ int ha_ndbcluster::info(uint flag) ...@@ -3960,6 +3969,8 @@ int ha_ndbcluster::info(uint flag)
DBUG_PRINT("info", ("HA_STATUS_AUTO")); DBUG_PRINT("info", ("HA_STATUS_AUTO"));
if (m_table && table->found_next_number_field) if (m_table && table->found_next_number_field)
{ {
if ((my_errno= check_ndb_connection()))
DBUG_RETURN(my_errno);
Ndb *ndb= get_ndb(); Ndb *ndb= get_ndb();
Ndb_tuple_id_range_guard g(m_share); Ndb_tuple_id_range_guard g(m_share);
...@@ -8536,7 +8547,8 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p, ...@@ -8536,7 +8547,8 @@ ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
if (uses_blob_value() || if (uses_blob_value() ||
(cur_index_type == UNIQUE_INDEX && (cur_index_type == UNIQUE_INDEX &&
has_null_in_unique_index(active_index) && has_null_in_unique_index(active_index) &&
null_value_index_search(ranges, ranges+range_count, buffer))) null_value_index_search(ranges, ranges+range_count, buffer))
|| m_delete_cannot_batch || m_update_cannot_batch)
{ {
m_disable_multi_read= TRUE; m_disable_multi_read= TRUE;
DBUG_RETURN(handler::read_multi_range_first(found_range_p, DBUG_RETURN(handler::read_multi_range_first(found_range_p,
......
...@@ -114,6 +114,9 @@ NDB_SHARE *ndb_apply_status_share= 0; ...@@ -114,6 +114,9 @@ NDB_SHARE *ndb_apply_status_share= 0;
NDB_SHARE *ndb_schema_share= 0; NDB_SHARE *ndb_schema_share= 0;
pthread_mutex_t ndb_schema_share_mutex; pthread_mutex_t ndb_schema_share_mutex;
extern my_bool opt_log_slave_updates;
static my_bool g_ndb_log_slave_updates;
/* Schema object distribution handling */ /* Schema object distribution handling */
HASH ndb_schema_objects; HASH ndb_schema_objects;
typedef struct st_ndb_schema_object { typedef struct st_ndb_schema_object {
...@@ -3296,6 +3299,14 @@ ndb_binlog_thread_handle_data_event(Ndb *ndb, NdbEventOperation *pOp, ...@@ -3296,6 +3299,14 @@ ndb_binlog_thread_handle_data_event(Ndb *ndb, NdbEventOperation *pOp,
originating_server_id); originating_server_id);
return 0; return 0;
} }
else if (!g_ndb_log_slave_updates)
{
/*
This event comes from a slave applier since it has an originating
server id set. Since option to log slave updates is not set, skip it.
*/
return 0;
}
TABLE *table= share->table; TABLE *table= share->table;
DBUG_ASSERT(trans.good()); DBUG_ASSERT(trans.good());
...@@ -3942,6 +3953,8 @@ restart: ...@@ -3942,6 +3953,8 @@ restart:
! IS_NDB_BLOB_PREFIX(pOp->getEvent()->getTable()->getName())); ! IS_NDB_BLOB_PREFIX(pOp->getEvent()->getTable()->getName()));
DBUG_ASSERT(gci <= ndb_latest_received_binlog_epoch); DBUG_ASSERT(gci <= ndb_latest_received_binlog_epoch);
/* initialize some variables for this epoch */
g_ndb_log_slave_updates= opt_log_slave_updates;
i_ndb-> i_ndb->
setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip); setReportThreshEventGCISlip(ndb_report_thresh_binlog_epoch_slip);
i_ndb->setReportThreshEventFreeMem(ndb_report_thresh_binlog_mem_usage); i_ndb->setReportThreshEventFreeMem(ndb_report_thresh_binlog_mem_usage);
......
...@@ -75,7 +75,7 @@ int main(int argc, char** argv) ...@@ -75,7 +75,7 @@ int main(int argc, char** argv)
exit(-1); exit(-1);
} }
if (cluster_connection->wait_until_ready(30,0)) if (cluster_connection->wait_until_ready(30,0) < 0)
{ {
std::cout << "Cluster was not ready within 30 secs." << std::endl; std::cout << "Cluster was not ready within 30 secs." << std::endl;
exit(-1); exit(-1);
......
...@@ -169,7 +169,9 @@ use Class::MethodMaker [ ...@@ -169,7 +169,9 @@ use Class::MethodMaker [
vdm_versions vdm_versions
ddm_versions ) ], ddm_versions ) ],
scalar => [ qw( name scalar => [ qw( name
rows ) ], rows
schema
real_table_name) ],
hash => [ qw( columns hash => [ qw( columns
indexes indexes
indexed_columns indexed_columns
...@@ -198,6 +200,16 @@ use Class::MethodMaker [ ...@@ -198,6 +200,16 @@ use Class::MethodMaker [
scalar => [ { -default=> 4 },'align'], scalar => [ { -default=> 4 },'align'],
]; ];
sub table_name
{
my ($self) = @_;
if ($self->real_table_name) {
return $self->real_table_name;
}else {
return $self->name;
}
}
sub compute_row_size sub compute_row_size
{ {
my ($self, $releases) = @_; my ($self, $releases) = @_;
...@@ -391,14 +403,30 @@ sub compute_estimate ...@@ -391,14 +403,30 @@ sub compute_estimate
package main; package main;
my ($dbh,$database,$hostname,$user,$password,$help,$savequeries,$loadqueries,$debug,$format); my ($dbh,
$database,
$socket,
$hostname,
$user,
$password);
my ($help,
$savequeries,
$loadqueries,
$debug,
$format,
$excludetables,
$excludedbs);
GetOptions('database|d=s'=>\$database, GetOptions('database|d=s'=>\$database,
'hostname=s'=>\$hostname, 'hostname=s'=>\$hostname,
'socket=s'=>\$socket,
'user|u=s'=>\$user, 'user|u=s'=>\$user,
'password|p=s'=>\$password, 'password|p=s'=>\$password,
'savequeries|s=s'=>\$savequeries, 'savequeries|s=s'=>\$savequeries,
'loadqueries|l=s'=>\$loadqueries, 'loadqueries|l=s'=>\$loadqueries,
'excludetables=s'=>\$excludetables,
'excludedbs=s'=>\$excludedbs,
'help|usage|h!'=>\$help, 'help|usage|h!'=>\$help,
'debug'=>\$debug, 'debug'=>\$debug,
'format|f=s'=>\$format, 'format|f=s'=>\$format,
...@@ -406,32 +434,75 @@ GetOptions('database|d=s'=>\$database, ...@@ -406,32 +434,75 @@ GetOptions('database|d=s'=>\$database,
my $report= new MySQL::NDB::Size::Report; my $report= new MySQL::NDB::Size::Report;
if($help || !$database) if($help)
{ {
print STDERR "Usage:\n"; print STDERR "Usage:\n";
print STDERR "\tndb_size.pl --database=<db name> [--hostname=<host>]" print STDERR "\tndb_size.pl --database=<db name>|ALL [--hostname=<host>] "
."[--socket=<socket>] "
."[--user=<user>] [--password=<password>] [--help|-h] [--format=(html|text)] [--loadqueries=<file>] [--savequeries=<file>]\n\n"; ."[--user=<user>] [--password=<password>] [--help|-h] [--format=(html|text)] [--loadqueries=<file>] [--savequeries=<file>]\n\n";
print STDERR "\t--database=<db name> ALL may be specified to examine all "
."databases\n";
print STDERR "\t--hostname=<host>:<port> can be used to designate a " print STDERR "\t--hostname=<host>:<port> can be used to designate a "
."specific port\n"; ."specific port\n";
print STDERR "\t--hostname defaults to localhost\n"; print STDERR "\t--hostname defaults to localhost\n";
print STDERR "\t--user and --password default to empty string\n"; print STDERR "\t--user and --password default to empty string\n";
print STDERR "\t--format=(html|text) Output format\n"; print STDERR "\t--format=(html|text) Output format\n";
print STDERR "\t--excludetables Comma separated list of table names to skip\n";
print STDERR "\t--excludedbs Comma separated list of database names to skip\n";
print STDERR "\t--savequeries=<file> saves all queries to the DB into <file>\n"; print STDERR "\t--savequeries=<file> saves all queries to the DB into <file>\n";
print STDERR "\t--loadqueries=<file> loads query results from <file>. Doesn't connect to DB.\n"; print STDERR "\t--loadqueries=<file> loads query results from <file>. Doesn't connect to DB.\n";
exit(1); exit(1);
} }
$hostname= 'localhost' unless $hostname; $hostname= 'localhost' unless $hostname;
my %queries; # used for loadqueries/savequeries my %queries; # used for loadqueries/savequeries
if(!$loadqueries) if(!$loadqueries)
{ {
my $dsn = "DBI:mysql:database=$database;host=$hostname"; my $dsn = "DBI:mysql:host=$hostname";
$dsn.= ";mysql_socket=$socket" if ($socket);
$dbh= DBI->connect($dsn, $user, $password) or exit(1); $dbh= DBI->connect($dsn, $user, $password) or exit(1);
$report->database($database);
$report->dsn($dsn); $report->dsn($dsn);
} }
my @dbs;
if ($database && !($database =~ /^ALL$/i))
{
@dbs = split(',', $database);
}
else
{
# Do all databases
@dbs = map { $_->[0] } @{ $dbh->selectall_arrayref("show databases") };
}
my %withdb = map {$_ => 1} @dbs;
foreach (split ",", $excludedbs || '')
{
delete $withdb{$_};
}
delete $withdb{'mysql'};
delete $withdb{'INFORMATION_SCHEMA'};
delete $withdb{'information_schema'};
my $dblist = join (',', map { $dbh->quote($_) } keys %withdb );
$excludetables = join (',', map { $dbh->quote($_) } split ',', $excludetables )
if $excludetables;
if(!$loadqueries)
{
if (scalar(keys %withdb)>1)
{
$report->database("databases: $dblist");
}
else
{
$report->database("database: $dblist");
}
}
else else
{ {
open Q,"< $loadqueries"; open Q,"< $loadqueries";
...@@ -441,7 +512,6 @@ else ...@@ -441,7 +512,6 @@ else
%queries= %$e; %queries= %$e;
close Q; close Q;
$report->database("file:$loadqueries"); $report->database("file:$loadqueries");
$report->dsn("file:$loadqueries");
} }
$report->versions('4.1','5.0','5.1'); $report->versions('4.1','5.0','5.1');
...@@ -454,7 +524,25 @@ if($loadqueries) ...@@ -454,7 +524,25 @@ if($loadqueries)
} }
else else
{ {
$tables= $dbh->selectall_arrayref("show tables"); my $sql= "select t.TABLE_NAME,t.TABLE_SCHEMA " .
" from information_schema.TABLES t " .
" where t.TABLE_SCHEMA in ( $dblist ) ";
$sql.=" and t.TABLE_NAME not in " .
" ( $excludetables )"
if ($excludetables);
$tables= $dbh->selectall_arrayref($sql);
if (!$tables) {
print "WARNING: problem selecing from INFORMATION SCHEMA ($sql)\n";
if ($#dbs>0) {
print "\t attempting to fallback to show tables from $database";
$tables= $dbh->selectall_arrayref("show tables from $database\n");
} else {
print "All Databases not supported in 4.1. Please specify --database=\n";
}
}
$queries{"show tables"}= $tables; $queries{"show tables"}= $tables;
} }
...@@ -510,6 +598,8 @@ sub do_table { ...@@ -510,6 +598,8 @@ sub do_table {
{$col->dm(4)} {$col->dm(4)}
elsif($type =~ /float/) elsif($type =~ /float/)
{ {
my @sz= split ',', $size;
$size= $sz[0]+$sz[1];
if(!defined($size) || $size<=24) if(!defined($size) || $size<=24)
{$col->dm(4)} {$col->dm(4)}
else else
...@@ -543,9 +633,10 @@ sub do_table { ...@@ -543,9 +633,10 @@ sub do_table {
$col->dm($fixed); $col->dm($fixed);
if(!$col->Key()) # currently keys must be non varsized if(!$col->Key()) # currently keys must be non varsized
{ {
my $sql= "select avg(length(`" my $sql= sprintf("select avg(length(`%s`)) " .
.$colname " from `%s`.`%s` " ,
."`)) from `".$t->name().'`'; $colname, $t->schema(), $t->table_name());
my @dynamic; my @dynamic;
if($loadqueries) if($loadqueries)
{ {
...@@ -573,9 +664,11 @@ sub do_table { ...@@ -573,9 +664,11 @@ sub do_table {
$blobhunk= 8000 if $type=~ /longblob/; $blobhunk= 8000 if $type=~ /longblob/;
$blobhunk= 4000 if $type=~ /mediumblob/; $blobhunk= 4000 if $type=~ /mediumblob/;
my $sql= "select SUM(CEILING(". my $sql= sprintf("select SUM(CEILING(length(`%s`)/%s)) " .
"length(`$colname`)/$blobhunk))" " from `%s`.`%s`" ,
."from `".$t->name."`"; $colname, $blobhunk,
$t->schema(), $t->table_name() );
my @blobsize; my @blobsize;
if($loadqueries) if($loadqueries)
{ {
...@@ -589,11 +682,12 @@ sub do_table { ...@@ -589,11 +682,12 @@ sub do_table {
$blobsize[0]=0 if !defined($blobsize[0]); $blobsize[0]=0 if !defined($blobsize[0]);
# Is a supporting table, add it to the lists: # Is a supporting table, add it to the lists:
$report->supporting_tables_set($t->name()."\$BLOB_$colname" => 1); $report->supporting_tables_set($t->schema().".".$t->name()."\$BLOB_$colname" => 1);
$t->supporting_tables_push($t->name()."\$BLOB_$colname"); $t->supporting_tables_push($t->schema().".".$t->name()."\$BLOB_$colname");
my $st= new MySQL::NDB::Size::Table(name => my $st= new MySQL::NDB::Size::Table(name =>
$t->name()."\$BLOB_$colname", $t->name()."\$BLOB_$colname",
schema => $t->schema(),
rows => $blobsize[0], rows => $blobsize[0],
row_dm_overhead => row_dm_overhead =>
{ '4.1' => 12, { '4.1' => 12,
...@@ -632,7 +726,9 @@ sub do_table { ...@@ -632,7 +726,9 @@ sub do_table {
$col->size($size); $col->size($size);
$t->columns_set( $colname => $col ); $t->columns_set( $colname => $col );
} }
$report->tables_set( $t->name => $t ); #print "setting tables: ",$t->schema(), $t->table_name(), $t->name, $t->real_table_name || "" , "\n";
# Use $t->name here instead of $t->table_name() to avoid namespace conflicts
$report->tables_set( $t->schema().".".$t->name() => $t );
# And now... the IndexMemory usage. # And now... the IndexMemory usage.
# #
...@@ -727,14 +823,16 @@ sub do_table { ...@@ -727,14 +823,16 @@ sub do_table {
# Is a supporting table, add it to the lists: # Is a supporting table, add it to the lists:
my $idxname= $t->name().'_'.join('_',@{$indexes{$index}{columns}}). my $idxname= $t->name().'_'.join('_',@{$indexes{$index}{columns}}).
"\$unique"; "\$unique";
$report->supporting_tables_set($idxname => 1); $report->supporting_tables_set($t->schema().".".$idxname => 1);
$t->supporting_tables_push($idxname); $t->supporting_tables_push($t->schema().".".$idxname);
$t->indexed_columns_set($_ => 1) $t->indexed_columns_set($_ => 1)
foreach @{$indexes{$index}{columns}}; foreach @{$indexes{$index}{columns}};
my $st= new MySQL::NDB::Size::Table(name => $idxname, my $st= new MySQL::NDB::Size::Table(name => $idxname,
real_table_name => $t->table_name(),
rows => $count[0], rows => $count[0],
schema => $t->schema(),
row_dm_overhead => row_dm_overhead =>
{ '4.1' => 12, { '4.1' => 12,
'5.0' => 12, '5.0' => 12,
...@@ -745,7 +843,6 @@ sub do_table { ...@@ -745,7 +843,6 @@ sub do_table {
row_ddm_overhead => row_ddm_overhead =>
{ '5.1' => 8 }, { '5.1' => 8 },
); );
do_table($st, do_table($st,
\%idxcols, \%idxcols,
{ {
...@@ -766,9 +863,10 @@ sub do_table { ...@@ -766,9 +863,10 @@ sub do_table {
foreach(@{$tables}) foreach(@{$tables})
{ {
my $table= @{$_}[0]; my $table= @{$_}[0];
my $schema = @{$_}[1] || $database;
my $info; my $info;
{ {
my $sql= 'describe `'.$table.'`'; my $sql= 'describe `'.$schema.'`.`'.$table.'`';
if($loadqueries) if($loadqueries)
{ {
$info= $queries{$sql}; $info= $queries{$sql};
...@@ -781,7 +879,7 @@ foreach(@{$tables}) ...@@ -781,7 +879,7 @@ foreach(@{$tables})
} }
my @count; my @count;
{ {
my $sql= 'select count(*) from `'.$table.'`'; my $sql= 'select count(*) from `'.$schema.'`.`'.$table.'`';
if($loadqueries) if($loadqueries)
{ {
@count= @{$queries{$sql}}; @count= @{$queries{$sql}};
...@@ -797,7 +895,7 @@ foreach(@{$tables}) ...@@ -797,7 +895,7 @@ foreach(@{$tables})
{ {
my @show_indexes; my @show_indexes;
{ {
my $sql= "show index from `".$table.'`'; my $sql= "show index from `".$schema.'`.`'.$table.'`';
if($loadqueries) if($loadqueries)
{ {
@show_indexes= @{$queries{$sql}}; @show_indexes= @{$queries{$sql}};
...@@ -826,6 +924,7 @@ foreach(@{$tables}) ...@@ -826,6 +924,7 @@ foreach(@{$tables})
} }
} }
my $t= new MySQL::NDB::Size::Table(name => $table, my $t= new MySQL::NDB::Size::Table(name => $table,
schema => $schema,
rows => $count[0], rows => $count[0],
row_dm_overhead => row_dm_overhead =>
{ '4.1' => 12, { '4.1' => 12,
...@@ -974,6 +1073,8 @@ if($debug) ...@@ -974,6 +1073,8 @@ if($debug)
eval 'print STDERR Dumper($report)'; eval 'print STDERR Dumper($report)';
} }
$format= "text" unless $format;
if($format eq 'text') if($format eq 'text')
{ {
my $text_out= new MySQL::NDB::Size::Output::Text($report); my $text_out= new MySQL::NDB::Size::Output::Text($report);
...@@ -984,12 +1085,6 @@ elsif($format eq 'html') ...@@ -984,12 +1085,6 @@ elsif($format eq 'html')
my $html_out= new MySQL::NDB::Size::Output::HTML($report); my $html_out= new MySQL::NDB::Size::Output::HTML($report);
$html_out->output(); $html_out->output();
} }
else
{
# default to text output
my $text_out= new MySQL::NDB::Size::Output::Text($report);
$text_out->output();
}
package MySQL::NDB::Size::Output::Text; package MySQL::NDB::Size::Output::Text;
use Data::Dumper; use Data::Dumper;
...@@ -1008,7 +1103,7 @@ sub output ...@@ -1008,7 +1103,7 @@ sub output
my $self= shift; my $self= shift;
my $r= $self->{report}; my $r= $self->{report};
print $self->ul("ndb_size.pl report for database ". $r->database(). print $self->ul("ndb_size.pl report for ". $r->database().
" (".(($r->tables_count()||0)-($r->supporting_tables_count()||0)). " (".(($r->tables_count()||0)-($r->supporting_tables_count()||0)).
" tables)"); " tables)");
...@@ -1188,8 +1283,8 @@ sub output ...@@ -1188,8 +1283,8 @@ sub output
my $st= $r->tables->{$_}; my $st= $r->tables->{$_};
foreach(@{$st->indexes_keys()}) foreach(@{$st->indexes_keys()})
{ {
printf $f, $st->name() if $_ eq 'PRIMARY'; printf $f, $st->schema().".".$st->name() if $_ eq 'PRIMARY';
printf $f, $st->name().$_ if $_ ne 'PRIMARY'; printf $f, $st->schema().".".$st->name().$_ if $_ ne 'PRIMARY';
my $sti= $st->indexes->{$_}; my $sti= $st->indexes->{$_};
printf $v, ($sti->ver_im_exists($_)) printf $v, ($sti->ver_im_exists($_))
?$sti->ver_im->{$_} ?$sti->ver_im->{$_}
...@@ -1367,7 +1462,7 @@ print <<ENDHTML; ...@@ -1367,7 +1462,7 @@ print <<ENDHTML;
<body> <body>
ENDHTML ENDHTML
print $self->h1("ndb_size.pl report for database ". $r->database(). print $self->h1("ndb_size.pl report for ". $r->database().
" (".(($r->tables_count()||0)-($r->supporting_tables_count()||0)). " (".(($r->tables_count()||0)-($r->supporting_tables_count()||0)).
" tables)"); " tables)");
...@@ -1579,8 +1674,8 @@ ENDHTML ...@@ -1579,8 +1674,8 @@ ENDHTML
foreach(@{$st->indexes_keys()}) foreach(@{$st->indexes_keys()})
{ {
my @r; my @r;
push @r, $st->name() if $_ eq 'PRIMARY'; push @r, $st->schema().".".$st->name() if $_ eq 'PRIMARY';
push @r, $st->name().$_ if $_ ne 'PRIMARY'; push @r, $st->schema().".".$st->name().$_ if $_ ne 'PRIMARY';
my $sti= $st->indexes->{$_}; my $sti= $st->indexes->{$_};
push @r, ($sti->ver_im_exists($_)) push @r, ($sti->ver_im_exists($_))
?$sti->ver_im->{$_} ?$sti->ver_im->{$_}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment